Files
bullet3/examples/Collision/Internal/Bullet2CollisionSdk.cpp

119 lines
3.5 KiB
C++

#include "Bullet2CollisionSdk.h"
#include "btBulletCollisionCommon.h"
struct Bullet2CollisionSdkInternalData
{
btCollisionConfiguration* m_collisionConfig;
btCollisionDispatcher* m_dispatcher;
btBroadphaseInterface* m_aabbBroadphase;
btCollisionWorld* m_collisionWorld;
Bullet2CollisionSdkInternalData()
:m_aabbBroadphase(0),
m_dispatcher(0),
m_collisionWorld(0)
{
}
};
Bullet2CollisionSdk::Bullet2CollisionSdk()
{
m_internalData = new Bullet2CollisionSdkInternalData;
}
Bullet2CollisionSdk::~Bullet2CollisionSdk()
{
delete m_internalData;
m_internalData = 0;
}
plCollisionWorldHandle Bullet2CollisionSdk::createCollisionWorld()
{
m_internalData->m_collisionConfig = new btDefaultCollisionConfiguration;
m_internalData->m_dispatcher = new btCollisionDispatcher(m_internalData->m_collisionConfig);
m_internalData->m_aabbBroadphase = new btDbvtBroadphase();
m_internalData->m_collisionWorld = new btCollisionWorld(m_internalData->m_dispatcher,
m_internalData->m_aabbBroadphase,
m_internalData->m_collisionConfig);
return (plCollisionWorldHandle) m_internalData->m_collisionWorld;
}
void Bullet2CollisionSdk::deleteCollisionWorld(plCollisionWorldHandle worldHandle)
{
btCollisionWorld* world = (btCollisionWorld*) worldHandle;
btAssert(m_internalData->m_collisionWorld == world);
if (m_internalData->m_collisionWorld == world)
{
delete m_internalData->m_collisionWorld;
m_internalData->m_collisionWorld=0;
delete m_internalData->m_aabbBroadphase;
m_internalData->m_aabbBroadphase=0;
delete m_internalData->m_dispatcher;
m_internalData->m_dispatcher=0;
delete m_internalData->m_collisionConfig;
m_internalData->m_collisionConfig=0;
}
}
plCollisionShapeHandle Bullet2CollisionSdk::createSphereShape(plReal radius)
{
btSphereShape* sphereShape = new btSphereShape(radius);
return (plCollisionShapeHandle) sphereShape;
}
void Bullet2CollisionSdk::deleteShape(plCollisionShapeHandle shapeHandle)
{
btCollisionShape* shape = (btCollisionShape*) shapeHandle;
delete shape;
}
void Bullet2CollisionSdk::addCollisionObject(plCollisionWorldHandle worldHandle, plCollisionObjectHandle objectHandle)
{
btCollisionWorld* world = (btCollisionWorld*) worldHandle;
btCollisionObject* colObj = (btCollisionObject*) objectHandle;
btAssert(world && colObj);
if (world == m_internalData->m_collisionWorld && colObj)
{
world->addCollisionObject(colObj);
}
}
void Bullet2CollisionSdk::removeCollisionObject(plCollisionWorldHandle worldHandle, plCollisionObjectHandle objectHandle)
{
btCollisionWorld* world = (btCollisionWorld*) worldHandle;
btCollisionObject* colObj = (btCollisionObject*) objectHandle;
btAssert(world && colObj);
if (world == m_internalData->m_collisionWorld && colObj)
{
world->removeCollisionObject(colObj);
}
}
plCollisionObjectHandle Bullet2CollisionSdk::createCollisionObject( void* user_data, plCollisionShapeHandle shapeHandle )
{
btCollisionShape* colShape = (btCollisionShape*) shapeHandle;
btAssert(colShape);
if (colShape)
{
btCollisionObject* colObj= new btCollisionObject;
colObj->setCollisionShape(colShape);
colObj->setWorldTransform(btTransform::getIdentity());
return (plCollisionObjectHandle) colObj;
}
return 0;
}
void Bullet2CollisionSdk::deleteCollisionObject(plCollisionObjectHandle bodyHandle)
{
btCollisionObject* colObj = (btCollisionObject*) bodyHandle;
delete colObj;
}
plCollisionSdkHandle Bullet2CollisionSdk::createBullet2SdkHandle()
{
return (plCollisionSdkHandle) new Bullet2CollisionSdk;
}