From e8d6df7583f055d09fde82557b688147f7752591 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Thu, 10 Nov 2005 11:39:01 +0000 Subject: [PATCH] Addd OsgSceneHandler::s/getCleanUpOnNextFrame() and support for it in the draw() method, when CleanUpOnNextFrame is enabled the next frame simple deleted OpenGL objects without doing any draw traversal. --- include/osgProducer/OsgSceneHandler | 27 ++++++++++++++----- src/osgProducer/OsgCameraGroup.cpp | 2 +- src/osgProducer/OsgSceneHandler.cpp | 1 + .../osgProducer/OsgSceneHandler.cpp | 3 +++ 4 files changed, 25 insertions(+), 8 deletions(-) diff --git a/include/osgProducer/OsgSceneHandler b/include/osgProducer/OsgSceneHandler index ec80128ab..854e92c7a 100644 --- a/include/osgProducer/OsgSceneHandler +++ b/include/osgProducer/OsgSceneHandler @@ -76,18 +76,26 @@ class OSGPRODUCER_EXPORT OsgSceneHandler : public Producer::Camera::SceneHandler Callback* getCullCallback() { return _cullCallback.get(); } const Callback* getCullCallback() const { return _cullCallback.get(); } - virtual void draw(Producer::Camera& camera) { - if (_flushOfAllDeletedGLObjectsOnNextFrame && _sceneView.valid()) + if (_cleanUpOnNextFrame) { _sceneView->flushAllDeletedGLObjects(); + _flushOfAllDeletedGLObjectsOnNextFrame = false; + _cleanUpOnNextFrame = false; + } + else + { + if (_flushOfAllDeletedGLObjectsOnNextFrame && _sceneView.valid()) + { + _sceneView->flushAllDeletedGLObjects(); + } + + if (_drawCallback.valid()) (*_drawCallback)(*this,camera); + else drawImplementation(camera); + + _flushOfAllDeletedGLObjectsOnNextFrame = false; } - - if (_drawCallback.valid()) (*_drawCallback)(*this,camera); - else drawImplementation(camera); - - _flushOfAllDeletedGLObjectsOnNextFrame = false; } virtual void drawImplementation(Producer::Camera& camera); @@ -102,6 +110,10 @@ class OSGPRODUCER_EXPORT OsgSceneHandler : public Producer::Camera::SceneHandler bool getFlushOfAllDeletedGLObjectsOnNextFrame() const { return _flushOfAllDeletedGLObjectsOnNextFrame; } + void setCleanUpOnNextFrame(bool flag) { _cleanUpOnNextFrame = flag; } + + bool getCleanUpOnNextFrame() const { return _cleanUpOnNextFrame; } + protected: virtual ~OsgSceneHandler() {} @@ -117,6 +129,7 @@ class OSGPRODUCER_EXPORT OsgSceneHandler : public Producer::Camera::SceneHandler osg::Timer_t _previousFrameStartTick; bool _flushOfAllDeletedGLObjectsOnNextFrame; + bool _cleanUpOnNextFrame; }; } diff --git a/src/osgProducer/OsgCameraGroup.cpp b/src/osgProducer/OsgCameraGroup.cpp index 4241ab3f2..f9661d53f 100644 --- a/src/osgProducer/OsgCameraGroup.cpp +++ b/src/osgProducer/OsgCameraGroup.cpp @@ -736,7 +736,7 @@ void OsgCameraGroup::cleanup_frame() ++itr) { (*itr)->getSceneView()->releaseAllGLObjects(); - (*itr)->setFlushOfAllDeletedGLObjectsOnNextFrame(true); + (*itr)->setCleanUpOnNextFrame(true); } // make sure that the registry all flushes all its texture objects. diff --git a/src/osgProducer/OsgSceneHandler.cpp b/src/osgProducer/OsgSceneHandler.cpp index f8522fce8..54f628095 100644 --- a/src/osgProducer/OsgSceneHandler.cpp +++ b/src/osgProducer/OsgSceneHandler.cpp @@ -26,6 +26,7 @@ OsgSceneHandler::OsgSceneHandler( osg::DisplaySettings *ds) : _frameStartTick = 0; _previousFrameStartTick = 0; _flushOfAllDeletedGLObjectsOnNextFrame = false; + _cleanUpOnNextFrame = false; } void OsgSceneHandler::init() diff --git a/src/osgWrappers/osgProducer/OsgSceneHandler.cpp b/src/osgWrappers/osgProducer/OsgSceneHandler.cpp index e8972ac9d..3954742dd 100644 --- a/src/osgWrappers/osgProducer/OsgSceneHandler.cpp +++ b/src/osgWrappers/osgProducer/OsgSceneHandler.cpp @@ -45,6 +45,9 @@ BEGIN_OBJECT_REFLECTOR(osgProducer::OsgSceneHandler) I_Method1(void, setContextID, IN, int, id); I_Method1(void, setFlushOfAllDeletedGLObjectsOnNextFrame, IN, bool, flag); I_Method0(bool, getFlushOfAllDeletedGLObjectsOnNextFrame); + I_Method1(void, setCleanUpOnNextFrame, IN, bool, flag); + I_Method0(bool, getCleanUpOnNextFrame); + I_Property(bool, CleanUpOnNextFrame); I_Property(osgProducer::OsgSceneHandler::Callback *, ClearCallback); I_WriteOnlyProperty(int, ContextID); I_Property(osgProducer::OsgSceneHandler::Callback *, CullCallback);