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