remove visual shape from CPU/TinyRenderer with removeBody

(thanks to Jeff Bingham for reporting the bug!)
This commit is contained in:
Erwin Coumans
2017-05-12 20:24:10 -07:00
parent 845eb43610
commit e2d596f4d0
4 changed files with 28 additions and 2 deletions

View File

@@ -9,6 +9,9 @@ class btCollisionObject;
struct LinkVisualShapesConverter 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 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 #endif //LINK_VISUAL_SHAPES_CONVERTER_H

View File

@@ -5101,6 +5101,7 @@ bool PhysicsServerCommandProcessor::processCommand(const struct SharedMemoryComm
if (bodyHandle->m_multiBody->getBaseCollider()) if (bodyHandle->m_multiBody->getBaseCollider())
{ {
m_data->m_visualConverter.removeVisualShape(bodyHandle->m_multiBody->getBaseCollider());
m_data->m_dynamicsWorld->removeCollisionObject(bodyHandle->m_multiBody->getBaseCollider()); m_data->m_dynamicsWorld->removeCollisionObject(bodyHandle->m_multiBody->getBaseCollider());
int graphicsIndex = bodyHandle->m_multiBody->getBaseCollider()->getUserIndex(); int graphicsIndex = bodyHandle->m_multiBody->getBaseCollider()->getUserIndex();
m_data->m_guiHelper->removeGraphicsInstance(graphicsIndex); m_data->m_guiHelper->removeGraphicsInstance(graphicsIndex);
@@ -5110,6 +5111,7 @@ bool PhysicsServerCommandProcessor::processCommand(const struct SharedMemoryComm
if (bodyHandle->m_multiBody->getLink(link).m_collider) 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); m_data->m_dynamicsWorld->removeCollisionObject(bodyHandle->m_multiBody->getLink(link).m_collider);
int graphicsIndex = bodyHandle->m_multiBody->getLink(link).m_collider->getUserIndex(); int graphicsIndex = bodyHandle->m_multiBody->getLink(link).m_collider->getUserIndex();
m_data->m_guiHelper->removeGraphicsInstance(graphicsIndex); m_data->m_guiHelper->removeGraphicsInstance(graphicsIndex);
@@ -5126,6 +5128,7 @@ bool PhysicsServerCommandProcessor::processCommand(const struct SharedMemoryComm
} }
if (bodyHandle->m_rigidBody) if (bodyHandle->m_rigidBody)
{ {
m_data->m_visualConverter.removeVisualShape(bodyHandle->m_rigidBody);
serverCmd.m_removeObjectArgs.m_bodyUniqueIds[serverCmd.m_removeObjectArgs.m_numBodies++] = bodyUniqueId; serverCmd.m_removeObjectArgs.m_bodyUniqueIds[serverCmd.m_removeObjectArgs.m_numBodies++] = bodyUniqueId;
//todo: clear all other remaining data... //todo: clear all other remaining data...
m_data->m_dynamicsWorld->removeRigidBody(bodyHandle->m_rigidBody); m_data->m_dynamicsWorld->removeRigidBody(bodyHandle->m_rigidBody);

View File

@@ -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;o<ptr->m_renderObjects.size();o++)
{
delete ptr->m_renderObjects[o];
}
}
delete ptr;
m_data->m_swRenderInstances.remove(colObj);
}
}
void TinyRendererVisualShapeConverter::resetAll() void TinyRendererVisualShapeConverter::resetAll()
{ {

View File

@@ -17,11 +17,13 @@ struct TinyRendererVisualShapeConverter : public LinkVisualShapesConverter
virtual ~TinyRendererVisualShapeConverter(); 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 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 getNumVisualShapes(int bodyUniqueId);
virtual int getVisualShapesData(int bodyUniqueId, int shapeIndex, struct b3VisualShapeData* shapeData); virtual int getVisualShapesData(int bodyUniqueId, int shapeIndex, struct b3VisualShapeData* shapeData);
virtual void removeVisualShape(class btCollisionObject* colObj);
void setUpAxis(int axis); void setUpAxis(int axis);
void resetCamera(float camDist, float pitch, float yaw, float camPosX,float camPosY, float camPosZ); void resetCamera(float camDist, float pitch, float yaw, float camPosX,float camPosY, float camPosZ);