// 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(); }
// react to keys void keyboard(unsigned char k, int , int ) { switch (k) { case 27: { mgr = NULL; delete gTextStuff; OSG::commitChanges(); OSG::osgExit(); exit(0); } break; case '-': gTextStuff->incFaceSize(false); break; case '=': gTextStuff->incFaceSize(true); break; case '[': gTextStuff->incTextureSize(false); break; case ']': gTextStuff->incTextureSize(true); break; case '<': gTextStuff->incMaxExtent(false); break; case '>': gTextStuff->incMaxExtent(true); break; case ',': gTextStuff->incLineSpacing(false); break; case '.': gTextStuff->incLineSpacing(true); break; case '{': gTextStuff->incGeoScale(false); break; case '}': gTextStuff->incGeoScale(true); break; case 'f': gTextStuff->goToNextFamily(); break; case 'd': OSG::SceneFileHandler::the()->write(mgr->getRoot(),"dump_scene.osb"); std::cout << "Wrote out scene: dump_scene.osb" << std::endl; break; case 't': mgr->setNavigationMode(OSG::Navigator::TRACKBALL); break; case 'l': mgr->setHeadlight(!mgr->getHeadlightState()); std::cout << "Set headlight: " << mgr->getHeadlightState() << std::endl; break; case 'z': glPolygonMode( GL_FRONT_AND_BACK, GL_POINT); std::cerr << "PolygonMode: Point." << std::endl; break; case 'x': glPolygonMode( GL_FRONT_AND_BACK, GL_LINE); std::cerr << "PolygonMode: Line." << std::endl; break; case 'c': glPolygonMode( GL_FRONT_AND_BACK, GL_FILL); std::cerr << "PolygonMode: Fill." << std::endl; break; case 'h': std::cerr << "Keys:" << std::endl; std::cerr << "- =: change face size" << std::endl; std::cerr << "{ }: change geo scale" << std::endl; std::cerr << "[ ]: change texture size" << std::endl; std::cerr << "< >: change max extend for 1st line" << std::endl; std::cerr << ", .: change line spacing" << std::endl; std::cerr << "f : next font family" << std::endl; std::cerr << "d : dump scene" << std::endl; } }