// react to keys void keyboard(unsigned char k, int x, int y) { switch(k) { case 27: { _mgr = NULL; _client_win = NULL; _cluster_win = NULL; _root = NULL; OSG::osgExit(); exit(0); } case 'n': while(_root->getNChildren() > 0) _root->subChild(_root->getChild(0)); glutPostRedisplay(); break; case 'l': { OSG::NodeUnrecPtr scene = OSG::SceneFileHandler::the()->read("tie.wrl", NULL); if(scene != NULL) { _root->addChild(scene); _mgr->showAll(); glutPostRedisplay(); } } break; case 't': { OSG::NodeUnrecPtr scene = OSG::makeTorus(.5, 2, 16, 16); _root->addChild(scene); _mgr->showAll(); glutPostRedisplay(); } break; case 'c': connectCluster(); break; case 'd': disconnectCluster(); break; } }
// 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); // the connection between GLUT and OpenSG g_win= OSG::GLUTWindow::create(); g_win->setGlutId(winid); g_win->init(); g_scene = createScene(); // create the SimpleSceneManager helper g_mgr = OSG::SimpleSceneManager::create(); g_mgr->setUseTraversalAction(true); // tell the manager what to manage g_mgr->setWindow(g_win ); g_mgr->setRoot (g_scene); // add LabelForeground!!! g_labelForeground = OSG::LabelForeground::create(); g_mgr->addForeground(g_labelForeground); // show the whole scene g_mgr->showAll(); // GLUT main loop glutMainLoop(); return 0; }
// Initialize GLUT & OpenSG and set up the scene int doMain(int argc, char **argv) { std::cout << "start a cluster server with './testClusterServer -w pipe0'\n" "press 'c' to connect to the servers.\n" "press 'd' to disconnect from the servers.\n" "press 'n' to delete current scene.\n" "press 't' to create a torus.\n" "press 'l' to load scene 'tie.wrl'.\n" << std::endl; // OSG init OSG::osgInit(argc,argv); OSG::VTKPolyDataMapper::getClassType().dump(); // GLUT init int winid = setupGLUT(&argc, argv); // the connection between GLUT and OpenSG _client_win = OSG::GLUTWindow::create(); _client_win->setGlutId(winid); _client_win->init(); _client_win->setSize(300,300); for(OSG::Int32 i=0;i<argc-1;++i) { if(argv[i+1] != NULL) _pipenames.push_back(argv[i+1]); } if(_pipenames.empty()) _pipenames.push_back("pipe0"); _root = OSG::Node::create(); _root->setCore(OSG::Group::create()); // create default scene // NodePtr scene = makeTorus(.5, 2, 16, 16); OSG::NodeUnrecPtr scene = initVTK(); _root->addChild(scene); // create the SimpleSceneManager helper _mgr = OSG::SimpleSceneManager::create(); // tell the manager what to manage _mgr->setWindow(_client_win ); _mgr->setRoot (_root); // show the whole scene _mgr->showAll(); return 0; }
// Initialize GLUT & OpenSG and set up the scene int main(int argc, char **argv) { //sortNumbers function int numberArray[] = {2, 13, 56, 8, 22, 16, 24, 89, 11, 90}; sortNumbers(numberArray,10); // OSG init OSG::osgInit(argc,argv); // GLUT init int winid = setupGLUT(&argc, argv); // open a new scope, because the pointers gwin and scene 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 scene OSG::NodeRefPtr scene = OSG::makeBox(1,1,1,2,2,2); OSG::commitChanges(); // 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(); } // GLUT main loop glutMainLoop(); return 0; }
int main(int argc, char* argv[]) { std::cerr << argv[0] << ". Press 'h' for keys" << std::endl; // Init OSG and glut. OSG::osgInit(argc,argv); { int winid = setupGLUT(&argc, argv); OSG::GLUTWindowRefPtr gwin = OSG::GLUTWindow::create(); gwin->setGlutId(winid); gwin->init(); printFontFamilies(); // load the scene OSG::NodeRefPtr scene = OSG::Node::create(); scene->setCore(OSG::Group::create()); // Setup text sample gTextStuff = new TextStuff(); gTextStuff->initialize(); gTextStuff->updateFace(); gTextStuff->updateScene(); scene->addChild(gTextStuff->mRootNode); mgr = OSG::SimpleSceneManager::create(); // Tell the manager about the window and scene mgr->setWindow(gwin ); mgr->setRoot(scene); // Start it up mgr->showAll(); } glutMainLoop(); return 0; }
int main(int argc, char **argv) { OSG::osgInit(argc,argv); { int winid = setupGLUT(&argc, argv); OSG::GLUTWindowRecPtr gwin= OSG::GLUTWindow::create(); gwin->setGlutId(winid); gwin->init(); scene = createScenegraph(); mgr = OSG::SimpleSceneManager::create(); mgr->setWindow(gwin ); mgr->setRoot (scene); mgr->showAll(); OSG::commitChanges(); } glutMainLoop(); return 0; }
int main(int argc, char **argv) { OSG::osgInit(argc,argv); if(argc > 1 && !strcmp(argv[1],"-s")) { show = false; argv++; argc--; } if(argc > 1 && !strcmp(argv[1],"-d")) { debug = true; argv++; argc--; } if(argc > 1) { scene = OSG::Node::create(); OSG::GroupUnrecPtr g = OSG::Group::create(); scene->setCore(g); for(OSG::UInt16 i = 1; i < argc; ++i) scene->addChild(OSG::SceneFileHandler::the()->read(argv[i])); } else { scene = OSG::makeTorus(.5, 3, 16, 16); } // GLUT init glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE); glutInitWindowSize(1024, 768); mainwinid = glutCreateWindow("OpenSG"); glutReshapeFunc(reshape); glutDisplayFunc(display); glutIdleFunc(idle); glutMouseFunc(mouse); glutMotionFunc(motion); glutKeyboardFunc(keyboard); OSG::GLUTWindowUnrecPtr mainwin=OSG::GLUTWindow::create(); mainwin->setGlutId(mainwinid); mainwin->init(); // create the SimpleSceneManager helper mgr = OSG::SimpleSceneManager::create(); // create the window and initial camera/viewport mgr->setWindow(mainwin); // tell the manager what to manage mgr->setRoot (scene); OSG::commitChanges(); // show the whole scene mgr->showAll(); mgr->setUseTraversalAction(true); tact = OSG::RenderAction::create(); #ifdef OSG_OLD_RENDER_ACTION act = OSG::RenderAction::create(); #endif debugact = OSG::RenderAction::create(); tact->setOcclusionCulling(true); // Open the debug window if(debug) { OSG::traverse(scene, initMask); glutInitWindowSize(800, 400); debugwinid = glutCreateWindow("OpenSG Occlusion Debugging"); glutReshapeFunc(reshape); glutDisplayFunc(display); glutIdleFunc(display); glutKeyboardFunc(keyboard); debugwin=OSG::GLUTWindow::create(); debugwin->setGlutId(debugwinid); debugwin->init(); OSG::ViewportUnrecPtr vp = mainwin->getPort(0); OSG::ViewportUnrecPtr newvp = OSG::Viewport::create(); newvp->setLeft(0); newvp->setRight(0.5); newvp->setBottom(0); newvp->setTop(1); newvp->setRoot(vp->getRoot()); newvp->setCamera(vp->getCamera()); newvp->setBackground(vp->getBackground()); newvp->setTravMask(0x1); debugwin->addPort(newvp); newvp = OSG::Viewport::create(); newvp->setLeft(0.5); newvp->setRight(1); newvp->setBottom(0); newvp->setTop(1); newvp->setRoot(vp->getRoot()); newvp->setCamera(vp->getCamera()); newvp->setBackground(vp->getBackground()); newvp->setTravMask(0x2); debugwin->addPort(newvp); tact->setOcclusionCullingDebug(true); tact->setOcclusionDebugMasks(0x1, 0x2, 0x4); } // add the statistics forground statfg = OSG::SimpleStatisticsForeground::create(); statfg->setSize(25); statfg->setColor(OSG::Color4f(0,1,0,0.7f)); statfg->addElement(OSG::RenderAction::statDrawTime, "Draw FPS: %r.3f"); statfg->addElement(OSG::RenderAction::statNMatrices, "Matrix Changes: %d"); statfg->addElement(OSG::RenderAction::statNStates, "State Changes: %d"); statfg->addElement(OSG::RenderPartition::statCullTestedNodes, "Cull-tested Nodes: %d"); statfg->addElement(OSG::RenderPartition::statCulledNodes, "Culled Nodes: %d"); statfg->addElement(OSG::OcclusionCullingTreeBuilder::statNOccNodes, "Nodes in DrawTree: %d"); statfg->addElement(OSG::OcclusionCullingTreeBuilder::statNOccTests, "Occ Tests: %d"); statfg->addElement(OSG::OcclusionCullingTreeBuilder::statNOccInvisible, "Invisible Nodes: %d"); statfg->addElement(OSG::OcclusionCullingTreeBuilder::statNOccSuccessTestPer, "OCC Success rate: %per%%"); statfg->addElement(OSG::OcclusionCullingTreeBuilder::statNOccTriangles, "Triangles culled: %d"); collector = statfg->getCollector(); tact->setStatCollector(collector); #ifdef OSG_OLD_RENDER_ACTION act ->setStatCollector(collector); #endif mgr->setAction(tact); #ifdef OSG_OLD_RENDER_ACTION mgr->setAction( act); #endif //tact->setOcclusionCullingMinimumFeatureSize(15); //tact->setOcclusionCullingVisibilityThreshold(15); //tact->setScreenLODCoverageThreshold(0.005); if(show) { mainwin->getPort(0)->addForeground(statfg); } #ifdef OSG_WITH_NVPERFSDK NVPMRESULT status; status = NVPMInit(); if (status != NVPM_OK) { FFATAL(("NVPerfSDK failed to initialize - no GPU data will be available")); } else { nvDataProvider->add("gpu_idle"); nvDataProvider->add("pixel_shader_busy"); nvDataProvider->add("vertex_shader_busy"); nvDataProvider->add("shader_waits_for_texture"); if (!nvDataProvider->add("OGL FPS")) FLOG(("nvDataProvider::add: 'OGL FPS' failed!\n")); statfg->addElement(GPUIdleStat); statfg->addElement(PSBusyStat); statfg->addElement(VSBusyStat); statfg->addElement(TextureWaitStat); statfg->addElement(OGLFPSStat); } #endif // GLUT main loop glutMainLoop(); return 0; }
// react to keys void keyboard(unsigned char k, int , int ) { switch(k) { case 27: { cleanup(); OSG::osgExit(); std::exit(0); } break; case 'f': { mgr->setNavigationMode(OSG::Navigator::FLY); std::cout << "Fly mode" << std::endl; } break; case 't': { mgr->setNavigationMode(OSG::Navigator::TRACKBALL); std::cout << "Trackball mode" << std::endl; } break; case 'q': { mgr->setStatistics(!mgr->getStatistics()); std::cout << "Statistics " << (mgr->getStatistics() ? "enabled" : "disabled") << std::endl; } break; case 'h': { mgr->setHeadlight(!mgr->getHeadlightState()); std::cout << "Headlight " << (mgr->getHeadlightState() ? "enabled" : "disabled") << std::endl; } break; case 'b': { if(polyChunk == NULL) { polyChunk = OSG::PolygonChunk::create(); root->addChunk(polyChunk); } if(polyChunk->getCullFace() == GL_NONE) { polyChunk->setCullFace(GL_BACK); std::cout << "Backface culling enabled" << std::endl; } else { polyChunk->setCullFace(GL_NONE); std::cout << "Backface culling disabled" << std::endl; } } break; case 'w': { if(polyChunk == NULL) { polyChunk = OSG::PolygonChunk::create(); root->addChunk(polyChunk); } if(polyChunk->getFrontMode() == GL_FILL) { polyChunk->setFrontMode(GL_LINE); polyChunk->setBackMode (GL_LINE); std::cout << "Wireframe enabled" << std::endl; } else { polyChunk->setFrontMode(GL_FILL); polyChunk->setBackMode (GL_FILL); std::cout << "Wireframe disabled" << std::endl; } } break; case 'n': { if(normalsActive == true) { normalsActive = false; NodeStore::const_iterator ngIt = normalsGeoN.begin(); NodeStore::const_iterator ngEnd = normalsGeoN.end (); for(; ngIt != ngEnd; ++ngIt) { (*ngIt)->setTravMask(0); } std::cout << "Normals disabled" << std::endl; } else { normalsActive = true; if(normalsGeoN.empty() == true) constructNormalsGeo(sceneN); NodeStore::const_iterator ngIt = normalsGeoN.begin(); NodeStore::const_iterator ngEnd = normalsGeoN.end (); for(; ngIt != ngEnd; ++ngIt) { (*ngIt)->setTravMask(OSG::TypeTraits<OSG::UInt32>::BitsSet); } std::cout << "Normals enabled" << std::endl; } } break; case 'm': { normalsLen /= 1.25f; constructNormalsGeo(sceneN); std::cout << "Normals length " << normalsLen << std::endl; } break; case 'M': { normalsLen *= 1.25f; constructNormalsGeo(sceneN); std::cout << "Normals length " << normalsLen << std::endl; } break; case 'v': { mgr->getRenderAction()->setVolumeDrawing( !mgr->getRenderAction()->getVolumeDrawing()); std::cout << "Volume drawing: " << (mgr->getRenderAction()->getVolumeDrawing() ? "enabled" : "disabled") << std::endl; } break; case 'p': { OSG::SceneGraphPrinter sgp(mgr->getRoot()); sgp.addPrintFunc(OSG::SkinnedGeometry::getClassType(), &printVolume ); sgp.printDownTree(std::cout); NodeStore::const_iterator nIt = skinnedGeoN.begin(); NodeStore::const_iterator nEnd = skinnedGeoN.end (); for(OSG::UInt32 i = 0; nIt != nEnd; ++nIt, ++i) { OSG::SkinnedGeometry *sgeo = dynamic_cast<OSG::SkinnedGeometry *>( (*nIt)->getCore()); std::cout << "Skeleton:\n"; OSG::SceneGraphPrinter skelPrinter(sgeo->getSkeleton()->getRoots(0)); skelPrinter.addPrintFunc(OSG::Transform ::getClassType(), &printXForm ); //skelPrinter.addPrintFunc(OSG::SkeletonJoint::getClassType(), // &printJoint ); skelPrinter.printDownTree(std::cout); } } break; case 'a': { mgr->showAll(); std::cout << "Showing all of scene." << std::endl; } break; case '[': { if(anims.empty() == false) { currAnim -= 1; if(currAnim < 0) currAnim = anims.size() - 1; std::cout << "Current anim [" << currAnim << "] - [" << anims[currAnim].anim->getTemplate()->getName() << "]" << std::endl; } } break; case ']': { if(anims.empty() == false) { currAnim += 1; if(currAnim >= OSG::Int32(anims.size())) currAnim = 0; std::cout << "Current anim [" << currAnim << "] - [" << anims[currAnim].anim->getTemplate()->getName() << "]" << std::endl; } } break; case 'L': { toggleAnim(currAnim, false); } break; case 'l': { toggleAnim(currAnim, true); } break; case 'd': { NodeStore::const_iterator nIt = skinnedGeoN.begin(); NodeStore::const_iterator nEnd = skinnedGeoN.end (); for(OSG::UInt32 i = 0; nIt != nEnd; ++nIt, ++i) { OSG::SkinnedGeometry *sgeo = dynamic_cast<OSG::SkinnedGeometry *>( (*nIt)->getCore()); if(sgeo->getRenderMode() == OSG::SkinnedGeometry::RMSkinnedCPU) { std::cout << "Enabling SkinnedGeo GPU mode [" << sgeo << "]" << std::endl; sgeo->setRenderMode(OSG::SkinnedGeometry::RMSkinnedGPU); sgeo->setMaterial (matSkin); } else if(sgeo->getRenderMode() == OSG::SkinnedGeometry::RMSkinnedGPU) { std::cout << "Enabling SkinnedGeo SKELETON mode [" << sgeo << "]" << std::endl; sgeo->setRenderMode(OSG::SkinnedGeometry::RMSkeleton); sgeo->setMaterial (skinnedGeoMat[i]); } else if(sgeo->getRenderMode() == OSG::SkinnedGeometry::RMSkeleton) { std::cout << "Enabling SkinnedGeo UNSKINNED mode [" << sgeo << "]" << std::endl; sgeo->setRenderMode(OSG::SkinnedGeometry::RMUnskinned); sgeo->setMaterial (skinnedGeoMat[i]); } else { std::cout << "Enabling SkinnedGeo CPU mode [" << sgeo << "]" << std::endl; sgeo->setRenderMode(OSG::SkinnedGeometry::RMSkinnedCPU); sgeo->setMaterial(skinnedGeoMat[i]); } } } break; case 'c': { mgr->getRenderAction()->setFrustumCulling( !mgr->getRenderAction()->getFrustumCulling()); std::cout << "Frustum culling: " << (mgr->getRenderAction()->getFrustumCulling() ? "enabled" : "disabled") << std::endl; } break; case 's': { NodeStore::const_iterator nIt = skinnedGeoN.begin(); NodeStore::const_iterator nEnd = skinnedGeoN.end (); for(OSG::UInt32 i = 0; nIt != nEnd; ++nIt, ++i) { OSG::SkinnedGeometry *sgeo = dynamic_cast<OSG::SkinnedGeometry *>( (*nIt)->getCore()); OSG::Skeleton *skel = sgeo->getSkeleton(); OSG::Skeleton::MFRootsType::const_iterator rIt = skel->getMFRoots()->begin(); OSG::Skeleton::MFRootsType::const_iterator rEnd = skel->getMFRoots()->end (); for(OSG::UInt32 j = 0; rIt != rEnd; ++rIt, ++j) { std::cout << "Skeleton [" << i << "] @ [" << skel << "] root [" << j << "]\n"; OSG::SceneGraphPrinter sgp(*rIt); sgp.printDownTree(std::cout); std::cout << std::endl; } } } break; default: { printHelp(); } break; } glutPostRedisplay(); }
// 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); // Args given? if(argc > 1) { if(sscanf(argv[1], "%u", &nlights) != 1) { FWARNING(("Number of lights '%s' not understood.\n", argv[1])); nlights = 3; } } // 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(); /* A Light defines a source of light in the scene. Generally, two types of information are of interest: The position of the light source (geometry), and what elements of the scene are lit (semantics). Using the position of the light in the graph for geometry allows moving the Light just like any other node, by putting it below a OSG::Transform Node and changing the transformation. This consistency also simplifies attaching Lights to moving parts in the scene: just put them below the same Transform and they will move with the object. The semantic interpretation also makes sense, it lets you restrict the influence area of the light to a subgraph of the scene. This can be used for efficiency, as every active light increases the amount of calculations necessary per vertex, even if the light doesn't influence the vertex, because it is too far away. It can also be used to overcome the restrictions on the number of lights. OpenSG currently only allows 8 concurrently active lights. It is also not difficult to imagine situations where both interpretations are necessary at the same time. Take for example a car driving through a night scene. You'd want to headlights to be fixed to the car and move together with it. But at the same time they should light the houses you're driving by, and not the mountains in the distance. Thus there should be a way to do both at the same time. OpenSG solves this by splitting the two tasks to two Nodes. The Light's Node is for the sematntic part, it defines which object are lit by the Light. FOr the geometrc part the Light keeps a SFNodePtr to a different Node, the so called beacon. The local coordinate system of the beacon provides the reference coordinate system for the light's position. Thus the typical setup of an OpenSG scenegraph starts with a set of lights, which light the whole scene, followed by the actual geometry. Tip: Using the beacon of the camera (see \ref PageSystemWindowCamera) as the beacon of a light source creates a headlight. Every light is closely related to OpenGL's light specification. It has a diffuse, specular and ambient color. Additionally it can be switched on and off using the on field. */ // Create the scene OSG::NodeRefPtr scene = OSG::Node::create(); OSG::GroupRefPtr group = OSG::Group::create(); scene->setCore(group); // create the scene to be lit // a simple torus is fine for now. // You can add more Geometry here if you want to. OSG::NodeRefPtr lit_scene = OSG::makeTorus(.5, 2, 32, 64); // helper node to keep the lights on top of each other OSG::NodeRefPtr lastnode = lit_scene; // create the light sources OSG::Color3f colors[] = { OSG::Color3f(1,0,0), OSG::Color3f(0,1,0), OSG::Color3f(0,0,1), OSG::Color3f(1,1,0), OSG::Color3f(0,1,1), OSG::Color3f(1,0,1), OSG::Color3f(1,1,1), OSG::Color3f(1,1,1) }; if(nlights > 8) { FWARNING(("Currently only 8 lights supported\n")); nlights = 8; } // scale the lights to not overexpose everything. Just a little. OSG::Real32 scale = OSG::osgMax(1., 1.5 / nlights); for(OSG::UInt16 i = 0; i < nlights; ++i) { // create the light source OSG::NodeRefPtr light = OSG::Node::create(); OSG::LightRefPtr light_core; OSG::NodeRefPtr geo_node; switch((i % 3) + 0) { /* The PointLight has a position to define its location. In addition, as it really is located in the scene, it has attenuation parameters to change the light's intensity depending on the distance to the light. Point lights are more expesinve to compute than directional lights, but not quite as expesive as spot lights. If you need to see the localized effects of the light, a point light is a good compromise between speed and quality. */ case 0: { OSG::PointLightRefPtr l = OSG::PointLight::create(); l->setPosition (0, 0, 0); l->setConstantAttenuation (1); l->setLinearAttenuation (0); l->setQuadraticAttenuation (3); // a little sphere to show where the light is geo_node = OSG::makeLatLongSphere(8, 8, 0.1f); OSG::GeometryRefPtr geo = dynamic_cast<OSG::Geometry *>(geo_node->getCore()); OSG::SimpleMaterialRefPtr sm = OSG::SimpleMaterial::create(); sm->setLit(false); sm->setDiffuse(OSG::Color3f( colors[i][0], colors[i][1], colors[i][2] )); geo->setMaterial(sm); light_core = l; } break; /* The DirectionalLight just has a direction. To use it as a headlight use (0,0,-1) as a direction. it is the computationally cheapest light source. Thus for the fastest lit rendering, just a single directional light source. The osg::SimpleSceneManager's headlight is a directional light source. */ case 1: { OSG::DirectionalLightRefPtr l = OSG::DirectionalLight::create(); l->setDirection(0, 0, 1); // a little cylinder to show where the light is geo_node = OSG::makeCylinder(.1f, .03f, 8, true, true, true); OSG::GeometryRefPtr geo = dynamic_cast<OSG::Geometry *>(geo_node->getCore()); OSG::SimpleMaterialRefPtr sm = OSG::SimpleMaterial::create(); sm->setLit(false); sm->setDiffuse(OSG::Color3f( colors[i][0], colors[i][1], colors[i][2] )); geo->setMaterial(sm); light_core = l; } break; /* The SpotLight adds a direction to the PointLight and a spotCutOff angle to define the area that's lit. To define the light intensity fallof within that area the spotExponent field is used. Spot lights are very expensive to compute, use them sparingly. */ case 2: { OSG::SpotLightRefPtr l = OSG::SpotLight::create(); l->setPosition (OSG::Pnt3f(0, 0, 0)); l->setDirection (OSG::Vec3f(0, -1, 0)); l->setSpotExponent (2); l->setSpotCutOff (OSG::osgDegree2Rad(45)); l->setConstantAttenuation (1); l->setLinearAttenuation (0); l->setQuadraticAttenuation (3); // a little cone to show where the light is geo_node = OSG::makeCone(.2f, .2f, 8, true, true); OSG::GeometryRefPtr geo = dynamic_cast<OSG::Geometry *>(geo_node->getCore()); OSG::SimpleMaterialRefPtr sm = OSG::SimpleMaterial::create(); sm->setLit(false); sm->setDiffuse(OSG::Color3f( colors[i][0], colors[i][1], colors[i][2] )); geo->setMaterial(sm); light_core = l; } break; } // create the beacon and attach it to the scene OSG::NodeRefPtr beacon = OSG::Node::create(); OSG::TransformRefPtr beacon_core = OSG::Transform::create(); lightBeacons[i] = beacon_core; beacon->setCore(beacon_core); beacon->addChild(geo_node); scene->addChild(beacon); light_core->setAmbient (colors[i][0] / scale, colors[i][1] / scale, colors[i][2] / scale, 1); light_core->setDiffuse (colors[i][0] / scale, colors[i][1] / scale, colors[i][2] / scale, 1); light_core->setSpecular(1 / scale, 1 / scale, 1 / scale, 1); light_core->setBeacon (beacon); light->setCore(light_core); light->addChild(lastnode); lights[i] = light_core; lastnode = light; } scene->addChild(lastnode); OSG::commitChanges(); // create the SimpleSceneManager helper mgr = OSG::SimpleSceneManager::create(); // tell the manager what to manage mgr->setWindow(gwin ); mgr->setRoot (scene); // switch the headlight off, we have enough lights as is mgr->setHeadlight(false); // 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 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; }
void init(int argc, char *argv[]) { OSG::osgInit(argc, argv); int glutWinId = setupGLUT(&argc, argv); // the connection between GLUT and OpenSG OSG::GLUTWindowUnrecPtr gwin= OSG::GLUTWindow::create(); gwin->setGlutId(glutWinId); gwin->init(); // load the scene root = OSG::ChunkOverrideGroup::create(); rootN = OSG::makeNodeFor(root); if(argc < 2) { FWARNING(("No file given!\n")); FWARNING(("Supported file formats:\n")); OSG::SceneFileHandler::the()->print(); sceneN = OSG::makeTorus(.5, 2, 16, 16); } else { /* All scene file loading is handled via the SceneFileHandler. */ sceneN = OSG::SceneFileHandler::the()->read(argv[1]); } OSG::TransformUnrecPtr xform = OSG::Transform::create(); OSG::NodeUnrecPtr xformN = OSG::makeNodeFor(xform); // xform->editMatrix().setTranslate(OSG::Vec3f(100.f, 0.f, 0.f)); // xform->editMatrix().setRotate(OSG::Quaternion(OSG::Vec3f(0.f, 1.f, 0.f), 0.3f * OSG::Pi)); OSG::NodeUnrecPtr boxN = OSG::makeBox(1.f, 1.f, 5.f, 1, 1, 1); xformN->addChild(sceneN); rootN ->addChild(xformN); rootN ->addChild(boxN ); OSG::commitChanges(); // collect geometries in the scene collectGeometry(rootN); // construct skin shader vpSkin = OSG::ShaderProgram::createVertexShader (); vpSkin->setProgram(vpCode); fpSkin = OSG::ShaderProgram::createFragmentShader(); fpSkin->setProgram(fpCode); shSkin = OSG::ShaderProgramChunk::create(); shSkin->addShader(vpSkin); shSkin->addShader(fpSkin); matSkin = OSG::ChunkMaterial::create(); matSkin->addChunk(shSkin); // process animations processAnim(sceneN); // create the SimpleSceneManager helper mgr = OSG::SimpleSceneManager::create(); // tell the manager what to manage mgr->setWindow(gwin ); mgr->setRoot (rootN); // show the whole scene mgr->showAll(); }
int doMain(int argc, char **argv) { // // This might be necessary depending on the // used platform to ensure that the corresponding // libraries get loaded. // OSG::preloadSharedObject("OSGFileIO"); OSG::preloadSharedObject("OSGImageFileIO"); OSG::preloadSharedObject("OSGContribPLY"); OSG::osgInit(argc,argv); // GLUT init glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_STENCIL | GLUT_DOUBLE); glutCreateWindow("OpenSG"); glutReshapeFunc(reshape); glutDisplayFunc(display); glutIdleFunc(display); glutMouseFunc(mouse); glutMotionFunc(motion); glutKeyboardFunc(keyboard); OSG::PassiveWindowRefPtr pwin=OSG::PassiveWindow::create(); pwin->init(); // create the SimpleSceneManager helper mgr = OSG::SimpleSceneManager::create(); // create the window and initial camera/viewport mgr->setWindow(pwin); // // for storing clipplane beacon we use a container // collection attachment which we attach to the scene // node. Otherwise the scene could not be saved correctly, // as the beacons would be lost. // container = OSG::ContainerCollection::create(); // // Implementation details: // For each clip plane we provide a ClipPlaneChunk, the plane geometry, // the plane transform core and at least a plane color conveniently in // a vector of type VecClipPlaneDetailsT. The next function call // initializes this data structure. // createClipPlaneDetails(); // // The scene // scene = OSG::Node::create(); scene->setCore(OSG::Group::create()); scene->addAttachment(container); // // A place for accessing the box and torus. // vecGeometries.push_back(NULL); vecGeometries.push_back(NULL); // // Build concrete clipping planes and update the clip plane details. // ClipPlaneData data1; ClipPlaneData data2; data1._equation = OSG::Vec4f(0,0,1,0); data1._enabled = true; data2._equation = OSG::Vec4f(1,0,0,0); data2._enabled = false; vecClipPlaneData.push_back(data1); vecClipPlaneData.push_back(data2); updateClipPlanes(vecClipPlaneData); keyboard('3',-1,-1); keyboard('4',-1,-1); // tell the manager what to manage mgr->setRoot(scene); // show the whole scene mgr->showAll(); mgr->redraw(); pwin->dumpExtensions(); 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; }
// 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 scene In the previous example, the colors and positions used the same indices. That might not always be the preferred way, and it might not make sense for other properties, e.g. normals. It is possible to assign a different index for every property. See the indices section below for details. The initial setup is the same as in 06indexgeometry */ OSG::GeoUInt8PropertyRefPtr type = OSG::GeoUInt8Property::create(); type->addValue(GL_POLYGON ); type->addValue(GL_TRIANGLES); type->addValue(GL_QUADS ); OSG::GeoUInt32PropertyRefPtr lens = OSG::GeoUInt32Property::create(); lens->addValue(4); lens->addValue(6); lens->addValue(8); // positions OSG::GeoPnt3fPropertyRefPtr pnts = OSG::GeoPnt3fProperty::create(); // the base pnts->addValue(OSG::Pnt3f(-1, -1, -1)); pnts->addValue(OSG::Pnt3f(-1, -1, 1)); pnts->addValue(OSG::Pnt3f( 1, -1, 1)); pnts->addValue(OSG::Pnt3f( 1, -1, -1)); // the roof base pnts->addValue(OSG::Pnt3f(-1, 0, -1)); pnts->addValue(OSG::Pnt3f(-1, 0, 1)); pnts->addValue(OSG::Pnt3f( 1, 0, 1)); pnts->addValue(OSG::Pnt3f( 1, 0, -1)); // the gable pnts->addValue(OSG::Pnt3f( 0, 1, -1)); pnts->addValue(OSG::Pnt3f( 0, 1, 1)); // colors OSG::GeoVec3fPropertyRefPtr colors = OSG::GeoVec3fProperty::create(); colors->push_back(OSG::Color3f(1, 1, 0)); colors->push_back(OSG::Color3f(1, 0, 0)); colors->push_back(OSG::Color3f(1, 0, 0)); colors->push_back(OSG::Color3f(1, 1, 0)); colors->push_back(OSG::Color3f(0, 1, 1)); colors->push_back(OSG::Color3f(1, 0, 1)); /* A new property: normals. They are used for lighting calculations and have to point away from the surface. Normals are standard vectors. */ OSG::GeoVec3fPropertyRefPtr norms = OSG::GeoVec3fProperty::create(); norms->push_back(OSG::Vec3f(-1, 0, 0)); norms->push_back(OSG::Vec3f( 1, 0, 0)); norms->push_back(OSG::Vec3f( 0, -1, 0)); norms->push_back(OSG::Vec3f( 0, 1, 0)); norms->push_back(OSG::Vec3f( 0, 0, -1)); norms->push_back(OSG::Vec3f( 0, 0, 1)); /* To use more than one index for a geometry, create multiple GeoUInt32Property (or GeoUInt8Property or GeoUInt16Property) objects and add them as index for the corresponding property you want to index. */ OSG::GeoUInt32PropertyRefPtr ind1 = OSG::GeoUInt32Property::create(); OSG::GeoUInt32PropertyRefPtr ind2 = OSG::GeoUInt32Property::create(); // fill first index (will be used for positions) ind1->push_back(0); // polygon ind1->push_back(1); ind1->push_back(2); ind1->push_back(3); ind1->push_back(7); // triangle 1 ind1->push_back(4); ind1->push_back(8); ind1->push_back(5); // triangle 2 ind1->push_back(6); ind1->push_back(9); ind1->push_back(1); // quad 1 ind1->push_back(2); ind1->push_back(6); ind1->push_back(5); ind1->push_back(3); // quad 2 ind1->push_back(0); ind1->push_back(4); ind1->push_back(7); // fill second index (will be used for colors/normals) ind2->push_back(3); // polygon ind2->push_back(3); ind2->push_back(3); ind2->push_back(3); ind2->push_back(4); // triangle 1 ind2->push_back(4); ind2->push_back(4); ind2->push_back(5); // triangle 2 ind2->push_back(5); ind2->push_back(5); ind2->push_back(5); // quad 1 ind2->push_back(5); ind2->push_back(5); ind2->push_back(5); ind2->push_back(4); // quad 2 ind2->push_back(4); ind2->push_back(4); ind2->push_back(4); /* Put it all together into a Geometry NodeCore. */ OSG::GeometryRefPtr geo = OSG::Geometry::create(); geo->setTypes (type); geo->setLengths (lens); /* Set the properties and indices used to index them. Calling geo->setProperty(pnts, Geometry::PositionsIndex) is the same as calling geo->setPositions(pnts), but this way it is more obvious which properties and indices go together. */ geo->setProperty(pnts, OSG::Geometry::PositionsIndex); geo->setIndex (ind1, OSG::Geometry::PositionsIndex); geo->setProperty(norms, OSG::Geometry::NormalsIndex ); geo->setIndex (ind2, OSG::Geometry::NormalsIndex ); geo->setProperty(colors, OSG::Geometry::ColorsIndex ); geo->setIndex (ind2, OSG::Geometry::ColorsIndex ); geo->setMaterial (OSG::getDefaultMaterial()); // put the geometry core into a node OSG::NodeRefPtr n = OSG::Node::create(); n->setCore(geo); // add a transformation to make it move OSG::NodeRefPtr scene = OSG::Node::create(); trans = OSG::Transform::create(); scene->setCore(trans); scene->addChild(n); OSG::commitChanges(); // 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(); } // GLUT main loop glutMainLoop(); return 0; }
// Initialize GLUT & OpenSG and set up the scene int main(int argc, char **argv) { printf("Usage: testCGShader <filename.vp> <filename.fp>\n"); if( argc < 3 ) return 0; // 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 the shader material OSG::ChunkMaterialUnrecPtr cmat = OSG::ChunkMaterial::create(); OSG::MaterialChunkUnrecPtr matc = OSG::MaterialChunk::create(); matc->setAmbient(OSG::Color4f(0.1, 0.1, 0.1, 1.0)); matc->setDiffuse(OSG::Color4f(0.3, 0.3, 0.3, 1.0)); matc->setSpecular(OSG::Color4f(0.8, 0.8, 0.8, 1.0)); matc->setShininess(100); matc->setLit(true); OSG::SHLChunkUnrecPtr shl = OSG::SHLChunk::create(); shl->readVertexProgram(argv[1]); shl->readFragmentProgram(argv[2]); cmat->addChunk(shl); // create root node _scene = OSG::Node::create(); // create torus OSG::GeometryUnrecPtr geo = OSG::makeTorusGeo(.8, 1.8, 128, 128); geo->setMaterial(cmat); OSG::NodeUnrecPtr torus = OSG::Node::create(); torus->setCore(geo); // add torus to scene OSG::GroupUnrecPtr group = OSG::Group::create(); _scene->setCore(group); _scene->addChild(torus); // create the SimpleSceneManager helper _mgr = OSG::SimpleSceneManager::create(); // tell the manager what to manage _mgr->setWindow(gwin ); _mgr->setRoot(_scene); /* // create point headlight _mgr->turnHeadlightOff(); NodePtr headlight = _mgr->getHighlight(); PointLightPtr light = PointLight::create(); beginEditCP(light); light->setAmbient (.3, .3, .3, 1); light->setDiffuse ( 1, 1, 1, 1); light->setSpecular ( 1, 1, 1, 1); light->setBeacon (_mgr->getCamera()->getBeacon()); endEditCP(light); beginEditCP(_scene); _scene->setCore(light); endEditCP(_scene); */ // show the whole scene _mgr->showAll(); // GLUT main loop glutMainLoop(); return 0; }
int main(int argc, char **argv) { g_error = 0.01f; if ( argc > 1 && !strcmp(argv[1], "-f")) { std::cerr << "Using forceTesselate()." << std::endl; useForceTesselate = true; ++argv, --argc; } if ( argc == 2 ) { g_error = atof( argv[1] ); } if ( g_error < 0.001 ) { g_error = 0.001f; } OSG::osgInit(argc,argv); // GLUT init glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE); int winid = glutCreateWindow("OpenSG"); glutReshapeFunc(reshape); glutDisplayFunc(display); glutIdleFunc(display); glutMouseFunc(mouse); glutMotionFunc(motion); glutKeyboardFunc(keyboard); { OSG::GLUTWindowRefPtr gwin = OSG::GLUTWindow::create(); gwin->setGlutId(winid); gwin->init(); // create the scene OSG::NodeRefPtr scene; scene = makeScene( ); if ( scene == NULL ) { std::cerr<<"makeScene returned NullFC, exiting..."<<std::endl; return -1; } // create the SimpleSceneManager helper mgr = OSG::SimpleSceneManager::create(); // create the window and initial camera/viewport mgr->setWindow( gwin ); // tell the manager what to manage mgr->setRoot ( scene ); // show the whole scene mgr->showAll(); mgr->redraw(); OSG::SolidBackgroundRefPtr bgr = OSG::SolidBackground::create(); bgr->setColor( OSG::Color3f( 0.7f, 0.7f, 0.7f )); mgr->getWindow()->getPort(0)->setBackground( bgr ); } // GLUT main loop glutMainLoop(); return 0; }
// Initialize GLUT & OpenSG and set up the scene int doMain(int argc, char **argv) { printf("Press key '9' or '0' to toggle light sources.\n"); printf("Set the shadow mode with key '1' ... '8'\n"); printf("Change MapSize with keys 'y' = 512, 'x' = 1024, 'c' = 2048\n"); printf("NOTE: Real point lights only supported for ShadowMode 1...6!\n"); // OSG init OSG::osgInit(argc, argv); // GLUT init int winid = setupGLUT(&argc, argv); gwin = OSG::GLUTWindow::create(); //Erstellen der ben�tigten Komponenten-------------------------------------- rootNode = OSG::makeCoredNode<OSG::Group>(); OSG::NodeUnrecPtr scene = OSG::makeCoredNode<OSG::Group>(); /* // create lights //Directional Light 1 OSG::NodeUnrecPtr light1 = OSG::makeCoredNode<OSG::DirectionalLight>(&_light1_core); OSG::NodeUnrecPtr light1_beacon = OSG::makeCoredNode<OSG::Transform>(&_light1_trans); _light1_trans->editMatrix().setTranslate(0.0, 0.0, 0.0); _light1_core->setDirection(0.8,0.8,0.5); _light1_core->setAmbient(0.15,0.15,0.15,1); _light1_core->setDiffuse(0.5,0.5,0.5,1); _light1_core->setSpecular(0.0,0.0,0.0,1); _light1_core->setBeacon(light1_beacon); _light1_core->setShadowIntensity(0.7); _light1_core->setOn(true); */ // Point Light 1 OSG::NodeUnrecPtr light1 = OSG::makeCoredNode<OSG::PointLight>(&_light1_core); OSG::NodeUnrecPtr light1_beacon = OSG::makeCoredNode<OSG::Transform >(&_light1_trans); _light1_trans->editMatrix().setTranslate(50.0, 50.0, 10.0); _light1_core->setAmbient(0.15f, 0.15f, 0.15f, 1); _light1_core->setDiffuse(0.5f, 0.5f, 0.5f, 1); _light1_core->setSpecular(0.0f, 0.0f, 0.0f, 1); _light1_core->setBeacon(light1_beacon); _light1_core->setOn(true); _light1_core->setShadowIntensity(0.8f); // Spot Light 2 OSG::NodeUnrecPtr light2 = OSG::makeCoredNode<OSG::SpotLight>(&_light2_core); OSG::NodeUnrecPtr light2_beacon = OSG::makeCoredNode<OSG::Transform>(&_light2_trans); //_light2_trans->editMatrix().setTranslate(75.0, 0.0, 25.0); _light2_trans->editMatrix().setTranslate(250.0, -250.0, 300.0); _light2_core->setAmbient(0.15,0.15,0.15,1); _light2_core->setDiffuse(0.5,0.5,0.5,1); _light2_core->setSpecular(0.0,0.0,0.0,1); _light2_core->setSpotCutOffDeg(40.0); _light2_core->setSpotDirection(-0.85,0.85,-1.0); _light2_core->setBeacon(light2_beacon); _light2_core->setShadowIntensity(0.7); _light2_core->setOn(true); /* // Point Light 2 OSG::NodeUnrecPtr light2 = OSG::makeCoredNode<OSG::PointLight>(&_light2_core); OSG::NodeUnrecPtr light2_beacon = OSG::makeCoredNode<OSG::Transform> (&_light2_trans); _light2_trans->editMatrix().setTranslate(40.0, 0.0, 40.0); _light2_core->setAmbient(0.15f, 0.15f, 0.15f, 1); _light2_core->setDiffuse(0.5f, 0.5f, 0.5f, 1); _light2_core->setSpecular(0.0f, 0.0f, 0.0f, 1); _light2_core->setBeacon(light2_beacon); _light2_core->setOn(false); _light2_core->setShadowIntensity(0.7f); */ light1->addChild(light2); light2->addChild(scene); //Eigene Kamera erstellen Pcamera = OSG::PerspectiveCamera::create(); cam_beacon = OSG::makeCoredNode<OSG::Transform>(&cam_trans); cam_trans->editMatrix().setTranslate(0.0, 0.0, 25.0); Pcamera->setBeacon(cam_beacon); Pcamera->setFov(OSG::osgDegree2Rad(60)); Pcamera->setNear(1.0); Pcamera->setFar(1000); // create scene // bottom OSG::NodeUnrecPtr plane = OSG::makePlane(300.0, 300.0, 256, 256); OSG::ImageUnrecPtr plane_img = OSG::Image::create(); plane_img->read("gras.jpg"); OSG::TextureObjChunkUnrecPtr plane_tex_obj = OSG::TextureObjChunk::create(); OSG::TextureEnvChunkUnrecPtr plane_tex_env = OSG::TextureEnvChunk::create(); plane_tex_obj->setImage(plane_img); plane_tex_obj->setMinFilter(GL_LINEAR); plane_tex_obj->setMagFilter(GL_LINEAR); plane_tex_obj->setWrapS(GL_REPEAT); plane_tex_obj->setWrapT(GL_REPEAT); plane_tex_env->setEnvMode(GL_MODULATE); OSG::SimpleMaterialUnrecPtr plane_mat = OSG::SimpleMaterial::create(); plane_mat->setAmbient(OSG::Color3f(0.3f, 0.3f, 0.3f)); plane_mat->setDiffuse(OSG::Color3f(1.0f, 1.0f, 1.0f)); plane_mat->addChunk(plane_tex_obj); plane_mat->addChunk(plane_tex_env); OSG::Geometry *plane_geo = dynamic_cast<OSG::Geometry *>(plane->getCore()); plane_geo->setMaterial(plane_mat); //load Tree Objects OSG::NodeUnrecPtr tree1_trans_node = OSG::makeCoredNode<OSG::Transform> (&_tree1_trans); OSG::NodeUnrecPtr tree2_trans_node = OSG::makeCoredNode<OSG::Transform> (&_tree2_trans); OSG::NodeUnrecPtr tree3_trans_node = OSG::makeCoredNode<OSG::Transform> (&_tree3_trans); OSG::NodeUnrecPtr tree4_trans_node = OSG::makeCoredNode<OSG::Transform> (&_tree4_trans); OSG::NodeUnrecPtr tree5_trans_node = OSG::makeCoredNode<OSG::Transform> (&_tree5_trans); OSG::NodeUnrecPtr tree6_trans_node = OSG::makeCoredNode<OSG::Transform> (&_tree6_trans); OSG::NodeUnrecPtr tree7_trans_node = OSG::makeCoredNode<OSG::Transform> (&_tree7_trans); OSG::NodeUnrecPtr tree8_trans_node = OSG::makeCoredNode<OSG::Transform> (&_tree8_trans); OSG::NodeUnrecPtr tree9_trans_node = OSG::makeCoredNode<OSG::Transform> (&_tree9_trans); _tree1_trans->editMatrix().setTranslate(-80.0, -80.0, 0.0); _tree1_trans->editMatrix().setScale(OSG::Vec3f(12.0, 12.0, 10.0)); _tree2_trans->editMatrix().setTranslate(0.0, -80.0, 0.0); _tree2_trans->editMatrix().setScale(OSG::Vec3f(12.0, 12.0, 10.0)); _tree3_trans->editMatrix().setTranslate(80.0, -80.0, 0.0); _tree3_trans->editMatrix().setScale(OSG::Vec3f(12.0, 12.0, 10.0)); _tree4_trans->editMatrix().setTranslate(-80.0, 0.0, 0.0); _tree4_trans->editMatrix().setScale(OSG::Vec3f(12.0, 12.0, 10.0)); _tree5_trans->editMatrix().setTranslate(0.0, 0.0, 0.0); _tree5_trans->editMatrix().setScale(OSG::Vec3f(12.0, 12.0, 10.0)); _tree6_trans->editMatrix().setTranslate(80.0, 0.0, 0.0); _tree6_trans->editMatrix().setScale(OSG::Vec3f(12.0, 12.0, 10.0)); _tree7_trans->editMatrix().setTranslate(-80.0, 80.0, 0.0); _tree7_trans->editMatrix().setScale(OSG::Vec3f(12.0, 12.0, 10.0)); _tree8_trans->editMatrix().setTranslate(0.0, 80.0, 0.0); _tree8_trans->editMatrix().setScale(OSG::Vec3f(12.0, 12.0, 10.0)); _tree9_trans->editMatrix().setTranslate(80.0, 80.0, 0.0); _tree9_trans->editMatrix().setScale(OSG::Vec3f(12.0, 12.0, 10.0)); OSG::NodeUnrecPtr tree1 = OSG::SceneFileHandler::the()->read("tree1.3ds"); // NodeUnrecPtr tree1 = makeSphere(2, 2.0); tree1_trans_node->addChild(tree1); tree2_trans_node->addChild(cloneTree(tree1)); tree3_trans_node->addChild(cloneTree(tree1)); tree4_trans_node->addChild(cloneTree(tree1)); tree5_trans_node->addChild(cloneTree(tree1)); tree6_trans_node->addChild(cloneTree(tree1)); tree7_trans_node->addChild(cloneTree(tree1)); tree8_trans_node->addChild(cloneTree(tree1)); tree9_trans_node->addChild(cloneTree(tree1)); OSG::NodeUnrecPtr trees = OSG::makeCoredNode<OSG::Group>(); trees->addChild(tree1_trans_node); trees->addChild(tree2_trans_node); trees->addChild(tree3_trans_node); trees->addChild(tree4_trans_node); trees->addChild(tree5_trans_node); trees->addChild(tree6_trans_node); trees->addChild(tree7_trans_node); trees->addChild(tree8_trans_node); trees->addChild(tree9_trans_node); /*//load Airplane Object NodePtr obj1_trans_node = makeCoredNode<Transform>(&_obj1_trans); _obj1_trans->editMatrix().setTranslate(0.0, 0.0, 10.0); _obj1_trans->editMatrix().setScale(Vec3f(0.15,0.15,0.15)); NodePtr object1 = SceneFileHandler::the().read("triplane.3ds"); obj1_trans_node->addChild(object1); */ //Load a Quad as Pointlight OSG::GeometryUnrecPtr boxGeo = OSG::makeBoxGeo(15, 15, 15, 1, 1, 1); OSG::NodeUnrecPtr boxNode = OSG::Node::create(); boxNode->setCore(boxGeo); OSG::SimpleMaterialUnrecPtr box_mat = OSG::SimpleMaterial::create(); box_mat->setAmbient(OSG::Color3f(0.95f, 1.0f, 0.2f)); box_mat->setDiffuse(OSG::Color3f(0.95f, 1.0f, 0.2f)); boxGeo->setMaterial(box_mat); OSG::NodeUnrecPtr obj1_trans_node = OSG::makeCoredNode<OSG::Transform> (&_obj1_trans); obj1_trans_node->addChild(boxNode); //load Dino Objects OSG::NodeUnrecPtr dino1_trans_node = OSG::makeCoredNode<OSG::Transform> (&_dino1_trans); OSG::NodeUnrecPtr dino2_trans_node = OSG::makeCoredNode<OSG::Transform> (&_dino2_trans); OSG::NodeUnrecPtr dino3_trans_node = OSG::makeCoredNode<OSG::Transform> (&_dino3_trans); OSG::NodeUnrecPtr dino4_trans_node = OSG::makeCoredNode<OSG::Transform> (&_dino4_trans); _dino1_trans->editMatrix().setTranslate(-20.0, -20.0, 10.0); _dino1_trans->editMatrix().setScale(OSG::Vec3f(5.0, 5.0, 5.0)); _dino2_trans->editMatrix().setTranslate(-20.0, -20.0, 6.0); _dino2_trans->editMatrix().setScale(OSG::Vec3f(3.0, 3.0, 3.0)); _dino3_trans->editMatrix().setTranslate(-20.0, -20.0, 6.0); _dino3_trans->editMatrix().setScale(OSG::Vec3f(3.0, 3.0, 3.0)); _dino4_trans->editMatrix().setTranslate(-20.0, -20.0, 6.0); _dino4_trans->editMatrix().setScale(OSG::Vec3f(3.0, 3.0, 3.0)); OSG::NodeUnrecPtr dino1 = OSG::SceneFileHandler::the()->read("dinopet.3ds"); // NodeUnrecPtr dino1 = makeBox(2., 2., 2., 4, 4, 4); dino1_trans_node->addChild(dino1); dino2_trans_node->addChild(cloneTree(dino1)); dino3_trans_node->addChild(cloneTree(dino1)); dino4_trans_node->addChild(cloneTree(dino1)); OSG::NodeUnrecPtr dinos = OSG::makeCoredNode<OSG::Group>(); dinos->addChild(dino1_trans_node); dinos->addChild(dino2_trans_node); dinos->addChild(dino3_trans_node); dinos->addChild(dino4_trans_node); //load Stone Objects OSG::TransformUnrecPtr _stone_trans1, _stone_trans2, _stone_trans3, _stone_trans4, _stone_trans5, _stone_trans6, _stone_trans7, _stone_trans8, _stone_trans9; OSG::NodeUnrecPtr stone_trans_node1 = OSG::makeCoredNode<OSG::Transform> (&_stone_trans1); OSG::NodeUnrecPtr stone_trans_node2 = OSG::makeCoredNode<OSG::Transform> (&_stone_trans2); OSG::NodeUnrecPtr stone_trans_node3 = OSG::makeCoredNode<OSG::Transform> (&_stone_trans3); OSG::NodeUnrecPtr stone_trans_node4 = OSG::makeCoredNode<OSG::Transform> (&_stone_trans4); OSG::NodeUnrecPtr stone_trans_node5 = OSG::makeCoredNode<OSG::Transform> (&_stone_trans5); OSG::NodeUnrecPtr stone_trans_node6 = OSG::makeCoredNode<OSG::Transform> (&_stone_trans6); OSG::NodeUnrecPtr stone_trans_node7 = OSG::makeCoredNode<OSG::Transform> (&_stone_trans7); OSG::NodeUnrecPtr stone_trans_node8 = OSG::makeCoredNode<OSG::Transform> (&_stone_trans8); OSG::NodeUnrecPtr stone_trans_node9 = OSG::makeCoredNode<OSG::Transform> (&_stone_trans9); _stone_trans1->editMatrix().setTranslate(-70, -70, 0); _stone_trans2->editMatrix().setTranslate(10, -70, 0); _stone_trans3->editMatrix().setTranslate(90, -70, 0); _stone_trans4->editMatrix().setTranslate(-70, 10, 0); _stone_trans5->editMatrix().setTranslate(10, 10, 0); _stone_trans6->editMatrix().setTranslate(90, 10, 0); _stone_trans7->editMatrix().setTranslate(-70, 90, 0); _stone_trans8->editMatrix().setTranslate(10, 90, 0); _stone_trans9->editMatrix().setTranslate(90, 90, 0); OSG::NodeUnrecPtr stone1 = OSG::makeSphere(1, 7.0); OSG::NodeUnrecPtr stone2 = OSG::makeSphere(1, 7.0); OSG::NodeUnrecPtr stone3 = OSG::makeSphere(1, 7.0); OSG::NodeUnrecPtr stone4 = OSG::makeSphere(1, 7.0); OSG::NodeUnrecPtr stone5 = OSG::makeSphere(1, 7.0); OSG::NodeUnrecPtr stone6 = OSG::makeSphere(1, 7.0); OSG::NodeUnrecPtr stone7 = OSG::makeSphere(1, 7.0); OSG::NodeUnrecPtr stone8 = OSG::makeSphere(1, 7.0); OSG::NodeUnrecPtr stone9 = OSG::makeSphere(1, 7.0); OSG::ImageUnrecPtr plane_img2 = OSG::Image::create(); plane_img2->read("stone.jpg"); OSG::TextureObjChunkUnrecPtr plane_tex2_obj = OSG::TextureObjChunk::create(); OSG::TextureEnvChunkUnrecPtr plane_tex2_env = OSG::TextureEnvChunk::create(); plane_tex2_obj->setImage(plane_img2); plane_tex2_obj->setMinFilter(GL_LINEAR); plane_tex2_obj->setMagFilter(GL_LINEAR); plane_tex2_obj->setWrapS(GL_REPEAT); plane_tex2_obj->setWrapT(GL_REPEAT); plane_tex2_env->setEnvMode(GL_MODULATE); OSG::SimpleMaterialUnrecPtr plane_mat2 = OSG::SimpleMaterial::create(); plane_mat2->setAmbient(OSG::Color3f(0.3f, 0.3f, 0.3f)); plane_mat2->setDiffuse(OSG::Color3f(1.0f, 1.0f, 1.0f)); plane_mat2->addChunk(plane_tex2_obj); plane_mat2->addChunk(plane_tex2_env); OSG::Geometry *plane_geo3 = dynamic_cast<OSG::Geometry *>(stone1->getCore()); plane_geo3->setMaterial(plane_mat2); plane_geo3 = dynamic_cast<OSG::Geometry *>(stone2->getCore()); plane_geo3->setMaterial(plane_mat2); plane_geo3 = dynamic_cast<OSG::Geometry *>(stone3->getCore()); plane_geo3->setMaterial(plane_mat2); plane_geo3 = dynamic_cast<OSG::Geometry *>(stone4->getCore()); plane_geo3->setMaterial(plane_mat2); plane_geo3 = dynamic_cast<OSG::Geometry *>(stone5->getCore()); plane_geo3->setMaterial(plane_mat2); plane_geo3 = dynamic_cast<OSG::Geometry *>(stone6->getCore()); plane_geo3->setMaterial(plane_mat2); plane_geo3 = dynamic_cast<OSG::Geometry *>(stone7->getCore()); plane_geo3->setMaterial(plane_mat2); plane_geo3 = dynamic_cast<OSG::Geometry *>(stone8->getCore()); plane_geo3->setMaterial(plane_mat2); plane_geo3 = dynamic_cast<OSG::Geometry *>(stone9->getCore()); plane_geo3->setMaterial(plane_mat2); stone_trans_node1->addChild(stone1); stone_trans_node2->addChild(stone2); stone_trans_node3->addChild(stone3); stone_trans_node4->addChild(stone4); stone_trans_node5->addChild(stone5); stone_trans_node6->addChild(stone6); stone_trans_node7->addChild(stone7); stone_trans_node8->addChild(stone8); stone_trans_node9->addChild(stone9); OSG::NodeUnrecPtr stones = OSG::makeCoredNode<OSG::Group>(); stones->addChild(stone_trans_node1); stones->addChild(stone_trans_node2); stones->addChild(stone_trans_node3); stones->addChild(stone_trans_node4); stones->addChild(stone_trans_node5); stones->addChild(stone_trans_node6); stones->addChild(stone_trans_node7); stones->addChild(stone_trans_node8); stones->addChild(stone_trans_node9); scene->addChild(plane); scene->addChild(obj1_trans_node); scene->addChild(trees); scene->addChild(stones); scene->addChild(dinos); svp = OSG::ShadowStage::create(); OSG::GradientBackgroundUnrecPtr gbg = OSG::GradientBackground::create(); OSG::SolidBackgroundUnrecPtr sbg = OSG::SolidBackground::create(); gbg->addLine(OSG::Color3f(0.7f, 0.7f, 0.8f), 0); gbg->addLine(OSG::Color3f(0.0f, 0.1f, 0.3f), 1); rootNode->setCore(svp); rootNode->addChild(light1); rootNode->addChild(light1_beacon); rootNode->addChild(light2_beacon); rootNode->addChild(cam_beacon); // Shadow viewport #ifdef SHADOW_CHECK svp->setBackground(gbg); svp->setRoot(rootNode); svp->setSize(0, 0, 1, 1); #endif //svp->setOffFactor(4.0); //svp->setOffBias(8.0); //used to set global shadow intensity, ignores shadow intensity from light sources if != 0.0 //svp->setGlobalShadowIntensity(0.8); svp->setMapSize(1024); //ShadowSmoothness used for PCF_SHADOW_MAP and VARIANCE_SHADOW_MAP, defines Filter Width. Range can be 0.0 ... 1.0. //ShadowSmoothness also used to define the light size for PCSS_SHADOW_MAP svp->setShadowSmoothness(0.5); // add light sources here //svp->editMFLightNodes ()->push_back(light1); //svp->editMFLightNodes ()->push_back(light2); svp->editMFExcludeNodes()->push_back(obj1_trans_node); svp->setAutoSearchForLights(true); //one active light at startup _light2_core->setOn(true); _light2_core->setAmbient(0.3f, 0.3f, 0.3f, 1); _light2_core->setDiffuse(0.8f, 0.8f, 0.8f, 1); _light1_core->setOn(false); _light1_core->setAmbient(0.3, 0.3, 0.3, 1); _light1_core->setDiffuse(0.8, 0.8, 0.8, 1); gwin->setGlutId(winid); #ifdef SHADOW_CHECK gwin->addPort(svp); #endif gwin->init(); OSG::Vec3f min, max; rootNode->updateVolume(); rootNode->getVolume().getBounds(min, max); // create the SimpleSceneManager helper mgr = OSG::SimpleSceneManager::create(); mgr->setWindow(gwin); mgr->setCamera(Pcamera); mgr->setRoot(rootNode); _navigator.setMode(OSG::Navigator::TRACKBALL); #ifdef SHADOW_CHECK _navigator.setViewport(svp); #endif _navigator.setCameraTransformation(cam_beacon); OSG::Vec3f up(0,1,0); OSG::Pnt3f at(0,0,0); OSG::Pnt3f from(0.0f,-100.1f,20.0f); _navigator.set(from, at, up); _navigator.setMotionFactor(0.5f); #ifdef SHADOW_CHECK svp->setCamera(Pcamera); #endif //activate Framecounter startFpsCounter(); // dynamic_cast<RenderAction *>(mgr->getAction())->setLocalLights(true); mgr->turnHeadlightOff(); mgr->showAll(); mgr->getCamera()->setNear( 1.0f); mgr->getCamera()->setFar (1000000.f ); _navigator.setViewport(gwin->getPort(0)); 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(); // The scene group OSG::NodeRefPtr scene = OSG::Node::create(); OSG::GroupRefPtr g = OSG::Group::create(); scene->setCore(g); if(argc < 2) { FWARNING(("No file given!\n")); FWARNING(("Supported file formats:\n")); std::list<const char*> suffixes; OSG::SceneFileHandler::the()->getSuffixList(suffixes); for(std::list<const char*>::iterator it = suffixes.begin(); it != suffixes.end(); ++it) { FWARNING(("%s\n", *it)); } fileroot = OSG::makeTorus(.5, 2, 16, 16); } else { fileroot = OSG::SceneFileHandler::the()->read(argv[1]); /* All scene file loading is handled via the SceneFileHandler. */ } scene->addChild(fileroot); // Create a small geometry to show the ray and what was hit // Contains a line and a single triangle. // The line shows the ray, the triangle whatever was hit. OSG::SimpleMaterialRefPtr red = OSG::SimpleMaterial::create(); red->setDiffuse (OSG::Color3f( 1,0,0 )); red->setTransparency(0.5); red->setLit (false); isectPoints = OSG::GeoPnt3fProperty::create(); isectPoints->addValue(OSG::Pnt3f(0,0,0)); isectPoints->addValue(OSG::Pnt3f(0,0,0)); isectPoints->addValue(OSG::Pnt3f(0,0,0)); isectPoints->addValue(OSG::Pnt3f(0,0,0)); isectPoints->addValue(OSG::Pnt3f(0,0,0)); OSG::GeoUInt32PropertyRefPtr index = OSG::GeoUInt32Property::create(); index->addValue(0); index->addValue(1); index->addValue(2); index->addValue(3); index->addValue(4); OSG::GeoUInt32PropertyRefPtr lens = OSG::GeoUInt32Property::create(); lens->addValue(2); lens->addValue(3); OSG::GeoUInt8PropertyRefPtr type = OSG::GeoUInt8Property::create(); type->addValue(GL_LINES); type->addValue(GL_TRIANGLES); testgeocore = OSG::Geometry::create(); testgeocore->setPositions(isectPoints); testgeocore->setIndices(index); testgeocore->setLengths(lens); testgeocore->setTypes(type); testgeocore->setMaterial(red); OSG::NodeRefPtr testgeo = OSG::Node::create(); testgeo->setCore(testgeocore); scene->addChild(testgeo); // 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(); mgr->getCamera()->setNear(mgr->getCamera()->getNear() / 10); // Show the bounding volumes? Not for now mgr->getRenderAction()->setVolumeDrawing(false); _idbuff = new IDbuffer(); _idbuff->setCamera(mgr->getCamera()); _idbuff->setRoot(scene); } // GLUT main loop glutMainLoop(); return 0; }
// 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 the shader material OSG::ChunkMaterialUnrecPtr cmat = OSG::ChunkMaterial::create(); // Read the image for the normal texture OSG::ImageUnrecPtr earth_map_img = OSG::Image::create(); if(!earth_map_img->read("Earth.jpg")) { fprintf(stderr, "Couldn't read texture 'Earth.jpg'\n"); return 1; } OSG::TextureObjChunkUnrecPtr tex_earth = OSG::TextureObjChunk::create(); OSG::TextureEnvChunkUnrecPtr tex_earth_env = OSG::TextureEnvChunk::create(); tex_earth->setImage(earth_map_img); tex_earth->setMinFilter(GL_LINEAR_MIPMAP_LINEAR); tex_earth->setMagFilter(GL_LINEAR); tex_earth->setWrapS(GL_REPEAT); tex_earth->setWrapT(GL_REPEAT); tex_earth_env->setEnvMode(GL_MODULATE); // Read the image for the normal texture OSG::ImageUnrecPtr earth_night_map_img = OSG::Image::create(); if(!earth_night_map_img->read("EarthNight.jpg")) { fprintf(stderr, "Couldn't read texture 'EarthNight.jpg'\n"); return 1; } OSG::TextureObjChunkUnrecPtr tex_earth_night = OSG::TextureObjChunk::create(); OSG::TextureEnvChunkUnrecPtr tex_earth_night_env = OSG::TextureEnvChunk::create(); tex_earth_night->setImage(earth_night_map_img); tex_earth_night->setMinFilter(GL_LINEAR_MIPMAP_LINEAR); tex_earth_night->setMagFilter(GL_LINEAR); tex_earth_night->setWrapS(GL_REPEAT); tex_earth_night->setWrapT(GL_REPEAT); tex_earth_night_env->setEnvMode(GL_MODULATE); // Read the image for the normal texture OSG::ImageUnrecPtr earth_clouds_map_img = OSG::Image::create(); if(!earth_clouds_map_img->read("EarthClouds.jpg")) { fprintf(stderr, "Couldn't read texture 'EarthClouds.jpg'\n"); return 1; } OSG::TextureObjChunkUnrecPtr tex_earth_clouds = OSG::TextureObjChunk::create(); OSG::TextureEnvChunkUnrecPtr tex_earth_clouds_env = OSG::TextureEnvChunk::create(); tex_earth_clouds->setImage(earth_clouds_map_img); tex_earth_clouds->setMinFilter(GL_LINEAR_MIPMAP_LINEAR); tex_earth_clouds->setMagFilter(GL_LINEAR); tex_earth_clouds->setWrapS(GL_REPEAT); tex_earth_clouds->setWrapT(GL_REPEAT); tex_earth_clouds_env->setEnvMode(GL_MODULATE); _shl = OSG::ShaderProgramChunk::create(); _shl_vp = OSG::ShaderProgram::create(); _shl_fp = OSG::ShaderProgram::create(); if(!_shl_vp->readProgram("Earth.vp")) fprintf(stderr, "Couldn't read vertex program 'Earth.vp'\n"); if(!_shl_fp->readProgram("Earth.fp")) fprintf(stderr, "Couldn't read fragment program 'Earth.fp'\n"); _shl_vp->setShaderType(GL_VERTEX_SHADER); _shl_fp->setShaderType(GL_FRAGMENT_SHADER); _shl->addVertexShader (_shl_vp); _shl->addFragmentShader(_shl_fp); _shl_fp->addUniformVariable("EarthDay", 0); _shl_fp->addUniformVariable("EarthNight", 1); _shl_fp->addUniformVariable("EarthCloudGloss", 2); _shl_vp->addUniformVariable("season", 0.0f); _shl_vp->addUniformVariable("cos_time_0_2PI", -0.406652f); _shl_vp->addUniformVariable("sin_time_0_2PI", -0.913583f); // _shl->setUniformParameter("foo", -0.913583f); cmat->addChunk(_shl); cmat->addChunk(tex_earth); cmat->addChunk(tex_earth_env); cmat->addChunk(tex_earth_night); cmat->addChunk(tex_earth_night_env); cmat->addChunk(tex_earth_clouds); cmat->addChunk(tex_earth_clouds_env); // create root node _scene = OSG::Node::create(); OSG::GeometryUnrecPtr geo = OSG::makeLatLongSphereGeo (100, 100, 1.0); geo->setMaterial(cmat); OSG::NodeUnrecPtr torus = OSG::Node::create(); torus->setCore(geo); // add torus to scene OSG::GroupUnrecPtr group = OSG::Group::create(); _scene->setCore(group); _scene->addChild(torus); // 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(); return 0; }
// 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 the shader material OSG::ChunkMaterialUnrecPtr cmat = OSG::ChunkMaterial::create(); OSG::SHLChunkUnrecPtr shl = OSG::SHLChunk::create(); shl->setProgramParameter(GL_GEOMETRY_INPUT_TYPE_EXT, GL_TRIANGLES); shl->setProgramParameter(GL_GEOMETRY_OUTPUT_TYPE_EXT, GL_TRIANGLE_STRIP); shl->setProgramParameter(GL_GEOMETRY_VERTICES_OUT_EXT, 6); shl->setVertexProgram(_vertex_shader); shl->setFragmentProgram(_fragment_shader); shl->setGeometryProgram(_geometry_shader); cmat->addChunk(shl); // create root node _scene = OSG::Node::create(); // create torus OSG::GeometryUnrecPtr geo = OSG::makeTorusGeo(.8, 1.8, 128, 128); geo->setMaterial(cmat); OSG::NodeUnrecPtr torus = OSG::Node::create(); torus->setCore(geo); // add torus to scene OSG::GroupUnrecPtr group = OSG::Group::create(); _scene->setCore(group); _scene->addChild(torus); // 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(); return 0; }
// Initialize GLUT & OpenSG and set up the scene int doMain(int argc, char **argv) { printf("Press key '1', '2', or '3' to toggle the light sources.\n"); // 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 the shader material OSG::ChunkMaterialUnrecPtr cmat = OSG::ChunkMaterial::create(); OSG::MaterialChunkUnrecPtr matc = OSG::MaterialChunk::create(); matc->setAmbient(OSG::Color4f(0.1f, 0.1f, 0.1f, 1.0f)); matc->setDiffuse(OSG::Color4f(0.3f, 0.3f, 0.3f, 1.0f)); matc->setSpecular(OSG::Color4f(0.8f, 0.8f, 0.8f, 1.0f)); matc->setShininess(100); matc->setLit(true); OSG::ShaderProgramChunkUnrecPtr shl = OSG::ShaderProgramChunk::create(); OSG::ShaderProgramUnrecPtr shl_vp = OSG::ShaderProgram::createVertexShader(); shl_vp->setProgram(_vp_program); shl->addShader(shl_vp); OSG::ShaderProgramUnrecPtr shl_fp = OSG::ShaderProgram::createFragmentShader(); shl_fp->setProgram(_fp_program); shl->addShader(shl_fp); shl_vp->addProceduralVariable ("Light0Active", &light0Active); shl_vp->addProceduralVariable ("Light1Active", &light1Active); shl_vp->addNodeProceduralVariable("Light2Active", &light2Active); cmat->addChunk(matc); cmat->addChunk(shl); // create root node _scene = OSG::Node::create(); // create two light sources. OSG::TransformUnrecPtr point1_trans; OSG::NodeUnrecPtr point1 = OSG::makeCoredNode<OSG::PointLight>(&_point1_core); point1_beacon = OSG::makeCoredNode<OSG::Transform >(&point1_trans); point1_trans->editMatrix().setTranslate(-10.0, 5.0, 5.0); _point1_core->setAmbient(0.0f, 0.0f, 0.0f , 1.0f); _point1_core->setDiffuse(1.0f, 0.0f, 0.0f, 1.0f); _point1_core->setSpecular(1.0f, 1.0f, 1.0f, 1.0f); _point1_core->setBeacon(point1_beacon); _point1_core->setOn(true); OSG::TransformUnrecPtr point2_trans; OSG::NodeUnrecPtr point2 = OSG::makeCoredNode<OSG::PointLight>(&_point2_core); point2_beacon = OSG::makeCoredNode<OSG::Transform >(&point2_trans); point2_trans->editMatrix().setTranslate(10.0, 5.0, 5.0); _point2_core->setAmbient(0.0f, 0.0f, 0.0f, 1.0f); _point2_core->setDiffuse(0.0f, 1.0f, 0.0f, 1.0f); _point2_core->setSpecular(1.0f, 1.0f, 1.0f, 1.0f); _point2_core->setBeacon(point2_beacon); _point2_core->setOn(true); point1->addChild(point2); OSG::TransformUnrecPtr point3_trans; OSG::NodeUnrecPtr point3 = OSG::makeCoredNode<OSG::PointLight>(&_point3_core); point3_beacon = OSG::makeCoredNode<OSG::Transform >(&point3_trans); point3_trans->editMatrix().setTranslate(0.0, -12.0, 5.0); _point3_core->setAmbient(0.0f, 0.0f, 0.0f, 1.0f); _point3_core->setDiffuse(0.5f, 0.0f, 1.0f, 1.0f); _point3_core->setSpecular(1.0f, 1.0f, 1.0f, 1.0f); _point3_core->setBeacon(point3_beacon); _point3_core->setOn(true); point2->addChild(point3); // create a sphere. OSG::GeometryUnrecPtr geo = OSG::makeLatLongSphereGeo (100, 100, 1.0); geo->setMaterial(cmat); OSG::NodeUnrecPtr sphere = OSG::makeNodeFor(geo); point3->addChild(sphere); _scene->setCore(OSG::Group::create()); _scene->addChild(point1); // create the SimpleSceneManager helper _mgr = OSG::SimpleSceneManager::create(); // tell the manager what to manage _mgr->setWindow(gwin ); _mgr->setRoot(_scene); _mgr->turnHeadlightOff(); // show the whole scene _mgr->showAll(); // enable local lights. // OSG::RenderAction *ract = // dynamic_cast<OSG::RenderAction *>(_mgr->getRenderAction()); // ract->setLocalLights(true); return 0; }
// Initialize GLUT & OpenSG and set up the scene int main(int argc, char **argv) { printf("Usage: testCGShader [normal map filename]\n"); const char *normal_map_img_name = "opensg_logoDOT3.png"; OSG::Color4f tmp; if( argc > 1 ) normal_map_img_name = argv[1]; // 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 the shader material // Read the image for the normal texture OSG::ImageUnrecPtr normal_map_img = OSG::Image::create(); if(!normal_map_img->read(normal_map_img_name)) { fprintf(stderr, "Couldn't read normalmap texture '%s'!\n", normal_map_img_name); return 1; } OSG::ChunkMaterialUnrecPtr cmat = OSG::ChunkMaterial::create(); OSG::MaterialChunkUnrecPtr matc = OSG::MaterialChunk::create(); matc->setAmbient(OSG::Color4f(0.1, 0.1, 0.1, 1.0)); matc->setDiffuse(OSG::Color4f(0.3, 0.3, 0.3, 1.0)); matc->setSpecular(OSG::Color4f(0.8, 0.8, 0.8, 1.0)); matc->setShininess(100); matc->setLit(true); OSG::SHLChunkUnrecPtr shl = OSG::SHLChunk::create(); shl->setVertexProgram(_vp_program); shl->setFragmentProgram(_fp_program); OSG::TextureObjChunkUnrecPtr tex_normal_map = OSG::TextureObjChunk::create(); OSG::TextureEnvChunkUnrecPtr tex_normal_map_env = OSG::TextureEnvChunk::create(); tex_normal_map->setImage(normal_map_img); tex_normal_map->setMinFilter(GL_LINEAR_MIPMAP_LINEAR); tex_normal_map->setMagFilter(GL_LINEAR); tex_normal_map->setWrapS(GL_REPEAT); tex_normal_map->setWrapT(GL_REPEAT); tex_normal_map_env->setEnvMode(GL_MODULATE); //cmat->addChunk(matc); cmat->addChunk(shl); cmat->addChunk(tex_normal_map); cmat->addChunk(tex_normal_map_env); // create root node _scene = OSG::Node::create(); // create geometry //GeometryPtr geo = makeLatLongSphereGeo (100, 100, 1.0); OSG::GeometryUnrecPtr geo = OSG::makePlaneGeo(1.0, 1.0, 100, 100); geo->setMaterial(cmat); OSG::NodeUnrecPtr torus = OSG::Node::create(); torus->setCore(geo); // add torus to scene OSG::GroupUnrecPtr group = OSG::Group::create(); _scene->setCore(group); _scene->addChild(torus); // create the SimpleSceneManager helper _mgr = OSG::SimpleSceneManager::create(); // tell the manager what to manage _mgr->setWindow(gwin ); _mgr->setRoot(_scene); /* // create point headlight _mgr->turnHeadlightOff(); NodePtr headlight = _mgr->getHighlight(); PointLightPtr light = PointLight::create(); beginEditCP(light); light->setAmbient (.3, .3, .3, 1); light->setDiffuse ( 1, 1, 1, 1); light->setSpecular ( 1, 1, 1, 1); light->setBeacon (_mgr->getCamera()->getBeacon()); endEditCP(light); beginEditCP(_scene); _scene->setCore(light); endEditCP(_scene); */ // show the whole scene _mgr->showAll(); // GLUT main loop glutMainLoop(); return 0; }
// 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 main(int argc, char **argv) { // OSG init OSG::osgInit(argc,argv); // GLUT init int winid = setupGLUT(&argc, argv); { // the connection between GLUT and OpenSG OSG::GLUTWindowRefPtr gwin = OSG::GLUTWindow::create(); gwin->setGlutId(winid); gwin->init(); // create the scene OSG::NodeRefPtr torus = OSG::makeTorus( .5, 2, 16, 32 ); OSG::NodeRefPtr scene = OSG::Node::create(); trans = OSG::Transform::create(); scene->setCore(trans); scene->addChild(torus); // Create the parts needed for the video background OSG::UInt32 width = 640; OSG::UInt32 height = 480; // get the desired size from the command line if(argc >= 3) { width = atoi(argv[1]); height = atoi(argv[2]); } // To check OpenGL extensions, the Window needs to have run through // frameInit at least once. This automatically happens when rendering, // but we can't wait for that here. gwin->activate (); gwin->frameInit(); // Now we can check for OpenGL extensions hasNPOT = gwin->hasExtension("GL_ARB_texture_non_power_of_two"); // Print what we've got SLOG << "Got " << (isPOT?"":"non-") << "power-of-two images and " << (hasNPOT?"can":"cannot") << " use NPOT textures, changing " << (changeOnlyPart?"part":"all") << " of the screen" << std::endl; // Ok, now for the meat of the code... // first we need an Image to hold the picture(s) to show image = OSG::Image::create(); // set the image's size and type, and allocate memory // this example uses RGB. On some systems (e.g. Windows) BGR // or BGRA might be faster, it depends on how the images are // acquired image->set(OSG::Image::OSG_RGB_PF, width, height); // Now create the texture to be used for the background texObj = OSG::TextureObjChunk::create(); // Associate image and texture texObj->setImage(image); // Set filtering modes. LINEAR is cheap and good if the image size // changes very little (i.e. the window is about the same size as // the images). texObj->setMinFilter(GL_LINEAR); texObj->setMagFilter(GL_LINEAR); // Set the wrapping modes. We don't need repetition, it might actually // introduce artifactes at the borders, so switch it off. texObj->setWrapS(GL_CLAMP_TO_EDGE); texObj->setWrapT(GL_CLAMP_TO_EDGE); // Newer versions of OpenGL can handle NPOT textures directly. // OpenSG will do that internally automatically. // // Older versions need POT textures. By default OpenSG // will scale an NPOT texture to POT while defining it. // For changing textures that's too slow. // So tell OpenSG not to scale the image and adjust the texture // coordinates used by the TextureBackground (see below). texObj->setScale(false); // Create the background OSG::TextureBackgroundRefPtr back = OSG::TextureBackground::create(); // Set the texture to use back->setTexture(texObj); // if the image is NPOT and we don't have hardware support for it // adjust the texture coordinates. if(isPOT == false && hasNPOT == false) { OSG::UInt32 potWidth = OSG::osgNextPower2(width ); OSG::UInt32 potHeight = OSG::osgNextPower2(height); OSG::Real32 tcRight = OSG::Real32(width ) / OSG::Real32(potWidth ); OSG::Real32 tcTop = OSG::Real32(height) / OSG::Real32(potHeight); back->editMFTexCoords()->push_back(OSG::Vec2f( 0.f, 0.f)); back->editMFTexCoords()->push_back(OSG::Vec2f(tcRight, 0.f)); back->editMFTexCoords()->push_back(OSG::Vec2f(tcRight, tcTop)); back->editMFTexCoords()->push_back(OSG::Vec2f( 0.f, tcTop)); } OSG::commitChanges(); // create the SimpleSceneManager helper mgr = OSG::SimpleSceneManager::create(); // tell the manager what to manage mgr->setWindow(gwin ); mgr->setRoot (scene); mgr->setStatistics(true); // replace the background // This has to be done after the viewport has been created, which the // SSM does in setRoot(). OSG::ViewportRefPtr vp = gwin->getPort(0); vp->setBackground(back); } // show the whole scene mgr->showAll(); // GLUT main loop glutMainLoop(); return 0; }