// // Initialize GLUT & OpenSG and set up the scene // int main(int argc, char **argv) { // OSG init OSG::osgInit(argc,argv); // GLUT init int winid = setupGLUT(&argc, argv); // open a new scope, because the pointers below should go out of scope // before entering glutMainLoop. // Otherwise OpenSG will complain about objects being alive after shutdown. { // the connection between GLUT and OpenSG OSG::GLUTWindowRefPtr gwin = OSG::GLUTWindow::create(); gwin->setGlutId(winid); gwin->init(); // create the SimpleSceneManager helper mgr = OSG::SimpleSceneManager::create(); mgr->setWindow(gwin); // create a pretty simple graph: a Group with two Transforms as children, // each of which carries a single Geometry. // The scene OSG::NodeRefPtr scene = OSG::Node::create(); // The cylinder and its transformation OSG::NodeRefPtr cyl = OSG::Node::create(); OSG::GeometryRefPtr cylgeo = OSG::makeCylinderGeo( 1.4f, .3f, 24, true, true, true ); cyl->setCore(cylgeo); cyltrans = OSG::Transform::create(); OSG::NodeRefPtr cyltransnode = OSG::Node::create(); cyltransnode->setCore (cyltrans); cyltransnode->addChild(cyl ); // add it to the scene scene->addChild(cyltransnode); // The torus and its transformation OSG::NodeRefPtr torus = OSG::Node::create(); OSG::GeometryRefPtr torusgeo = OSG::makeTorusGeo( .2f, 1, 24, 36 ); torus->setCore(torusgeo); tortrans = OSG::Transform::create(); OSG::NodeRefPtr tortransnode = OSG::Node::create(); tortransnode->setCore (tortrans); tortransnode->addChild(torus ); // add it to the scene scene->addChild(tortransnode); // // create the shader program // OSG::ShaderProgramChunkRefPtr prog_chunk = OSG::ShaderProgramChunk::create(); OSG::ShaderProgramRefPtr vertShader = OSG::ShaderProgram::createVertexShader(); OSG::ShaderProgramRefPtr fragShader = OSG::ShaderProgram::createFragmentShader(); vertShader->setProgram(get_vp_program()); fragShader->setProgram(get_fp_program()); // // binding the unifrom block to a buffer binding point can be performed // either by calling the shaders's addUniformBlock method or by // adding a 'uniform block' variable to a ShaderProgramVariableChunk. // In the following we use both variants for illustration. // fragShader->addUniformBlock("Materials", 1); // block binding point fragShader->addUniformBlock("Lights", 2); // block binding point // // The following is replaced by adding ShaderProgramVariableChunk objects // to the chunk material. See below... // // fragShader->addUniformBlock("GeomState", 3); // block binding point prog_chunk->addShader(vertShader); prog_chunk->addShader(fragShader); // // create uniform buffer objects and corresponding materials // OSG::UniformBufferObjChunkRefPtr ubo_material_database = create_material_database_state(materials); ubo_light_state = create_light_state(lights); OSG::PolygonChunkRefPtr polygon_chunk = OSG::PolygonChunk::create(); polygon_chunk->setFrontMode(GL_FILL); polygon_chunk->setBackMode(GL_FILL); polygon_chunk->setCullFace(GL_NONE); OSG::DepthChunkRefPtr depth_chunk = OSG::DepthChunk::create(); depth_chunk->setEnable(true); OSG::ChunkMaterialRefPtr prog_state = OSG::ChunkMaterial::create(); prog_state->addChunk(ubo_material_database, 1); // buffer binding point 1 prog_state->addChunk(ubo_light_state, 2); // buffer binding point 2 prog_state->addChunk(prog_chunk); prog_state->addChunk(polygon_chunk); prog_state->addChunk(depth_chunk); OSG::ShaderProgramVariableChunkRefPtr shader_var_chunk = OSG::ShaderProgramVariableChunk::create(); shader_var_chunk->addUniformBlock("GeomState", 3); GeomState geom1; geom1.material_index = dist(generator); OSG::ChunkMaterialRefPtr geom1_state = OSG::ChunkMaterial::create(); ubo_geom_state_1 = create_geometry_material_state(geom1); geom1_state->addChunk(ubo_geom_state_1, 3); // buffer binding point 3 geom1_state->addChunk(shader_var_chunk); // block binding point GeomState geom2; geom2.material_index = dist(generator); OSG::ChunkMaterialRefPtr geom2_state = OSG::ChunkMaterial::create(); ubo_geom_state_2 = create_geometry_material_state(geom2); geom2_state->addChunk(ubo_geom_state_2, 3); // buffer binding point 3 geom1_state->addChunk(shader_var_chunk); // block binding point cylgeo ->setMaterial(geom1_state); torusgeo->setMaterial(geom2_state); OSG::MaterialChunkOverrideGroupRefPtr mgrp = OSG::MaterialChunkOverrideGroup::create(); mgrp->setMaterial(prog_state); scene->setCore(mgrp); OSG::commitChanges(); mgr->setRoot(scene); // show the whole scene mgr->showAll(); } // GLUT main loop glutMainLoop(); return 0; }
// // Initialize GLUT & OpenSG and set up the scene // int main(int argc, char **argv) { // OSG init OSG::osgInit(argc,argv); // GLUT init int winid = setupGLUT(&argc, argv); // open a new scope, because the pointers below should go out of scope // before entering glutMainLoop. // Otherwise OpenSG will complain about objects being alive after shutdown. { // the connection between GLUT and OpenSG OSG::GLUTWindowRefPtr gwin = OSG::GLUTWindow::create(); gwin->setGlutId(winid); gwin->init(); // create the SimpleSceneManager helper mgr = OSG::SimpleSceneManager::create(); mgr->setWindow(gwin); // create a pretty simple graph: a Group with two Transforms as children, // each of which carries a single Geometry. // The scene OSG::NodeRefPtr scene = OSG::Node::create(); // The cylinder and its transformation OSG::NodeRefPtr cyl = OSG::Node::create(); OSG::GeometryRefPtr cylgeo = OSG::makeCylinderGeo( 1.4f, .3f, 24, true, true, true ); cyl->setCore(cylgeo); cyltrans = OSG::Transform::create(); OSG::NodeRefPtr cyltransnode = OSG::Node::create(); cyltransnode->setCore (cyltrans); cyltransnode->addChild(cyl ); // add it to the scene scene->addChild(cyltransnode); // The torus and its transformation OSG::NodeRefPtr torus = OSG::Node::create(); OSG::GeometryRefPtr torusgeo = OSG::makeTorusGeo( .2f, 1, 24, 36 ); torus->setCore(torusgeo); tortrans = OSG::Transform::create(); OSG::NodeRefPtr tortransnode = OSG::Node::create(); tortransnode->setCore (tortrans); tortransnode->addChild(torus ); // add it to the scene scene->addChild(tortransnode); // // create the shader program // OSG::ShaderProgramChunkRefPtr prog_chunk = OSG::ShaderProgramChunk::create(); OSG::ShaderProgramRefPtr vertShader = OSG::ShaderProgram::createVertexShader(); OSG::ShaderProgramRefPtr fragShader = OSG::ShaderProgram::createFragmentShader(); vertShader->setProgram(get_vp_program()); fragShader->setProgram(get_fp_program()); // // binding the shader storage block to a buffer binding point can be performed // either by calling the shaders's addShaderStorageBlock method or by // adding a 'buffer block' variable to a ShaderProgramVariableChunk. // In the following we use both variants for illustration. // fragShader->addShaderStorageBlock("ExampleBlock", 1); // block binding point prog_chunk->addShader(vertShader); prog_chunk->addShader(fragShader); // // create shader storage buffer object for block 'ExampleBlock' // OSG::MultiPropertySSBOChunkRefPtr ssbo_example_block = create_example_block_state(); OSG::PolygonChunkRefPtr polygon_chunk = OSG::PolygonChunk::create(); polygon_chunk->setFrontMode(GL_FILL); polygon_chunk->setBackMode(GL_FILL); polygon_chunk->setCullFace(GL_NONE); OSG::DepthChunkRefPtr depth_chunk = OSG::DepthChunk::create(); depth_chunk->setEnable(true); OSG::ChunkMaterialRefPtr prog_state = OSG::ChunkMaterial::create(); prog_state->addChunk(ssbo_example_block, 1); // buffer binding point 1 prog_state->addChunk(prog_chunk); prog_state->addChunk(polygon_chunk); prog_state->addChunk(depth_chunk); OSG::MaterialChunkOverrideGroupRefPtr mgrp = OSG::MaterialChunkOverrideGroup::create(); mgrp->setMaterial(prog_state); scene->setCore(mgrp); OSG::commitChanges(); mgr->setRoot(scene); // show the whole scene mgr->showAll(); } // GLUT main loop glutMainLoop(); return 0; }