From 1fd9fba7a3b68df838436bd2e5703ce9686bfdc1 Mon Sep 17 00:00:00 2001 From: scrawl Date: Sun, 24 May 2015 04:28:34 +0200 Subject: [PATCH] Fix debug drawer crash --- apps/openmw/mwrender/bulletdebugdraw.cpp | 50 ++++++++++++++++-------- apps/openmw/mwrender/bulletdebugdraw.hpp | 3 ++ 2 files changed, 37 insertions(+), 16 deletions(-) diff --git a/apps/openmw/mwrender/bulletdebugdraw.cpp b/apps/openmw/mwrender/bulletdebugdraw.cpp index 9e683232b..36fc24226 100644 --- a/apps/openmw/mwrender/bulletdebugdraw.cpp +++ b/apps/openmw/mwrender/bulletdebugdraw.cpp @@ -28,21 +28,41 @@ DebugDrawer::DebugDrawer(osg::ref_ptr parentNode, btDynamicsWorld *w mParentNode->addChild(mGeode); mGeode->setNodeMask(Mask_Debug); - mGeometry = new osg::Geometry; + createGeometry(); - mVertices = new osg::Vec3Array; - - mDrawArrays = new osg::DrawArrays(osg::PrimitiveSet::LINES); - - mGeometry->setUseDisplayList(false); - mGeometry->setVertexArray(mVertices); - mGeometry->setDataVariance(osg::Object::DYNAMIC); - mGeometry->addPrimitiveSet(mDrawArrays); - - mGeode->addDrawable(mGeometry); mParentNode->addChild(mGeode); } +void DebugDrawer::createGeometry() +{ + if (!mGeometry) + { + mGeometry = new osg::Geometry; + + mVertices = new osg::Vec3Array; + + mDrawArrays = new osg::DrawArrays(osg::PrimitiveSet::LINES); + + mGeometry->setUseDisplayList(false); + mGeometry->setVertexArray(mVertices); + mGeometry->setDataVariance(osg::Object::DYNAMIC); + mGeometry->addPrimitiveSet(mDrawArrays); + + mGeode->addDrawable(mGeometry); + } +} + +void DebugDrawer::destroyGeometry() +{ + if (mGeometry) + { + mGeode->removeDrawable(mGeometry); + mGeometry = NULL; + mVertices = NULL; + mDrawArrays = NULL; + } +} + DebugDrawer::~DebugDrawer() { mParentNode->removeChild(mGeode); @@ -81,11 +101,9 @@ void DebugDrawer::setDebugMode(int isOn) mDebugOn = (isOn == 0) ? false : true; if (!mDebugOn) - { - mVertices->clear(); - mVertices->releaseGLObjects(0); - mGeometry->releaseGLObjects(0); - } + destroyGeometry(); + else + createGeometry(); } int DebugDrawer::getDebugMode() const diff --git a/apps/openmw/mwrender/bulletdebugdraw.hpp b/apps/openmw/mwrender/bulletdebugdraw.hpp index 288091e7c..d2a4163cf 100644 --- a/apps/openmw/mwrender/bulletdebugdraw.hpp +++ b/apps/openmw/mwrender/bulletdebugdraw.hpp @@ -29,6 +29,9 @@ protected: bool mDebugOn; + void createGeometry(); + void destroyGeometry(); + public: DebugDrawer(osg::ref_ptr parentNode, btDynamicsWorld *world);