1 #ifndef LW_COLLISION_C_API_H
2 #define LW_COLLISION_C_API_H
3 
4 #define PL_DECLARE_HANDLE(name) \
5 	typedef struct name##__     \
6 	{                           \
7 		int unused;             \
8 	} * name
9 
10 #ifdef BT_USE_DOUBLE_PRECISION
11 typedef double plReal;
12 #else
13 typedef float plReal;
14 #endif
15 
16 typedef plReal plVector3[3];
17 typedef plReal plQuaternion[4];
18 
19 #ifdef __cplusplus
20 extern "C"
21 {
22 #endif
23 
24 	/**     Particular collision SDK (C-API) */
25 	PL_DECLARE_HANDLE(plCollisionSdkHandle);
26 
27 	/**     Collision world, belonging to some collision SDK (C-API)*/
28 	PL_DECLARE_HANDLE(plCollisionWorldHandle);
29 
30 	/** Collision object that can be part of a collision World (C-API)*/
31 	PL_DECLARE_HANDLE(plCollisionObjectHandle);
32 
33 	/**     Collision Shape/Geometry, property of a collision object (C-API)*/
34 	PL_DECLARE_HANDLE(plCollisionShapeHandle);
35 
36 	/* Collision SDK */
37 
38 	extern plCollisionSdkHandle plCreateBullet2CollisionSdk();
39 
40 #ifndef DISABLE_REAL_TIME_BULLET3_COLLISION_SDK
41 	extern plCollisionSdkHandle plCreateRealTimeBullet3CollisionSdk();
42 #endif  //DISABLE_REAL_TIME_BULLET3_COLLISION_SDK
43 
44 	//	extern plCollisionSdkHandle plCreateCustomCollisionSdk();
45 
46 	extern void plDeleteCollisionSdk(plCollisionSdkHandle collisionSdkHandle);
47 
48 	//extern int plGetSdkWorldCreationIntParameter();
49 	//extern int plSetSdkWorldCreationIntParameter(int newValue);
50 
51 	/* Collision World */
52 
53 	extern plCollisionWorldHandle plCreateCollisionWorld(plCollisionSdkHandle collisionSdkHandle, int maxNumObjsCapacity, int maxNumShapesCapacity, int maxNumPairsCapacity);
54 	extern void plDeleteCollisionWorld(plCollisionSdkHandle sdkHandle, plCollisionWorldHandle world);
55 
56 	extern void plAddCollisionObject(plCollisionSdkHandle sdkHandle, plCollisionWorldHandle world, plCollisionObjectHandle object);
57 	extern void plRemoveCollisionObject(plCollisionSdkHandle sdkHandle, plCollisionWorldHandle world, plCollisionObjectHandle object);
58 
59 	/* Collision Object  */
60 
61 	extern plCollisionObjectHandle plCreateCollisionObject(plCollisionSdkHandle sdkHandle, plCollisionWorldHandle worldHandle, void* userPointer, int userIndex, plCollisionShapeHandle cshape, plVector3 startPosition, plQuaternion startOrientation);
62 	extern void plDeleteCollisionObject(plCollisionSdkHandle sdkHandle, plCollisionWorldHandle worldHandle, plCollisionObjectHandle body);
63 	extern void plSetCollisionObjectTransform(plCollisionSdkHandle sdkHandle, plCollisionWorldHandle worldHandle, plCollisionObjectHandle objHandle, plVector3 startPosition, plQuaternion startOrientation);
64 
65 	/* Collision Shape definition */
66 
67 	extern plCollisionShapeHandle plCreateSphereShape(plCollisionSdkHandle sdk, plCollisionWorldHandle worldHandle, plReal radius);
68 	extern plCollisionShapeHandle plCreateCapsuleShape(plCollisionSdkHandle sdk, plCollisionWorldHandle worldHandle, plReal radius, plReal height, int capsuleAxis);
69 	extern plCollisionShapeHandle plCreatePlaneShape(plCollisionSdkHandle sdk, plCollisionWorldHandle worldHandle,
70 													 plReal planeNormalX,
71 													 plReal planeNormalY,
72 													 plReal planeNormalZ,
73 													 plReal planeConstant);
74 	extern plCollisionShapeHandle plCreateCompoundShape(plCollisionSdkHandle sdk, plCollisionWorldHandle worldHandle);
75 	extern void plAddChildShape(plCollisionSdkHandle collisionSdkHandle, plCollisionWorldHandle worldHandle, plCollisionShapeHandle compoundShape, plCollisionShapeHandle childShape, plVector3 childPos, plQuaternion childOrn);
76 
77 	extern void plDeleteShape(plCollisionSdkHandle collisionSdkHandle, plCollisionWorldHandle worldHandle, plCollisionShapeHandle shape);
78 
79 	/* Contact Results */
80 
81 	struct lwContactPoint
82 	{
83 		plVector3 m_ptOnAWorld;
84 		plVector3 m_ptOnBWorld;
85 		plVector3 m_normalOnB;
86 		plReal m_distance;
87 	};
88 
89 	/* Collision Filtering */
90 	typedef void (*plNearCallback)(plCollisionSdkHandle sdkHandle, plCollisionWorldHandle worldHandle, void* userData,
91 								   plCollisionObjectHandle objA, plCollisionObjectHandle objB);
92 
93 	/* Collision Queries */
94 	extern int plCollide(plCollisionSdkHandle sdkHandle, plCollisionWorldHandle worldHandle, plCollisionObjectHandle colA, plCollisionObjectHandle colB,
95 						 lwContactPoint* pointsOut, int pointCapacity);
96 
97 	extern void plWorldCollide(plCollisionSdkHandle sdkHandle, plCollisionWorldHandle world,
98 							   plNearCallback filter, void* userData);
99 
100 #ifdef __cplusplus
101 }
102 #endif
103 
104 #endif  //LW_COLLISION_C_API_H
105