diff --git a/include/osg/NodeVisitor b/include/osg/NodeVisitor index 842b8b791..d94574ff0 100644 --- a/include/osg/NodeVisitor +++ b/include/osg/NodeVisitor @@ -194,13 +194,14 @@ class SG_EXPORT NodeVisitor : public Referenced virtual void apply(Geode& node) { apply((Node&)node); } virtual void apply(Billboard& node) { apply((Geode&)node); } - virtual void apply(LightSource& node) { apply((Node&)node); } - virtual void apply(ClipNode& node) { apply((Node&)node); } virtual void apply(Group& node) { apply((Node&)node); } virtual void apply(Projection& node) { apply((Group&)node); } + virtual void apply(ClipNode& node) { apply((Group&)node); } + virtual void apply(LightSource& node) { apply((Group&)node); } + virtual void apply(Transform& node) { apply((Group&)node); } virtual void apply(DOFTransform& node) { apply((Transform&)node); } virtual void apply(MatrixTransform& node) { apply((Transform&)node); } diff --git a/src/osgUtil/CullVisitor.cpp b/src/osgUtil/CullVisitor.cpp index 13c3c0667..2e2032794 100644 --- a/src/osgUtil/CullVisitor.cpp +++ b/src/osgUtil/CullVisitor.cpp @@ -58,8 +58,8 @@ class PrintVisitor : public NodeVisitor virtual void apply(Geode& node) { apply((Node&)node); } virtual void apply(Billboard& node) { apply((Geode&)node); } - virtual void apply(LightSource& node) { apply((Node&)node); } - virtual void apply(ClipNode& node) { apply((Node&)node); } + virtual void apply(LightSource& node) { apply((Group&)node); } + virtual void apply(ClipNode& node) { apply((Group&)node); } virtual void apply(Group& node) { apply((Node&)node); } virtual void apply(Transform& node) { apply((Group&)node); } @@ -382,6 +382,8 @@ void CullVisitor::apply(LightSource& node) addPositionedAttribute(&matrix,light); } + handle_cull_callbacks_and_traverse(node); + // pop the node's state off the geostate stack. if (node_state) popStateSet(); } diff --git a/src/osgUtil/Optimizer.cpp b/src/osgUtil/Optimizer.cpp index f6176a1eb..53a9d2ee2 100644 --- a/src/osgUtil/Optimizer.cpp +++ b/src/osgUtil/Optimizer.cpp @@ -933,7 +933,8 @@ void Optimizer::RemoveEmptyNodesVisitor::apply(osg::Group& group) if (group.getNumParents()>0) { // only remove empty groups, but not empty occluders. - if (group.getNumChildren()==0 && !dynamic_cast(&group)) + if (group.getNumChildren()==0 && + (typeid(group)==typeid(osg::Group) || dynamic_cast(&group))) { _redundentNodeList.insert(&group); }