From e2d596f4d06b3c7d6b3cd245276c6da43491f236 Mon Sep 17 00:00:00 2001 From: Erwin Coumans Date: Fri, 12 May 2017 20:24:10 -0700 Subject: [PATCH] remove visual shape from CPU/TinyRenderer with removeBody (thanks to Jeff Bingham for reporting the bug!) --- .../ImportURDFDemo/LinkVisualShapesConverter.h | 3 +++ .../PhysicsServerCommandProcessor.cpp | 3 +++ .../TinyRendererVisualShapeConverter.cpp | 18 ++++++++++++++++++ .../TinyRendererVisualShapeConverter.h | 6 ++++-- 4 files changed, 28 insertions(+), 2 deletions(-) diff --git a/examples/Importers/ImportURDFDemo/LinkVisualShapesConverter.h b/examples/Importers/ImportURDFDemo/LinkVisualShapesConverter.h index 8f3d3c411..edc7559ba 100644 --- a/examples/Importers/ImportURDFDemo/LinkVisualShapesConverter.h +++ b/examples/Importers/ImportURDFDemo/LinkVisualShapesConverter.h @@ -9,6 +9,9 @@ class btCollisionObject; struct LinkVisualShapesConverter { virtual void convertVisualShapes(int linkIndex, const char* pathPrefix, const btTransform& localInertiaFrame, const UrdfLink* linkPtr, const UrdfModel* model, class btCollisionObject* colShape, int objectIndex) =0; + + virtual void removeVisualShape(class btCollisionObject* colObj)=0; + }; #endif //LINK_VISUAL_SHAPES_CONVERTER_H diff --git a/examples/SharedMemory/PhysicsServerCommandProcessor.cpp b/examples/SharedMemory/PhysicsServerCommandProcessor.cpp index 578086f54..4162cab19 100644 --- a/examples/SharedMemory/PhysicsServerCommandProcessor.cpp +++ b/examples/SharedMemory/PhysicsServerCommandProcessor.cpp @@ -5101,6 +5101,7 @@ bool PhysicsServerCommandProcessor::processCommand(const struct SharedMemoryComm if (bodyHandle->m_multiBody->getBaseCollider()) { + m_data->m_visualConverter.removeVisualShape(bodyHandle->m_multiBody->getBaseCollider()); m_data->m_dynamicsWorld->removeCollisionObject(bodyHandle->m_multiBody->getBaseCollider()); int graphicsIndex = bodyHandle->m_multiBody->getBaseCollider()->getUserIndex(); m_data->m_guiHelper->removeGraphicsInstance(graphicsIndex); @@ -5110,6 +5111,7 @@ bool PhysicsServerCommandProcessor::processCommand(const struct SharedMemoryComm if (bodyHandle->m_multiBody->getLink(link).m_collider) { + m_data->m_visualConverter.removeVisualShape(bodyHandle->m_multiBody->getLink(link).m_collider); m_data->m_dynamicsWorld->removeCollisionObject(bodyHandle->m_multiBody->getLink(link).m_collider); int graphicsIndex = bodyHandle->m_multiBody->getLink(link).m_collider->getUserIndex(); m_data->m_guiHelper->removeGraphicsInstance(graphicsIndex); @@ -5126,6 +5128,7 @@ bool PhysicsServerCommandProcessor::processCommand(const struct SharedMemoryComm } if (bodyHandle->m_rigidBody) { + m_data->m_visualConverter.removeVisualShape(bodyHandle->m_rigidBody); serverCmd.m_removeObjectArgs.m_bodyUniqueIds[serverCmd.m_removeObjectArgs.m_numBodies++] = bodyUniqueId; //todo: clear all other remaining data... m_data->m_dynamicsWorld->removeRigidBody(bodyHandle->m_rigidBody); diff --git a/examples/SharedMemory/TinyRendererVisualShapeConverter.cpp b/examples/SharedMemory/TinyRendererVisualShapeConverter.cpp index 5e9579c08..c892884d2 100644 --- a/examples/SharedMemory/TinyRendererVisualShapeConverter.cpp +++ b/examples/SharedMemory/TinyRendererVisualShapeConverter.cpp @@ -972,6 +972,24 @@ void TinyRendererVisualShapeConverter::copyCameraImageData(unsigned char* pixels } } +void TinyRendererVisualShapeConverter::removeVisualShape(class btCollisionObject* colObj) +{ + TinyRendererObjectArray** ptrptr = m_data->m_swRenderInstances[colObj]; + if (ptrptr && *ptrptr) + { + TinyRendererObjectArray* ptr = *ptrptr; + if (ptr) + { + for (int o=0;om_renderObjects.size();o++) + { + delete ptr->m_renderObjects[o]; + } + } + delete ptr; + m_data->m_swRenderInstances.remove(colObj); + } +} + void TinyRendererVisualShapeConverter::resetAll() { diff --git a/examples/SharedMemory/TinyRendererVisualShapeConverter.h b/examples/SharedMemory/TinyRendererVisualShapeConverter.h index e9e60948f..6771dc624 100644 --- a/examples/SharedMemory/TinyRendererVisualShapeConverter.h +++ b/examples/SharedMemory/TinyRendererVisualShapeConverter.h @@ -17,11 +17,13 @@ struct TinyRendererVisualShapeConverter : public LinkVisualShapesConverter virtual ~TinyRendererVisualShapeConverter(); virtual void convertVisualShapes(int linkIndex, const char* pathPrefix, const btTransform& localInertiaFrame, const UrdfLink* linkPtr, const UrdfModel* model, class btCollisionObject* colShape, int objectIndex); - + virtual int getNumVisualShapes(int bodyUniqueId); virtual int getVisualShapesData(int bodyUniqueId, int shapeIndex, struct b3VisualShapeData* shapeData); - + + virtual void removeVisualShape(class btCollisionObject* colObj); + void setUpAxis(int axis); void resetCamera(float camDist, float pitch, float yaw, float camPosX,float camPosY, float camPosZ);