void Demo::create_arcball() { auto blinn_phong_program = programs.create(BLINNPHONG_VS, BLINNPHONG_FS); auto shaded_pass = std::make_shared<gst::ShadedPass>(blinn_phong_program); shaded_pass->set_cull_face(gst::CullFace::BACK); shaded_pass->set_depth_test(true); auto material = gst::Material::create_struct("material"); material.get_uniform("ambient") = glm::vec3(1.2f); material.get_uniform("diffuse") = glm::vec3(0.8f); material.get_uniform("specular") = glm::vec3(1.0f); material.get_uniform("emission") = glm::vec3(0.0f); material.get_uniform("shininess") = 21.0f; gst::MeshFactory mesh_factory(logger); auto suzanne = std::make_shared<gst::GroupNode>(); for (auto mesh : mesh_factory.create_from_file(SUZANNE_OBJ)) { auto model = gst::Model(mesh, material, shaded_pass); auto model_node = std::make_shared<gst::ModelNode>(model); suzanne->add(model_node); } scene.add(suzanne); arcball = Arcball(suzanne); arcball.set_allow_constraints(true); arcball_helper = ArcballHelper::create(programs); arcball_helper.set_show_result(false); }
/// create subdivided mesh umdraw::UMMeshPtr create_subdivided_mesh(unsigned int level) { if (!mesh_) return umdraw::UMMeshPtr(); if (level == 0) return umdraw::UMMeshPtr(); // find from cache if (divided_mesh_) { if (umdraw::UMMeshPtr result_mesh = create_result_mesh(divided_mesh_, level)) { return result_mesh; } } // initialize base mesh if (!base_mesh_) { if (!init_base_mesh()) { return umdraw::UMMeshPtr(); } } // get divided mesh const int max_level = level; OpenSubdiv::FarMeshFactory<UMSubdivVertex> mesh_factory(&(*base_mesh_), max_level); divided_mesh_ = mesh_factory.Create(); if (divided_mesh_) { if (umdraw::UMMeshPtr result_mesh = create_result_mesh(divided_mesh_, level)) { return result_mesh; } } return umdraw::UMMeshPtr(); }