From dd958be8a4e41f566481ddd45181ec6362a24169 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Thu, 11 Jan 2007 10:21:11 +0000 Subject: [PATCH] Added setThreadSafeRefUnref, resizeGLObjectBuffers and releaseGLObjects to OverlayNode --- include/osgSim/OverlayNode | 11 +++++++++++ src/osgSim/OverlayNode.cpp | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/include/osgSim/OverlayNode b/include/osgSim/OverlayNode index ad10f9684..8c70e0008 100644 --- a/include/osgSim/OverlayNode +++ b/include/osgSim/OverlayNode @@ -87,6 +87,17 @@ class OSGSIM_EXPORT OverlayNode : public osg::Group /** Get the const camera used to implement the render to texture of the overlay subgraph.*/ const osg::Camera* getCamera() const { return _camera.get(); } + /** Set whether to use a mutex to ensure ref() and unref() are thread safe.*/ + virtual void setThreadSafeRefUnref(bool threadSafe); + + /** Resize any per context GLObject buffers to specified size. */ + virtual void resizeGLObjectBuffers(unsigned int /*maxSize*/); + + /** If State is non-zero, this function releases any associated OpenGL objects for + * the specified graphics context. Otherwise, releases OpenGL objexts + * for all graphics contexts. */ + virtual void releaseGLObjects(osg::State* = 0) const; + protected : virtual ~OverlayNode() {} diff --git a/src/osgSim/OverlayNode.cpp b/src/osgSim/OverlayNode.cpp index 50261d365..34887fd75 100644 --- a/src/osgSim/OverlayNode.cpp +++ b/src/osgSim/OverlayNode.cpp @@ -45,6 +45,39 @@ OverlayNode::OverlayNode(const OverlayNode& copy, const osg::CopyOp& copyop): init(); } +void OverlayNode::setThreadSafeRefUnref(bool threadSafe) +{ + osg::Group::setThreadSafeRefUnref(threadSafe); + + if (_camera.valid()) _camera->setThreadSafeRefUnref(threadSafe); + if (_overlaySubgraph.valid()) _overlaySubgraph->setThreadSafeRefUnref(threadSafe); + if (_texgenNode.valid()) _texgenNode->setThreadSafeRefUnref(threadSafe); + if (_mainSubgraphStateSet.valid()) _mainSubgraphStateSet->setThreadSafeRefUnref(threadSafe); + if (_texture.valid()) _texture->setThreadSafeRefUnref(threadSafe); +} + +void OverlayNode::resizeGLObjectBuffers(unsigned int maxSize) +{ + osg::Group::resizeGLObjectBuffers(maxSize); + + if (_camera.valid()) _camera->resizeGLObjectBuffers(maxSize); + if (_overlaySubgraph.valid()) _overlaySubgraph->resizeGLObjectBuffers(maxSize); + if (_texgenNode.valid()) _texgenNode->resizeGLObjectBuffers(maxSize); + if (_mainSubgraphStateSet.valid()) _mainSubgraphStateSet->resizeGLObjectBuffers(maxSize); + if (_texture.valid()) _texture->resizeGLObjectBuffers(maxSize); +} + +void OverlayNode::releaseGLObjects(osg::State* state) const +{ + osg::Group::releaseGLObjects(state); + + if (_camera.valid()) _camera->releaseGLObjects(state); + if (_overlaySubgraph.valid()) _overlaySubgraph->releaseGLObjects(state); + if (_texgenNode.valid()) _texgenNode->releaseGLObjects(state); + if (_mainSubgraphStateSet.valid()) _mainSubgraphStateSet->releaseGLObjects(state); + if (_texture.valid()) _texture->releaseGLObjects(state); +} + void OverlayNode::init() {