void StockShapeRenderer::InitializeGL() { Scene::Ptr scene = GetScene(); ResourceManager::Ptr resources = GetResources(); GroupNode* base_node = GetBaseNode(); // Create a material to share among several shapes StockResources stock(resources); material_ = stock.NewMaterial(StockResources::kUniformColorLighting); material_->SetParam(sv::kDiffuse, 1.0, 0.5, 0.5, 1.0); material_->SetParam(sv::kSpecular, 1.0, 0.5, 0.5, 1.0); material_->SetParam(sv::kShininess, 10.0f); // Create a material to use for the selected shape select_material_ = stock.NewMaterial(StockResources::kUniformColorLighting); select_material_->SetParam(sv::kDiffuse, 1.0, 0.0, 1.0, 1.0); select_material_->SetParam(sv::kSpecular, 1.0, 0.0, 0.1, 1.0); select_material_->SetParam(sv::kShininess, 16.0f); // Create a bunch of shapes shapes_.push_back(scene->MakeDrawNode(base_node, stock.Cone(), material_)); shapes_.push_back(scene->MakeDrawNode(base_node, stock.Cube(), material_)); shapes_.push_back(scene->MakeDrawNode(base_node, stock.Cylinder(), material_)); shapes_.push_back(scene->MakeDrawNode(base_node, stock.Sphere(), material_)); DrawNode* axes = scene->MakeDrawNode(base_node); axes->Add(stock.UnitAxes()); shapes_.push_back(axes); // Move the shapes so they're not all on top of each other. // // Also set the selection mask for each node so that they can be selected by // StockShapeSelector const double spacing = 2.0; const double x_start = - spacing * shapes_.size() / 2; for (size_t i = 0; i < shapes_.size(); ++i) { shapes_[i]->SetTranslation(x_start + i * spacing, 0, 0); shapes_[i]->SetSelectionMask(1); } }
void GroupNode::CopyAsChildren(Scene* scene, GroupNode* root) { const std::vector<SceneNode*>& tocopy_children = root->Children(); std::deque<SceneNode*> to_process(tocopy_children.begin(), tocopy_children.end()); SetTranslation(root->Translation()); SetRotation(root->Rotation()); SetScale(root->Scale()); SetVisible(root->Visible()); while (!to_process.empty()) { SceneNode* to_copy = to_process.front(); to_process.pop_front(); SceneNode* node_copy = nullptr; switch (to_copy->NodeType()) { case SceneNodeType::kGroupNode: { GroupNode* child = scene->MakeGroup(this, Scene::kAutoName); GroupNode* group_to_copy = dynamic_cast<GroupNode*>(to_copy); child->CopyAsChildren(scene, group_to_copy); node_copy = child; } break; case SceneNodeType::kCameraNode: { CameraNode* child = scene->MakeCamera(this, Scene::kAutoName); const CameraNode* camera_to_copy = dynamic_cast<const CameraNode*>(to_copy); child->CopyFrom(*camera_to_copy); node_copy = child; } break; case SceneNodeType::kLightNode: { LightNode* child = scene->MakeLight(this, Scene::kAutoName); const LightNode* light_to_copy = dynamic_cast<const LightNode*>(to_copy); // *child = *light_to_copy; (void)light_to_copy; node_copy = child; } break; case SceneNodeType::kDrawNode: { DrawNode* node_to_copy = dynamic_cast<DrawNode*>(to_copy); DrawNode* child = scene->MakeDrawNode(this, Scene::kAutoName); for (const Drawable::Ptr& item : node_to_copy->Drawables()) { child->Add(item); } node_copy = child; } break; } node_copy->SetTranslation(to_copy->Translation()); node_copy->SetRotation(to_copy->Rotation()); node_copy->SetScale(to_copy->Scale()); node_copy->SetVisible(to_copy->Visible()); } }