add a few collision examples to test a C API with various back-ends

This commit is contained in:
Erwin Coumans
2015-10-17 13:44:00 -07:00
parent bc09125095
commit 3d3830962a
10 changed files with 709 additions and 4 deletions

View File

@@ -0,0 +1,118 @@
#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;
}

View File

@@ -0,0 +1,34 @@
#ifndef BULLET2_COLLISION_SDK_H
#define BULLET2_COLLISION_SDK_H
#include "CollisionSdkInterface.h"
class Bullet2CollisionSdk : public CollisionSdkInterface
{
struct Bullet2CollisionSdkInternalData* m_internalData;
public:
Bullet2CollisionSdk();
virtual ~Bullet2CollisionSdk();
virtual plCollisionWorldHandle createCollisionWorld();
virtual void deleteCollisionWorld(plCollisionWorldHandle worldHandle);
virtual plCollisionShapeHandle createSphereShape(plReal radius);
virtual void deleteShape(plCollisionShapeHandle shape);
virtual void addCollisionObject(plCollisionWorldHandle world, plCollisionObjectHandle object);
virtual void removeCollisionObject(plCollisionWorldHandle world, plCollisionObjectHandle object);
virtual plCollisionObjectHandle createCollisionObject( void* user_data, plCollisionShapeHandle cshape );
virtual void deleteCollisionObject(plCollisionObjectHandle body);
static plCollisionSdkHandle createBullet2SdkHandle();
};
#endif //BULLET2_COLLISION_SDK_H

View File

@@ -0,0 +1,32 @@
#ifndef COLLISION_SDK_INTERFACE_H
#define COLLISION_SDK_INTERFACE_H
#include "../CollisionSdkC_Api.h"
class CollisionSdkInterface
{
public:
virtual ~CollisionSdkInterface()
{
}
virtual plCollisionWorldHandle createCollisionWorld() = 0;
virtual void deleteCollisionWorld(plCollisionWorldHandle worldHandle) = 0;
virtual plCollisionShapeHandle createSphereShape(plReal radius) = 0;
virtual void deleteShape(plCollisionShapeHandle shape) = 0;
virtual void addCollisionObject(plCollisionWorldHandle world, plCollisionObjectHandle object)=0;
virtual void removeCollisionObject(plCollisionWorldHandle world, plCollisionObjectHandle object)=0;
virtual plCollisionObjectHandle createCollisionObject( void* user_data, plCollisionShapeHandle cshape )=0;
virtual void deleteCollisionObject(plCollisionObjectHandle body)=0;
};
#endif //COLLISION_SDK_INTERFACE_H