Esempio n. 1
0
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;
}
Esempio n. 2
0
// 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;
}