From Jannik Heller, "This submission makes the osgFX::Technique traverse as a normal Group if the visitor is not a cull visitor.

As for motivation behind the change, I think it makes more sense that way because only the CullVisitor cares about rendering. Say an intersection visitor or update visitor only needs to traverse the subgraph once, not once for each pass. For these visitors there is no point in traversing the subgraph more than once, since it's exactly the same graph. Another motivation is the performance improvement had when an intersection visitor tests against a multipass Technique."

 Note about mods by Robert Osfield, "Changed dyanmic_cast<> and check against getTraversalType() to utilize the new asCullVisitor() instead to improve efficiency."
This commit is contained in:
Robert Osfield
2016-03-01 11:57:02 +00:00
parent 707c1a32aa
commit 33b838e437

View File

@@ -42,28 +42,30 @@ void Technique::traverse_implementation(osg::NodeVisitor& nv, Effect* fx)
}
// special actions must be taken if the node visitor is actually a CullVisitor
osgUtil::CullVisitor *cv = nv.asCullVisitor();
// traverse all passes
for (int i=0; i<getNumPasses(); ++i) {
// push the i-th pass' StateSet if necessary
if (cv) {
osgUtil::CullVisitor* cv = nv.asCullVisitor();
if (cv)
{
// traverse all passes
for (int i=0; i<getNumPasses(); ++i)
{
// push the i-th pass' StateSet
cv->pushStateSet(_passes[i].get());
}
// traverse the override node if defined, otherwise
// traverse children as a Group would do
osg::Node *override = getOverrideChild(i);
if (override) {
override->accept(nv);
} else {
fx->inherited_traverse(nv);
}
// traverse the override node if defined, otherwise
// traverse children as a Group would do
osg::Node *override = getOverrideChild(i);
if (override) {
override->accept(nv);
} else {
fx->inherited_traverse(nv);
}
// pop the StateSet if necessary
if (cv) {
// pop the StateSet
cv->popStateSet();
}
}
else
{
fx->inherited_traverse(nv);
}
}