// redraw the window void display(void) { // redraw the client window _mgr->redraw(); OSG::commitChanges(); try { if(_cluster_win != NULL) { OSG::Thread::getCurrentChangeList()->dump(); // redraw the server windows _cluster_win->render((OSG::RenderAction *) _mgr->getRenderAction()); } } catch(OSG_STDEXCEPTION_NAMESPACE::exception &e) { //printf("error: '%s'\n", e.what()); printf("ClusterServer was killed!\n"); _cluster_win = NULL; } OSG::commitChanges(); OSG::clearChangeList(); }
static void connectCluster(void) { if(_cluster_win != NULL) return; OSG::Viewport *clientvp = _client_win->getPort(0); // create the viewports for the cluster just a simple one ... OSG::ViewportUnrecPtr vp = OSG::Viewport::create(); vp->setCamera (_mgr->getCamera()); vp->setBackground(clientvp->getBackground()); vp->setRoot (clientvp->getRoot()); vp->setSize (0,0, 1,1); // the connection between this client and the servers _cluster_win = OSG::MultiDisplayWindow::create(); // all changes must be enclosed in beginEditCP and endEditCP // otherwise the changes will not be transfered over the network. for(OSG::UInt32 i=0;i<_pipenames.size();++i) _cluster_win->editMFServers()->push_back(_pipenames[i]); // dummy size for navigator _cluster_win->setSize(300,300); _cluster_win->addPort(vp); OSG::Thread::getCurrentChangeList()->commitChangesAndClear(); OSG::Thread::getCurrentChangeList()->fillFromCurrentState(); OSG::Thread::getCurrentChangeList()->dump(); // create from the current state a changelist. // initialize window _cluster_win->init(); // apply changelist to the servers _cluster_win->render((OSG::RenderAction *) _mgr->getRenderAction()); // clear changelist OSG::Thread::getCurrentChangeList()->clear(); glutPostRedisplay(); }
// 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); // 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; }