diff --git a/sources/Box2D/Box2D.h b/sources/Box2D/Box2D.h index f98f87a5..b43aa6aa 100755 --- a/sources/Box2D/Box2D.h +++ b/sources/Box2D/Box2D.h @@ -65,4 +65,6 @@ For discussion please visit http://box2d.org/forum #include #include +#include + #endif diff --git a/sources/Box2D/Dynamics/Contacts/b2Contact.cpp b/sources/Box2D/Dynamics/Contacts/b2Contact.cpp index 8d0104e8..4a54c2df 100755 --- a/sources/Box2D/Dynamics/Contacts/b2Contact.cpp +++ b/sources/Box2D/Dynamics/Contacts/b2Contact.cpp @@ -33,6 +33,7 @@ #include #include #include +#include b2ContactRegister b2Contact::s_registers[b2Shape::e_typeCount][b2Shape::e_typeCount]; bool b2Contact::s_initialized = false; @@ -119,6 +120,7 @@ void b2Contact::Destroy(b2Contact* contact, b2BlockAllocator* allocator) b2Assert(0 <= typeA && typeB < b2Shape::e_typeCount); b2Assert(0 <= typeA && typeB < b2Shape::e_typeCount); + b2NotifyObjectDestroyed(contact, typeid(*contact).name()); b2ContactDestroyFcn* destroyFcn = s_registers[typeA][typeB].destroyFcn; destroyFcn(contact, allocator); } diff --git a/sources/Box2D/Dynamics/Joints/b2Joint.cpp b/sources/Box2D/Dynamics/Joints/b2Joint.cpp index 50919495..65390b46 100755 --- a/sources/Box2D/Dynamics/Joints/b2Joint.cpp +++ b/sources/Box2D/Dynamics/Joints/b2Joint.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include @@ -127,6 +128,7 @@ b2Joint* b2Joint::Create(const b2JointDef* def, b2BlockAllocator* allocator) void b2Joint::Destroy(b2Joint* joint, b2BlockAllocator* allocator) { + b2NotifyObjectDestroyed(joint, typeid(*joint).name()); joint->~b2Joint(); switch (joint->m_type) { diff --git a/sources/Box2D/Dynamics/b2World.cpp b/sources/Box2D/Dynamics/b2World.cpp index 53bc14a2..eb88f118 100755 --- a/sources/Box2D/Dynamics/b2World.cpp +++ b/sources/Box2D/Dynamics/b2World.cpp @@ -32,6 +32,7 @@ #include #include #include +#include #include b2World::b2World(const b2Vec2& gravity) @@ -205,6 +206,7 @@ void b2World::DestroyBody(b2Body* b) } --m_bodyCount; + b2NotifyObjectDestroyed(b, "b2Body"); b->~b2Body(); m_blockAllocator.Free(b, sizeof(b2Body)); } diff --git a/sources/Box2D/b2ObjectDestroyNotifier.cpp b/sources/Box2D/b2ObjectDestroyNotifier.cpp new file mode 100644 index 00000000..a57a7d52 --- /dev/null +++ b/sources/Box2D/b2ObjectDestroyNotifier.cpp @@ -0,0 +1,16 @@ +#include "b2ObjectDestroyNotifier.h" + +static b2ObjectDestroyNotifer __objectDestroyNotifier = NULL; + +void b2SetObjectDestroyNotifier(b2ObjectDestroyNotifer notifier) +{ + __objectDestroyNotifier = notifier; +} + +void b2NotifyObjectDestroyed(void* obj, const char* typeName /* = NULL */) +{ + if (__objectDestroyNotifier != NULL) + { + __objectDestroyNotifier(obj, typeName); + } +} diff --git a/sources/Box2D/b2ObjectDestroyNotifier.h b/sources/Box2D/b2ObjectDestroyNotifier.h new file mode 100644 index 00000000..7c607563 --- /dev/null +++ b/sources/Box2D/b2ObjectDestroyNotifier.h @@ -0,0 +1,8 @@ +#pragma once + +#include + +typedef void (*b2ObjectDestroyNotifer)(void*, const char*); + +void b2SetObjectDestroyNotifier(b2ObjectDestroyNotifer notifier); +void b2NotifyObjectDestroyed(void* obj, const char* typeName = NULL);