Hi,

At cull traversal, I do the following (this is pseudo-code!) :


Code:
cullTraversal(pCullVisitor)
{
    // Get per-view-data
    perViewData = getOrCreatePerViewData(pCullVisitor);

    // Compute "dynamic" uniforms
    perViewData.pDynamicUniform_1->set(value);
    perViewData.pDynamicUniform_2->set(value);
    perViewData.pDynamicUniform_3->set(value);

    // Push per-view data
    pCullVisitor->pushStateSet(perViewData.pStateSet);

    // Traverse node
    traverse(....)

    // Pop per-view data
    pCullVisitor->popStateSet();
}



The "getOrCreatePerViewData" method returns a "PerViewData" struct :


Code:

struct PerViewData
{
    osg::ref_ptr<osg::StateSet> pStateSet;
    osg::ref_ptr<osg::Uniform> pDynamicUniform_1;
    osg::ref_ptr<osg::Uniform> pDynamicUniform_2;
    osg::ref_ptr<osg::Uniform> pDynamicUniform_3;

    PerViewData()
    {
        pStateSet = new osg::StateSet();

        pDynamicUniform_1 = osg::Uniform();
        pDynamicUniform_2 = osg::Uniform();
        pDynamicUniform_3 = osg::Uniform();

        pStateSet->addUniform(pDynamicUniform_1);
        pStateSet->addUniform(pDynamicUniform_2);
        pStateSet->addUniform(pDynamicUniform_3);
     }
}

PerViewData getOrCreatePerViewData(pCullVisitor)
{
     return m_perViewDataMap[pCullVisitor];
}




Just be carrefull to :

- remove "PerViewData" instance from the "m_perViewDataMap" when the 
corresponding "pCullVisitor" instance is destroyed. (use an osg::Observer here)
- add any necessary mutex in multithreading mode



Cheers,
Aurelien

------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=56957#56957





_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to