// Initialize GLUT & OpenSG and set up the scene int doMain(int argc, char **argv) { // OSG init OSG::osgInit(argc,argv); // GLUT init int winid = setupGLUT(&argc, argv); // the connection between GLUT and OpenSG OSG::GLUTWindowUnrecPtr gwin = OSG::GLUTWindow::create(); gwin->setGlutId(winid); gwin->setSize( 800, 800 ); gwin->init(); // create root node _scene = OSG::makeCoredNode<OSG::Group>(); OSG::GeometryUnrecPtr geo = OSG::makeBoxGeo(0.5, 0.5, 0.5, 1, 1, 1); // share the chunk OSG::SimpleSHLChunkUnrecPtr shl = OSG::SimpleSHLChunk::create(); shl->setVertexProgram(_vp_program); shl->setFragmentProgram(_fp_program); // These parameters are the same for all geometries so we // keep them in here. shl->addUniformVariable("Scale", OSG::Vec2f(20.0f, 20.0f)); shl->addUniformVariable("Threshold", OSG::Vec2f(0.7f, 0.7f)); OSG::Int32 size = 4; // start color OSG::Vec3f sc(0.0, 0.0, 0.0); // end color OSG::Vec3f ec(1.0, 1.0, 1.0); OSG::Real32 sr = (ec[0] - sc[0]) / OSG::Real32((size*2)); OSG::Real32 sg = (ec[1] - sc[1]) / OSG::Real32((size*2)); OSG::Real32 sb = (ec[2] - sc[2]) / OSG::Real32((size*2)); OSG::Vec3f color(sc); OSG::Int32 x = - size; OSG::Int32 y = - size; OSG::Int32 z = - size; OSG::UInt32 iterations = size*2 * size*2 * size*2; printf("Creating %u cubes ...\n", iterations); for(OSG::UInt32 i=0; i<iterations; ++i) { OSG::ChunkMaterialUnrecPtr cmat = OSG::ChunkMaterial::create(); // ok use one SHLChunk and n SHLParameterChunks // Assing a different "SurfaceColor" parameter to each geometry. OSG::SimpleSHLVariableChunkUnrecPtr shlparameter = OSG::SimpleSHLVariableChunk::create(); // shlparameter->setSHLChunk(shl); shlparameter->addUniformVariable("SurfaceColor", color); _shlparameter = shlparameter; cmat->addChunk(shl); cmat->addChunk(shlparameter); OSG::TransformUnrecPtr trans; OSG::NodeUnrecPtr trans_node = OSG::makeCoredNode<OSG::Transform>(&trans); trans->editMatrix().setTranslate(OSG::Real32(x), OSG::Real32(y), OSG::Real32(z)); OSG::MaterialGroupUnrecPtr mg; OSG::NodeUnrecPtr mg_node = OSG::makeCoredNode<OSG::MaterialGroup>(&mg); mg->setMaterial(cmat); OSG::NodeUnrecPtr geonode = OSG::Node::create(); geonode->setCore(geo); mg_node->addChild(geonode); trans_node->addChild(mg_node); // add to scene _scene->addChild(trans_node); // ---- ++x; color[0] += sr; if(x == size) { x = - size; ++y; color[0] = sc[0]; color[1] += sg; if(y == size) { y = - size; ++z; color[1] = sc[1]; color[2] += sb; } } } // create the SimpleSceneManager helper _mgr = OSG::SimpleSceneManager::create(); // tell the manager what to manage _mgr->setWindow(gwin ); _mgr->setRoot(_scene); // show the whole scene _mgr->showAll(); // create a gradient background. OSG::GradientBackgroundUnrecPtr gback = OSG::GradientBackground::create(); gback->clearLines(); gback->addLine(OSG::Color3f(0.7f, 0.7f, 0.8f), 0); gback->addLine(OSG::Color3f(0.0f, 0.1f, 0.3f), 1); OSG::Window *win = _mgr->getWindow(); for(unsigned int i=0; i<win->getMFPort()->size(); ++i) { OSG::Viewport *vp = win->getPort(i); vp->setBackground(gback); } return 0; }
// Initialize GLUT & OpenSG and set up the scene int doMain(int argc, char **argv) { // OSG init OSG::osgInit(argc, argv); // GLUT init glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE); int winid = glutCreateWindow("OpenSG CGFX Shader"); // the connection between GLUT and OpenSG _gwin = OSG::GLUTWindow::create(); _gwin->setGlutId(winid); _gwin->setSize( 800, 800 ); _gwin->init(); // init callbacks glutSetWindow(winid); glutReshapeFunc(reshape); glutDisplayFunc(display); glutIdleFunc(display); glutMouseFunc(mouse); glutMotionFunc(motion); glutKeyboardFunc(keyboard); const char *effectFile = "blinn_bump_reflect.vinstruct.cgfx"; if(argc > 1) { effectFile = argv[1]; } _cgfxmat = OSG::CgFXMaterial::create(); _cgfxmat->setEffectFile(effectFile); // this multipass technique leads to a render bug, // I have no idea what's wrong :-( //_cgfxmat->setTechnique(1); OSG::ChunkMaterialUnrecPtr mat2 = OSG::ChunkMaterial::create(); OSG::MaterialChunkUnrecPtr matc = OSG::MaterialChunk::create(); matc->setDiffuse(OSG::Color4f(1, 0, 0, 1)); mat2->addChunk(matc); //mat2->addChunk(texc); // create root node _scene = OSG::Node::create(); OSG::GeometryUnrecPtr geo1 = OSG::makeLatLongSphereGeo(50, 50, 2.0f); OSG::calcVertexTangents(geo1, 0, OSG::Geometry::TexCoords6Index, OSG::Geometry::TexCoords7Index); geo1->setMaterial(_cgfxmat); OSG::NodeUnrecPtr sphere1 = OSG::Node::create(); sphere1->setCore(geo1); OSG::TransformUnrecPtr trans1 = OSG::Transform::create(); trans1->editMatrix().setTranslate(-2 , 0, 0); OSG::NodeUnrecPtr transn1 = OSG::Node::create(); transn1->setCore(trans1); transn1->addChild(sphere1); // OSG::GeometryUnrecPtr geo2 = OSG::makeLatLongSphereGeo(50, 50, 1.0f); geo2->setMaterial(mat2); OSG::NodeUnrecPtr sphere2 = OSG::Node::create(); sphere2->setCore(geo2); OSG::TransformUnrecPtr trans2 = OSG::Transform::create(); trans2->editMatrix().setTranslate(2 , 0, 0); OSG::NodeUnrecPtr transn2 = OSG::Node::create(); transn2->setCore(trans2); transn2->addChild(sphere2); _scene->setCore (OSG::Group::create()); _scene->addChild(transn1 ); _scene->addChild(transn2 ); // create the SimpleSceneManager _mgr = new OSG::SimpleSceneManager; // tell the manager what to manage _mgr->setWindow(_gwin); _mgr->setRoot(_scene); // show the whole scene _mgr->showAll(); // create a gradient background. OSG::GradientBackgroundUnrecPtr gback = OSG::GradientBackground::create(); gback->clearLines(); gback->addLine(OSG::Color3f(0.7, 0.7, 0.8), 0); gback->addLine(OSG::Color3f(0.0, 0.1, 0.3), 1); OSG::Window *win = _mgr->getWindow(); for(OSG::UInt32 i = 0; i < win->getMFPort()->size(); ++i) { OSG::Viewport *vp = win->getPort(i); vp->setBackground(gback); } return 0; }