[osg-users] Collect all the osg::Materials from a osg::Node using osg::NodeVisitor

Robert Osfield robert.osfield at gmail.com
Fri Aug 26 09:27:40 PDT 2016


On 26 August 2016 at 17:13, Trajce Nikolov NICK
<trajce.nikolov.nick at gmail.com> wrote:
> Ok :-) .. I will answer it too .....
>
> I am working with older version of osg where the Geometry was still not
> inherited from Node so I had to apply a special case for Geodes ... Sorry
> for the noise ;-)

Glad to hear you spotted the problem.

One thing that jumped out at me when I read the code was that you call
getOrCreateStateSet(), this might simplify the code but is terribly
inefficient for both this traversal and any subsequent use of the
scene graph as it will force the creation of StateSet's for all nodes
in the scene graph.  Most nodes in a scene graph should never need a
StateSet so you certainly don't want to go around assigning empty
ones.

What a better check would be:

void apply(osg::Node& node)
{
  if (node.getStateSet()) apply(*node.getStateSet())l
}

void apply(osg::StateSet& stateset)
{
        osg::StateAttribute* attr =
stateset>getAttribute(osg::StateAttribute::MATERIAL);
        if (attr)
        {
            std::cout << "ATTRIBUTE: " << attr->getName() << std::endl;

            osg::Material* material = dynamic_cast<osg::Material*>(attr);
            if (material && (material->getName() != "@RootMaterial@"))
            {
                std::cout << "MATERIAL: " << material->getName() <<
std::endl;
            }
        }
}



More information about the osg-users mailing list