1 #ifndef B3_CPU_NARROWPHASE_H
2 #define B3_CPU_NARROWPHASE_H
3 
4 #include "Bullet3Collision/NarrowPhaseCollision/shared/b3Collidable.h"
5 #include "Bullet3Common/b3AlignedObjectArray.h"
6 #include "Bullet3Common/b3Vector3.h"
7 #include "Bullet3Collision/BroadPhaseCollision/shared/b3Aabb.h"
8 #include "Bullet3Common/shared/b3Int4.h"
9 #include "Bullet3Collision/NarrowPhaseCollision/shared/b3RigidBodyData.h"
10 #include "Bullet3Collision/NarrowPhaseCollision/shared/b3Contact4Data.h"
11 
12 class b3CpuNarrowPhase
13 {
14 protected:
15 	struct b3CpuNarrowPhaseInternalData* m_data;
16 	int m_acceleratedCompanionShapeIndex;
17 	int m_planeBodyIndex;
18 	int m_static0Index;
19 
20 	int registerConvexHullShapeInternal(class b3ConvexUtility* convexPtr, b3Collidable& col);
21 	int registerConcaveMeshShape(b3AlignedObjectArray<b3Vector3>* vertices, b3AlignedObjectArray<int>* indices, b3Collidable& col, const float* scaling);
22 
23 public:
24 	b3CpuNarrowPhase(const struct b3Config& config);
25 
26 	virtual ~b3CpuNarrowPhase(void);
27 
28 	int registerSphereShape(float radius);
29 	int registerPlaneShape(const b3Vector3& planeNormal, float planeConstant);
30 
31 	int registerCompoundShape(b3AlignedObjectArray<b3GpuChildShape>* childShapes);
32 	int registerFace(const b3Vector3& faceNormal, float faceConstant);
33 
34 	int registerConcaveMesh(b3AlignedObjectArray<b3Vector3>* vertices, b3AlignedObjectArray<int>* indices, const float* scaling);
35 
36 	//do they need to be merged?
37 
38 	int registerConvexHullShape(b3ConvexUtility* utilPtr);
39 	int registerConvexHullShape(const float* vertices, int strideInBytes, int numVertices, const float* scaling);
40 
41 	//int registerRigidBody(int collidableIndex, float mass, const float* position, const float* orientation, const float* aabbMin, const float* aabbMax,bool writeToGpu);
42 	void setObjectTransform(const float* position, const float* orientation, int bodyIndex);
43 
44 	void writeAllBodiesToGpu();
45 	void reset();
46 	void readbackAllBodiesToCpu();
47 	bool getObjectTransformFromCpu(float* position, float* orientation, int bodyIndex) const;
48 
49 	void setObjectTransformCpu(float* position, float* orientation, int bodyIndex);
50 	void setObjectVelocityCpu(float* linVel, float* angVel, int bodyIndex);
51 
52 	//virtual void computeContacts(cl_mem broadphasePairs, int numBroadphasePairs, cl_mem aabbsWorldSpace, int numObjects);
53 	virtual void computeContacts(b3AlignedObjectArray<b3Int4>& pairs, b3AlignedObjectArray<b3Aabb>& aabbsWorldSpace, b3AlignedObjectArray<b3RigidBodyData>& bodies);
54 
55 	const struct b3RigidBodyData* getBodiesCpu() const;
56 	//struct b3RigidBodyData* getBodiesCpu();
57 
58 	int getNumBodiesGpu() const;
59 
60 	int getNumBodyInertiasGpu() const;
61 
62 	const struct b3Collidable* getCollidablesCpu() const;
63 	int getNumCollidablesGpu() const;
64 
65 	/*const struct b3Contact4* getContactsCPU() const;
66 
67 
68 	int	getNumContactsGpu() const;
69 	*/
70 
71 	const b3AlignedObjectArray<b3Contact4Data>& getContacts() const;
72 
73 	int getNumRigidBodies() const;
74 
75 	int allocateCollidable();
76 
getStatic0Index()77 	int getStatic0Index() const
78 	{
79 		return m_static0Index;
80 	}
81 	b3Collidable& getCollidableCpu(int collidableIndex);
82 	const b3Collidable& getCollidableCpu(int collidableIndex) const;
83 
getInternalData()84 	const b3CpuNarrowPhaseInternalData* getInternalData() const
85 	{
86 		return m_data;
87 	}
88 
89 	const struct b3Aabb& getLocalSpaceAabb(int collidableIndex) const;
90 };
91 
92 #endif  //B3_CPU_NARROWPHASE_H
93