Improved the handling of update/event callbacks on Drawable and Geodes

This commit is contained in:
Robert Osfield
2005-05-02 09:57:58 +00:00
parent 0b291e60bb
commit 938d13ecc7
2 changed files with 16 additions and 10 deletions

View File

@@ -265,6 +265,9 @@ class OSG_EXPORT Drawable : public Object
/** Get the const UpdateCallback.*/
const UpdateCallback* getUpdateCallback() const { return _updateCallback.get(); }
/** Return whether this Drawable has update callbacks associated with it, and therefore must be traversed.*/
bool requiresUpdateTraversal() const { return _updateCallback.valid() || (_stateset.valid() && _stateset->requiresUpdateTraversal()); }
struct EventCallback : public virtual osg::Object
{
@@ -287,6 +290,9 @@ class OSG_EXPORT Drawable : public Object
/** Get the const EventCallback.*/
const EventCallback* getEventCallback() const { return _eventCallback.get(); }
/** Return whether this Drawable has event callbacks associated with it, and therefore must be traversed.*/
bool requiresEventTraversal() const { return _eventCallback.valid() || (_stateset.valid() && _stateset->requiresEventTraversal()); }
struct CullCallback : public virtual osg::Object
{

View File

@@ -57,12 +57,12 @@ bool Geode::addDrawable( Drawable *drawable )
// register as parent of drawable.
drawable->addParent(this);
if (drawable->getUpdateCallback() && !(_stateset.valid() && _stateset->requiresUpdateTraversal()))
if (drawable->requiresUpdateTraversal())
{
setNumChildrenRequiringUpdateTraversal(getNumChildrenRequiringUpdateTraversal()+1);
}
if (drawable->getEventCallback() && !(_stateset.valid() && _stateset->requiresEventTraversal()))
if (drawable->requiresEventTraversal())
{
setNumChildrenRequiringEventTraversal(getNumChildrenRequiringEventTraversal()+1);
}
@@ -99,18 +99,18 @@ bool Geode::removeDrawable(unsigned int pos,unsigned int numDrawablesToRemove)
// remove this Geode from the child parent list.
_drawables[i]->removeParent(this);
// update the number of app calbacks removed
if (_drawables[i]->getUpdateCallback()) ++updateCallbackRemoved;
if (_drawables[i]->getEventCallback()) ++eventCallbackRemoved;
if (_drawables[i]->requiresUpdateTraversal()) ++updateCallbackRemoved;
if (_drawables[i]->requiresEventTraversal()) ++eventCallbackRemoved;
}
_drawables.erase(_drawables.begin()+pos,_drawables.begin()+endOfRemoveRange);
if (updateCallbackRemoved && !(_stateset.valid() && _stateset->requiresUpdateTraversal()))
if (updateCallbackRemoved)
{
setNumChildrenRequiringUpdateTraversal(getNumChildrenRequiringUpdateTraversal()-updateCallbackRemoved);
}
if (eventCallbackRemoved && !(_stateset.valid() && _stateset->requiresEventTraversal()))
if (eventCallbackRemoved)
{
setNumChildrenRequiringEventTraversal(getNumChildrenRequiringEventTraversal()-eventCallbackRemoved);
}
@@ -142,16 +142,16 @@ bool Geode::setDrawable( unsigned int i, Drawable* newDrawable )
Drawable* origDrawable = _drawables[i].get();
int deltaUpdate = 0;
if (origDrawable->getUpdateCallback()) --deltaUpdate;
if (newDrawable->getUpdateCallback()) ++deltaUpdate;
if (origDrawable->requiresUpdateTraversal()) --deltaUpdate;
if (newDrawable->requiresUpdateTraversal()) ++deltaUpdate;
if (deltaUpdate!=0)
{
setNumChildrenRequiringUpdateTraversal(getNumChildrenRequiringUpdateTraversal()+deltaUpdate);
}
int deltaEvent = 0;
if (origDrawable->getEventCallback()) --deltaEvent;
if (newDrawable->getEventCallback()) ++deltaEvent;
if (origDrawable->requiresEventTraversal()) --deltaEvent;
if (newDrawable->requiresEventTraversal()) ++deltaEvent;
if (deltaEvent!=0)
{
setNumChildrenRequiringEventTraversal(getNumChildrenRequiringEventTraversal()+deltaEvent);