123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278 |
- #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(int /*maxNumObjsCapacity*/, int /*maxNumShapesCapacity*/, int /*maxNumPairsCapacity*/)
- {
- 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(plCollisionWorldHandle /*worldHandle*/, plReal radius)
- {
- btSphereShape* sphereShape = new btSphereShape(radius);
- return (plCollisionShapeHandle) sphereShape;
- }
- plCollisionShapeHandle Bullet2CollisionSdk::createPlaneShape(plCollisionWorldHandle worldHandle,
- plReal planeNormalX,
- plReal planeNormalY,
- plReal planeNormalZ,
- plReal planeConstant)
- {
- btStaticPlaneShape* planeShape = new btStaticPlaneShape(btVector3(planeNormalX,planeNormalY,planeNormalZ),planeConstant);
- return (plCollisionShapeHandle) planeShape;
- }
- plCollisionShapeHandle Bullet2CollisionSdk::createCapsuleShape(plCollisionWorldHandle worldHandle,
- plReal radius,
- plReal height,
- int capsuleAxis)
- {
- btCapsuleShape* capsule = 0;
- switch (capsuleAxis)
- {
- case 0:
- {
- capsule = new btCapsuleShapeX(radius,height);
- break;
- }
- case 1:
- {
- capsule = new btCapsuleShape(radius,height);
- break;
- }
- case 2:
- {
- capsule = new btCapsuleShapeZ(radius,height);
- break;
- }
- default:
- {
- btAssert(0);
- }
- }
- return (plCollisionShapeHandle)capsule;
- }
- plCollisionShapeHandle Bullet2CollisionSdk::createCompoundShape(plCollisionWorldHandle worldHandle)
- {
- return (plCollisionShapeHandle) new btCompoundShape();
- }
- void Bullet2CollisionSdk::addChildShape(plCollisionWorldHandle worldHandle,plCollisionShapeHandle compoundShapeHandle, plCollisionShapeHandle childShapeHandle,plVector3 childPos,plQuaternion childOrn)
- {
- btCompoundShape* compound = (btCompoundShape*) compoundShapeHandle;
- btCollisionShape* childShape = (btCollisionShape*) childShapeHandle;
- btTransform localTrans;
- localTrans.setOrigin(btVector3(childPos[0],childPos[1],childPos[2]));
- localTrans.setRotation(btQuaternion(childOrn[0],childOrn[1],childOrn[2],childOrn[3]));
- compound->addChildShape(localTrans,childShape);
-
- }
- void Bullet2CollisionSdk::deleteShape(plCollisionWorldHandle /*worldHandle*/, 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( plCollisionWorldHandle worldHandle, void* userPointer, int userIndex, plCollisionShapeHandle shapeHandle ,
- plVector3 startPosition,plQuaternion startOrientation )
- {
- btCollisionShape* colShape = (btCollisionShape*) shapeHandle;
- btAssert(colShape);
- if (colShape)
- {
- btCollisionObject* colObj= new btCollisionObject;
- colObj->setUserIndex(userIndex);
- colObj->setUserPointer(userPointer);
- colObj->setCollisionShape(colShape);
- btTransform tr;
- tr.setOrigin(btVector3(startPosition[0],startPosition[1],startPosition[2]));
- tr.setRotation(btQuaternion(startOrientation[0],startOrientation[1],startOrientation[2],startOrientation[3]));
- colObj->setWorldTransform(tr);
- return (plCollisionObjectHandle) colObj;
- }
- return 0;
- }
- void Bullet2CollisionSdk::deleteCollisionObject(plCollisionObjectHandle bodyHandle)
- {
- btCollisionObject* colObj = (btCollisionObject*) bodyHandle;
- delete colObj;
- }
- void Bullet2CollisionSdk::setCollisionObjectTransform(plCollisionWorldHandle /*worldHandle*/, plCollisionObjectHandle bodyHandle,
- plVector3 position,plQuaternion orientation )
- {
- btCollisionObject* colObj = (btCollisionObject*) bodyHandle;
- btTransform tr;
- tr.setOrigin(btVector3(position[0],position[1],position[2]));
- tr.setRotation(btQuaternion(orientation[0],orientation[1],orientation[2],orientation[3]));
- colObj->setWorldTransform(tr);
- }
- struct Bullet2ContactResultCallback : public btCollisionWorld::ContactResultCallback
- {
- int m_numContacts;
- lwContactPoint* m_pointsOut;
- int m_pointCapacity;
-
- Bullet2ContactResultCallback(lwContactPoint* pointsOut, int pointCapacity) :
- m_numContacts(0),
- m_pointsOut(pointsOut),
- m_pointCapacity(pointCapacity)
- {
- }
- virtual btScalar addSingleResult(btManifoldPoint& cp, const btCollisionObjectWrapper* colObj0Wrap,int partId0,int index0,const btCollisionObjectWrapper* colObj1Wrap,int partId1,int index1)
- {
- if (m_numContacts<m_pointCapacity)
- {
- lwContactPoint& ptOut = m_pointsOut[m_numContacts];
- ptOut.m_distance = cp.m_distance1;
- ptOut.m_normalOnB[0] = cp.m_normalWorldOnB.getX();
- ptOut.m_normalOnB[1] = cp.m_normalWorldOnB.getY();
- ptOut.m_normalOnB[2] = cp.m_normalWorldOnB.getZ();
- ptOut.m_ptOnAWorld[0] = cp.m_positionWorldOnA[0];
- ptOut.m_ptOnAWorld[1] = cp.m_positionWorldOnA[1];
- ptOut.m_ptOnAWorld[2] = cp.m_positionWorldOnA[2];
- ptOut.m_ptOnBWorld[0] = cp.m_positionWorldOnB[0];
- ptOut.m_ptOnBWorld[1] = cp.m_positionWorldOnB[1];
- ptOut.m_ptOnBWorld[2] = cp.m_positionWorldOnB[2];
- m_numContacts++;
- }
-
- return 1.f;
- }
- };
- int Bullet2CollisionSdk::collide(plCollisionWorldHandle worldHandle,plCollisionObjectHandle colA, plCollisionObjectHandle colB,
- lwContactPoint* pointsOut, int pointCapacity)
- {
-
- btCollisionWorld* world = (btCollisionWorld*) worldHandle;
- btCollisionObject* colObjA = (btCollisionObject*) colA;
- btCollisionObject* colObjB = (btCollisionObject*) colB;
- btAssert(world && colObjA && colObjB);
- if (world == m_internalData->m_collisionWorld && colObjA && colObjB)
- {
- Bullet2ContactResultCallback cb(pointsOut,pointCapacity);
- world->contactPairTest(colObjA,colObjB,cb);
- return cb.m_numContacts;
- }
- return 0;
- }
- static plNearCallback gTmpFilter;
- static int gNearCallbackCount = 0;
- static plCollisionSdkHandle gCollisionSdk = 0;
- static plCollisionWorldHandle gCollisionWorldHandle = 0;
- static void* gUserData = 0;
- void Bullet2NearCallback(btBroadphasePair& collisionPair, btCollisionDispatcher& dispatcher, const btDispatcherInfo& dispatchInfo)
- {
- btCollisionObject* colObj0 = (btCollisionObject*)collisionPair.m_pProxy0->m_clientObject;
- btCollisionObject* colObj1 = (btCollisionObject*)collisionPair.m_pProxy1->m_clientObject;
- plCollisionObjectHandle obA =(plCollisionObjectHandle) colObj0;
- plCollisionObjectHandle obB =(plCollisionObjectHandle) colObj1;
- if(gTmpFilter)
- {
- gTmpFilter(gCollisionSdk,gCollisionWorldHandle, gUserData,obA,obB);
- gNearCallbackCount++;
- }
- }
- void Bullet2CollisionSdk::collideWorld( plCollisionWorldHandle worldHandle,
- plNearCallback filter, void* userData)
- {
- btCollisionWorld* world = (btCollisionWorld*) worldHandle;
- //chain the near-callback
- gTmpFilter = filter;
- gNearCallbackCount = 0;
- gUserData = userData;
- gCollisionSdk = (plCollisionSdkHandle)this;
- gCollisionWorldHandle = worldHandle;
- m_internalData->m_dispatcher->setNearCallback(Bullet2NearCallback);
- world->performDiscreteCollisionDetection();
- gTmpFilter = 0;
- }
- plCollisionSdkHandle Bullet2CollisionSdk::createBullet2SdkHandle()
- {
- return (plCollisionSdkHandle) new Bullet2CollisionSdk;
- }
|