NodePtr PerformerLoader::traverse(pfNode *node) { FINFO(("PfL:traverse: traversing \"%s\": %p (%s)\n", node->getName()?node->getName():"Unnamed", node, pfGetTypeName(node))); if(_nodes.find(node) != _nodes.end()) { FINFO(("PfL:traverse: found in nodemap as %p.\n", _nodes[node].getCPtr())); return cloneTree(_nodes[node]); } NodePtr n = Node::create(); NodeCorePtr core = NullFC; beginEditCP(n); setName(n, node->getName()); if (node->getType()->isDerivedFrom(pfGroup::getClassType())) { pfGroup *group = dynamic_cast<pfGroup *>(node); int ind = 0; int num = group->getNumChildren(); if (node->getType()->isDerivedFrom(pfLOD::getClassType())) { if(_highestLODOnly) { num = osgMin(num, 1); core = Group::create(); } else { pfLOD *lod = dynamic_cast<pfLOD *>(node); DistanceLODPtr l = DistanceLOD::create(); beginEditCP(l); for(int i = 0; i < lod->getNumRanges(); ++i) { l->getRange().push_back(lod->getRange(i)); } endEditCP(l); core = l; } } else if (node->getType()->isDerivedFrom(pfSCS::getClassType())) { pfSCS *scs = dynamic_cast<pfSCS *>(node); if (node->getType()->isDerivedFrom(pfDCS::getClassType())) { } pfMatrix pmat; scs->getMat(pmat); Matrix omat; omat.setValue( pmat[0][0], pmat[0][1], pmat[0][2], pmat[0][3], pmat[1][0], pmat[1][1], pmat[1][2], pmat[1][3], pmat[2][0], pmat[2][1], pmat[2][2], pmat[2][3], pmat[3][0], pmat[3][1], pmat[3][2], pmat[3][3]); omat.transpose(); TransformPtr t = Transform::create(); beginEditCP(t); t->setMatrix(omat); endEditCP(t); core = t; } else if (node->getType()->isDerivedFrom(pfScene::getClassType())) { FWARNING(("PerformerLoader::traverse: encountered scene " "group!\n")); } else if (node->getType()->isDerivedFrom(pfLayer::getClassType())) { FWARNING(("PerformerLoader::traverse: encountered layer " "group!\n")); } else if (node->getType() != pfGroup::getClassType()) { FWARNING(("PerformerLoader::traverse: encountered unknown group" " node of type %s\n", pfGetTypeName(node))); core = Group::create(); } else { core = Group::create(); } for (;ind < num; ind++) { NodePtr cn = traverse(group->getChild(ind)); if(cn != NullFC) n->addChild(cn); } } else if (node->getType()->isDerivedFrom(pfGeode::getClassType())) { pfGeode *geode = dynamic_cast<pfGeode *>(node); int num; if (node->getType()->isDerivedFrom(pfBillboard::getClassType())) { num = geode->getNumGSets(); } else if(node->getType()->isDerivedFrom(pfParaSurface::getClassType())) { FWARNING(("PerformerLoader::traverse: encountered parametric" " surface %s\n", pfGetTypeName(node))); } else num = geode->getNumGSets(); if(num == 1) { core = traverseGSet(n, geode->getGSet(0)); } else { core = Group::create(); for (int i = 0; i < num; i++) { GeometryPtr geo = traverseGSet(n, geode->getGSet(i)); if(geo != NullFC) { n->addChild(makeNodeFor(geo)); } } } } else if (node->getType()->isDerivedFrom(pfLightSource::getClassType())) { FWARNING(("PerformerLoader::traverse: encountered light source!\n")); } else { FWARNING(("PerformerLoader::traverse: encountered unhandled node" " of type %s\n", pfGetTypeName(node))); return NullFC; } if(core != NullFC) { n->setCore(core); } else { n->setCore(Group::create()); FWARNING(("PerformerLoader::traverse: couldn't create core!\n")); } endEditCP(n); _nodes[node] = n; FINFO(("PfL:traverse: adding \"%s\": %p to nodelist using %p\n", node->getName()?node->getName():"Unnamed", node, n.getCPtr())); return n; }
// Initialize GLUT & OpenSG and set up the scene int main(int argc, char **argv) { // OSG init osgInit(argc,argv); // GLUT init int winid = setupGLUT(&argc, argv); // the connection between GLUT and OpenSG GLUTWindowPtr gwin= GLUTWindow::create(); gwin->setId(winid); gwin->init(); // load the scene NodePtr scene; if(argc < 2) { FWARNING(("No file given!\n")); FWARNING(("Supported file formats:\n")); std::list<const char*> suffixes; SceneFileHandler::the().getSuffixList(suffixes); for(std::list<const char*>::iterator it = suffixes.begin(); it != suffixes.end(); ++it) { FWARNING(("%s\n", *it)); } scene = makeTorus(.5, 2, 16, 16); } else { /* All scene file loading is handled via the SceneFileHandler. */ scene = SceneFileHandler::the().read(argv[1]); } // create the SimpleSceneManager helper mgr = new SimpleSceneManager; // tell the manager what to manage mgr->setWindow(gwin ); mgr->setRoot (scene); FWARNING(("scene: %p %lu\n", scene.getCPtr(), scene.getCPtr())); // show the whole scene mgr->showAll(); // start the debug tool startSceneGraphViewThread(scene); // GLUT main loop glutMainLoop(); // stop the debug tool stopSceneGraphViewThread(); return 0; }