39
40
#include "BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.h"
40
41
#include "BulletCollision/NarrowPhaseCollision/btGjkEpa.h"
41
42
#include "BulletCollision/CollisionShapes/btMinkowskiSumShape.h"
42
#include "BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.h"
43
#include "BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h"
44
#include "BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h"
46
43
#include "BulletCollision/NarrowPhaseCollision/btDiscreteCollisionDetectorInterface.h"
47
44
#include "BulletCollision/NarrowPhaseCollision/btSimplexSolverInterface.h"
48
45
#include "BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.h"
49
#include "BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h"
50
#include "BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.h"
51
46
#include "LinearMath/btStackAlloc.h"
49
Create and Delete a Physics SDK
55
// btDispatcher* m_dispatcher;
56
// btOverlappingPairCache* m_pairCache;
57
// btConstraintSolver* m_constraintSolver
59
btVector3 m_worldAabbMin;
60
btVector3 m_worldAabbMax;
63
//todo: version, hardware/optimization settings etc?
65
:m_worldAabbMin(-1000,-1000,-1000),
66
m_worldAabbMax(1000,1000,1000)
74
plPhysicsSdkHandle plNewBulletSdk()
76
void* mem = btAlignedAlloc(sizeof(btPhysicsSdk),16);
77
return (plPhysicsSdkHandle)new (mem)btPhysicsSdk;
80
void plDeletePhysicsSdk(plPhysicsSdkHandle physicsSdk)
82
btPhysicsSdk* phys = reinterpret_cast<btPhysicsSdk*>(physicsSdk);
88
plDynamicsWorldHandle plCreateDynamicsWorld(plPhysicsSdkHandle physicsSdkHandle)
90
btPhysicsSdk* physicsSdk = reinterpret_cast<btPhysicsSdk*>(physicsSdkHandle);
91
void* mem = btAlignedAlloc(sizeof(btDefaultCollisionConfiguration),16);
92
btDefaultCollisionConfiguration* collisionConfiguration = new (mem)btDefaultCollisionConfiguration();
93
mem = btAlignedAlloc(sizeof(btCollisionDispatcher),16);
94
btDispatcher* dispatcher = new (mem)btCollisionDispatcher(collisionConfiguration);
95
mem = btAlignedAlloc(sizeof(btAxisSweep3),16);
96
btBroadphaseInterface* pairCache = new (mem)btAxisSweep3(physicsSdk->m_worldAabbMin,physicsSdk->m_worldAabbMax);
97
mem = btAlignedAlloc(sizeof(btSequentialImpulseConstraintSolver),16);
98
btConstraintSolver* constraintSolver = new(mem) btSequentialImpulseConstraintSolver();
100
mem = btAlignedAlloc(sizeof(btDiscreteDynamicsWorld),16);
101
return (plDynamicsWorldHandle) new (mem)btDiscreteDynamicsWorld(dispatcher,pairCache,constraintSolver,collisionConfiguration);
103
void plDeleteDynamicsWorld(plDynamicsWorldHandle world)
105
//todo: also clean up the other allocations, axisSweep, pairCache,dispatcher,constraintSolver,collisionConfiguration
106
btDynamicsWorld* dynamicsWorld = reinterpret_cast< btDynamicsWorld* >(world);
107
btAlignedFree(dynamicsWorld);
110
void plStepSimulation(plDynamicsWorldHandle world, plReal timeStep)
112
btDynamicsWorld* dynamicsWorld = reinterpret_cast< btDynamicsWorld* >(world);
113
assert(dynamicsWorld);
114
dynamicsWorld->stepSimulation(timeStep);
117
void plAddRigidBody(plDynamicsWorldHandle world, plRigidBodyHandle object)
119
btDynamicsWorld* dynamicsWorld = reinterpret_cast< btDynamicsWorld* >(world);
120
assert(dynamicsWorld);
121
btRigidBody* body = reinterpret_cast< btRigidBody* >(object);
124
dynamicsWorld->addRigidBody(body);
127
void plRemoveRigidBody(plDynamicsWorldHandle world, plRigidBodyHandle object)
129
btDynamicsWorld* dynamicsWorld = reinterpret_cast< btDynamicsWorld* >(world);
130
assert(dynamicsWorld);
131
btRigidBody* body = reinterpret_cast< btRigidBody* >(object);
134
dynamicsWorld->removeRigidBody(body);
139
plRigidBodyHandle plCreateRigidBody( void* user_data, float mass, plCollisionShapeHandle cshape )
143
btVector3 localInertia(0,0,0);
144
btCollisionShape* shape = reinterpret_cast<btCollisionShape*>( cshape);
148
shape->calculateLocalInertia(mass,localInertia);
150
void* mem = btAlignedAlloc(sizeof(btRigidBody),16);
151
btRigidBody::btRigidBodyConstructionInfo rbci(mass, 0,shape,localInertia);
152
btRigidBody* body = new (mem)btRigidBody(rbci);
153
body->setWorldTransform(trans);
154
body->setUserPointer(user_data);
155
return (plRigidBodyHandle) body;
158
void plDeleteRigidBody(plRigidBodyHandle cbody)
160
btRigidBody* body = reinterpret_cast< btRigidBody* >(cbody);
162
btAlignedFree( body);
166
/* Collision Shape definition */
168
plCollisionShapeHandle plNewSphereShape(plReal radius)
170
void* mem = btAlignedAlloc(sizeof(btSphereShape),16);
171
return (plCollisionShapeHandle) new (mem)btSphereShape(radius);
175
plCollisionShapeHandle plNewBoxShape(plReal x, plReal y, plReal z)
177
void* mem = btAlignedAlloc(sizeof(btBoxShape),16);
178
return (plCollisionShapeHandle) new (mem)btBoxShape(btVector3(x,y,z));
181
plCollisionShapeHandle plNewCapsuleShape(plReal radius, plReal height)
183
//capsule is convex hull of 2 spheres, so use btMultiSphereShape
184
btVector3 inertiaHalfExtents(radius,height,radius);
185
const int numSpheres = 2;
186
btVector3 positions[numSpheres] = {btVector3(0,height,0),btVector3(0,-height,0)};
187
btScalar radi[numSpheres] = {radius,radius};
188
void* mem = btAlignedAlloc(sizeof(btMultiSphereShape),16);
189
return (plCollisionShapeHandle) new (mem)btMultiSphereShape(inertiaHalfExtents,positions,radi,numSpheres);
191
plCollisionShapeHandle plNewConeShape(plReal radius, plReal height)
193
void* mem = btAlignedAlloc(sizeof(btConeShape),16);
194
return (plCollisionShapeHandle) new (mem)btConeShape(radius,height);
197
plCollisionShapeHandle plNewCylinderShape(plReal radius, plReal height)
199
void* mem = btAlignedAlloc(sizeof(btCylinderShape),16);
200
return (plCollisionShapeHandle) new (mem)btCylinderShape(btVector3(radius,height,radius));
204
plCollisionShapeHandle plNewConvexHullShape()
206
void* mem = btAlignedAlloc(sizeof(btConvexHullShape),16);
207
return (plCollisionShapeHandle) new (mem)btConvexHullShape();
211
/* Concave static triangle meshes */
212
plMeshInterfaceHandle plNewMeshInterface()
217
plCollisionShapeHandle plNewCompoundShape()
219
void* mem = btAlignedAlloc(sizeof(btCompoundShape),16);
220
return (plCollisionShapeHandle) new (mem)btCompoundShape();
223
void plAddChildShape(plCollisionShapeHandle compoundShapeHandle,plCollisionShapeHandle childShapeHandle, plVector3 childPos,plQuaternion childOrn)
225
btCollisionShape* colShape = reinterpret_cast<btCollisionShape*>(compoundShapeHandle);
226
btAssert(colShape->getShapeType() == COMPOUND_SHAPE_PROXYTYPE);
227
btCompoundShape* compoundShape = reinterpret_cast<btCompoundShape*>(colShape);
228
btCollisionShape* childShape = reinterpret_cast<btCollisionShape*>(childShapeHandle);
229
btTransform localTrans;
230
localTrans.setIdentity();
231
localTrans.setOrigin(btVector3(childPos[0],childPos[1],childPos[2]));
232
localTrans.setRotation(btQuaternion(childOrn[0],childOrn[1],childOrn[2],childOrn[3]));
233
compoundShape->addChildShape(localTrans,childShape);
236
void plSetEuler(plReal yaw,plReal pitch,plReal roll, plQuaternion orient)
239
orn.setEuler(yaw,pitch,roll);
240
orient[0] = orn.getX();
241
orient[1] = orn.getY();
242
orient[2] = orn.getZ();
243
orient[3] = orn.getW();
248
// extern void plAddTriangle(plMeshInterfaceHandle meshHandle, plVector3 v0,plVector3 v1,plVector3 v2);
249
// extern plCollisionShapeHandle plNewStaticTriangleMeshShape(plMeshInterfaceHandle);
252
void plAddVertex(plCollisionShapeHandle cshape, plReal x,plReal y,plReal z)
254
btCollisionShape* colShape = reinterpret_cast<btCollisionShape*>( cshape);
256
btAssert(colShape->getShapeType()==CONVEX_HULL_SHAPE_PROXYTYPE);
257
btConvexHullShape* convexHullShape = reinterpret_cast<btConvexHullShape*>( cshape);
258
convexHullShape->addPoint(btPoint3(x,y,z));
262
void plDeleteShape(plCollisionShapeHandle cshape)
264
btCollisionShape* shape = reinterpret_cast<btCollisionShape*>( cshape);
266
btAlignedFree(shape);
268
void plSetScaling(plCollisionShapeHandle cshape, plVector3 cscaling)
270
btCollisionShape* shape = reinterpret_cast<btCollisionShape*>( cshape);
272
btVector3 scaling(cscaling[0],cscaling[1],cscaling[2]);
273
shape->setLocalScaling(scaling);
278
void plSetPosition(plRigidBodyHandle object, const plVector3 position)
280
btRigidBody* body = reinterpret_cast< btRigidBody* >(object);
282
btVector3 pos(position[0],position[1],position[2]);
283
btTransform worldTrans = body->getWorldTransform();
284
worldTrans.setOrigin(pos);
285
body->setWorldTransform(worldTrans);
288
void plSetOrientation(plRigidBodyHandle object, const plQuaternion orientation)
290
btRigidBody* body = reinterpret_cast< btRigidBody* >(object);
292
btQuaternion orn(orientation[0],orientation[1],orientation[2],orientation[3]);
293
btTransform worldTrans = body->getWorldTransform();
294
worldTrans.setRotation(orn);
295
body->setWorldTransform(worldTrans);
298
void plGetOpenGLMatrix(plRigidBodyHandle object, plReal* matrix)
300
btRigidBody* body = reinterpret_cast< btRigidBody* >(object);
302
body->getWorldTransform().getOpenGLMatrix(matrix);
306
void plGetPosition(plRigidBodyHandle object,plVector3 position)
308
btRigidBody* body = reinterpret_cast< btRigidBody* >(object);
310
const btVector3& pos = body->getWorldTransform().getOrigin();
311
position[0] = pos.getX();
312
position[1] = pos.getY();
313
position[2] = pos.getZ();
316
void plGetOrientation(plRigidBodyHandle object,plQuaternion orientation)
318
btRigidBody* body = reinterpret_cast< btRigidBody* >(object);
320
const btQuaternion& orn = body->getWorldTransform().getRotation();
321
orientation[0] = orn.getX();
322
orientation[1] = orn.getY();
323
orientation[2] = orn.getZ();
324
orientation[3] = orn.getW();
329
//plRigidBodyHandle plRayCast(plDynamicsWorldHandle world, const plVector3 rayStart, const plVector3 rayEnd, plVector3 hitpoint, plVector3 normal);
331
// extern plRigidBodyHandle plObjectCast(plDynamicsWorldHandle world, const plVector3 rayStart, const plVector3 rayEnd, plVector3 hitpoint, plVector3 normal);
54
333
double plNearestPoints(float p1[3], float p2[3], float p3[3], float q1[3], float q2[3], float q3[3], float *pa, float *pb, float normal[3])
56
335
btVector3 vp(p1[0], p1[1], p1[2]);