Moved the _boundingSphere set method into the update section of the Drawable::getBoundingBox() method

Added an UpdateVisitor::apply(Drawable&) implementation.
This commit is contained in:
Robert Osfield 2014-05-20 16:09:34 +00:00
parent e70acf4c51
commit 30b54e3af2
2 changed files with 19 additions and 6 deletions

View File

@ -145,18 +145,20 @@ class OSG_EXPORT Drawable : public Node
if(!_boundingSphereComputed)
{
_boundingBox = _initialBound;
if (_computeBoundCallback.valid())
_boundingBox.expandBy(_computeBoundCallback->computeBound(*this));
else
_boundingBox.expandBy(computeBoundingBox());
if(_boundingBox.valid()){
_boundingSphere.set(_boundingBox.center(), _boundingBox.radius());
} else {
_boundingSphere.init();
}
_boundingSphereComputed = true;
}
if(_boundingBox.valid()){
_boundingSphere.set(_boundingBox.center(), _boundingBox.radius());
} else {
_boundingSphere.init();
}
return _boundingBox;
}

View File

@ -46,7 +46,18 @@ class OSGUTIL_EXPORT UpdateVisitor : public osg::NodeVisitor
virtual void reset();
/** During traversal each type of node calls its callbacks and its children traversed. */
virtual void apply(osg::Node& node) { handle_callbacks_and_traverse(node); }
virtual void apply(osg::Node& node) { handle_callbacks_and_traverse(node); }
virtual void apply(osg::Drawable& drawable)
{
osg::Drawable::UpdateCallback* callback = drawable.getUpdateCallback();
if (callback) callback->update(this,&drawable);
osg::NodeCallback* node_callback = drawable.osg::Node::getUpdateCallback();
if (node_callback) (*node_callback)(&drawable, this);
handle_callbacks(drawable.getStateSet());
}
virtual void apply(osg::Geode& node) { handle_geode_callbacks(node); }
virtual void apply(osg::Billboard& node) { handle_geode_callbacks(node); }