Tizen 2.1 base
[platform/upstream/libbullet.git] / Extras / PhysicsEffects / include / BulletPhysicsEffects / btLowLevelBroadphase.h
1 /*\r
2 Physics Effects Copyright(C) 2011 Sony Computer Entertainment Inc.\r
3 All rights reserved.\r
4 \r
5 Physics Effects is open software; you can redistribute it and/or\r
6 modify it under the terms of the BSD License.\r
7 \r
8 Physics Effects is distributed in the hope that it will be useful,\r
9 but WITHOUT ANY WARRANTY; without even the implied warranty of\r
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
11 See the BSD License for more details.\r
12 \r
13 A copy of the BSD License is distributed with\r
14 Physics Effects under the filename: physics_effects_license.txt\r
15 */\r
16  \r
17 ///btLowLevelBroadphase implementation\r
18 #ifndef BT_LOW_LEVEL_BROADPHASE_H\r
19 #define BT_LOW_LEVEL_BROADPHASE_H\r
20 \r
21 #include "BulletCollision/BroadphaseCollision/btDbvt.h"\r
22 #include "BulletCollision/BroadphaseCollision/btOverlappingPairCache.h"\r
23 \r
24 #include "physics_effects/base_level/broadphase/pfx_broadphase_pair.h"\r
25 #include "LinearMath/btHashMap.h"\r
26 \r
27 struct btLowLevelBroadphase;\r
28 struct btLowLevelData;\r
29 \r
30 namespace sce\r
31 {\r
32         namespace PhysicsEffects\r
33         {\r
34                 struct PfxSortData32;\r
35         };\r
36 };\r
37 \r
38 struct  btMyClientData\r
39 {\r
40         btDispatcher* m_dispatcher;\r
41         btLowLevelBroadphase*   m_bp;\r
42 };\r
43 \r
44 struct btLowLevelBroadphaseProxy : public btBroadphaseProxy\r
45 {\r
46         int                     m_nextFree;\r
47         \r
48 //      int                     m_handleId;\r
49 \r
50         \r
51         btLowLevelBroadphaseProxy() {};\r
52 \r
53         btLowLevelBroadphaseProxy(const btVector3& minpt,const btVector3& maxpt,int shapeType,void* userPtr,short int collisionFilterGroup,short int collisionFilterMask,void* multiSapProxy)\r
54         :btBroadphaseProxy(minpt,maxpt,userPtr,collisionFilterGroup,collisionFilterMask,multiSapProxy)\r
55         {\r
56                 (void)shapeType;\r
57         }\r
58         \r
59         \r
60         SIMD_FORCE_INLINE void SetNextFree(int next) {m_nextFree = next;}\r
61         SIMD_FORCE_INLINE int GetNextFree() const {return m_nextFree;}\r
62 \r
63         \r
64 \r
65 \r
66 };\r
67 \r
68 ///btLowLevelBroadphase is a binding between Open Physics low-level broadphase and Bullet, through the btBroadphaseInterface\r
69 \r
70 struct  btLowLevelBroadphase : btBroadphaseInterface\r
71 {\r
72         \r
73                 int             m_numHandles;                                           // number of active handles\r
74         int             m_maxHandles;                                           // max number of handles\r
75         int             m_LastHandleIndex;                                                      \r
76         \r
77         btLowLevelBroadphaseProxy* m_pHandles;                                          // handles pool\r
78 \r
79         void* m_pHandlesRawPtr;\r
80         int             m_firstFreeHandle;              // free handles list\r
81         \r
82         btOverlappingPairCache* m_paircache;                            // Pair cache\r
83         bool                                    m_releasepaircache;                     // Release pair cache on delete\r
84         int                                             m_guidGenerator;\r
85         btVector3                               m_broadphaseAabbMin;\r
86         btVector3                               m_broadphaseAabbMax;\r
87 \r
88         btMyClientData                  m_clientData;\r
89 \r
90         btLowLevelData* m_lowLevelData;\r
91         btHashMap<btHashInt,void*> m_uid2ptr;\r
92 \r
93 \r
94         int allocHandle()\r
95         {\r
96                 btAssert(m_numHandles < m_maxHandles);\r
97                 int freeHandle = m_firstFreeHandle;\r
98                 m_firstFreeHandle = m_pHandles[freeHandle].GetNextFree();\r
99                 m_numHandles++;\r
100                 if(freeHandle > m_LastHandleIndex)\r
101                 {\r
102                         m_LastHandleIndex = freeHandle;\r
103                 }\r
104                 return freeHandle;\r
105         }\r
106 \r
107         void freeHandle(btLowLevelBroadphaseProxy* proxy)\r
108         {\r
109                 int handle = int(proxy-m_pHandles);\r
110                 btAssert(handle >= 0 && handle < m_maxHandles);\r
111                 if(handle == m_LastHandleIndex)\r
112                 {\r
113                         m_LastHandleIndex--;\r
114                 }\r
115                 proxy->SetNextFree(m_firstFreeHandle);\r
116                 m_firstFreeHandle = handle;\r
117 \r
118                 proxy->m_clientObject = 0;\r
119 \r
120                 m_numHandles--;\r
121         }\r
122 \r
123         inline btLowLevelBroadphaseProxy*       getLowLevelProxyFromProxy(btBroadphaseProxy* proxy)\r
124         {\r
125                 btLowLevelBroadphaseProxy* proxy0 = static_cast<btLowLevelBroadphaseProxy*>(proxy);\r
126                 return proxy0;\r
127         }\r
128 \r
129         inline const btLowLevelBroadphaseProxy* getLowLevelProxyFromProxy(btBroadphaseProxy* proxy) const\r
130         {\r
131                 const btLowLevelBroadphaseProxy* proxy0 = static_cast<const btLowLevelBroadphaseProxy*>(proxy);\r
132                 return proxy0;\r
133         }\r
134 \r
135 \r
136 \r
137         inline bool testAabbOverlap(btBroadphaseProxy* proxy0,btBroadphaseProxy* proxy1)\r
138         {\r
139                 btLowLevelBroadphaseProxy* p0 = getLowLevelProxyFromProxy(proxy0);\r
140                 btLowLevelBroadphaseProxy* p1 = getLowLevelProxyFromProxy(proxy1);\r
141                 return aabbOverlap(p0,p1);\r
142         }\r
143 \r
144         static bool     aabbOverlap(btLowLevelBroadphaseProxy* proxy0,btLowLevelBroadphaseProxy* proxy1);\r
145 \r
146         void broadphase(sce::PhysicsEffects::PfxSortData32* proxies, int numRigidBodies, int axis, btDispatcher* dispatcher);\r
147 \r
148         sce::PhysicsEffects::PfxBroadphasePair*         getCurrentPairs();\r
149         const sce::PhysicsEffects::PfxBroadphasePair*           getCurrentPairs() const;\r
150         int     getNumCurrentPairs() const;\r
151 \r
152         \r
153 \r
154         /* Methods              */ \r
155         btLowLevelBroadphase(btLowLevelData* lowLevelData, btOverlappingPairCache* paircache, int maxProxies = 16384);//,class PfxAllocator* allocator,class PfxStackAllocator* stackPool,void* spursInstance);\r
156         virtual ~btLowLevelBroadphase();\r
157 \r
158         /* btBroadphaseInterface Implementation */ \r
159         btBroadphaseProxy*                              createProxy(const btVector3& aabbMin,const btVector3& aabbMax,int shapeType,void* userPtr,short int collisionFilterGroup,short int collisionFilterMask,btDispatcher* dispatcher,void* multiSapProxy);\r
160         void                                                    destroyProxy(btBroadphaseProxy* proxy,btDispatcher* dispatcher);\r
161         void                                                    setAabb(btBroadphaseProxy* proxy,const btVector3& aabbMin,const btVector3& aabbMax,btDispatcher* dispatcher);\r
162         virtual void    rayTest(const btVector3& rayFrom,const btVector3& rayTo, btBroadphaseRayCallback& rayCallback, const btVector3& aabbMin=btVector3(0,0,0), const btVector3& aabbMax = btVector3(0,0,0))\r
163         {\r
164         }\r
165         \r
166         virtual void    aabbTest(const btVector3& aabbMin, const btVector3& aabbMax, btBroadphaseAabbCallback& callback)\r
167         {\r
168         }\r
169 \r
170 \r
171         virtual void    getAabb(btBroadphaseProxy* proxy,btVector3& aabbMin, btVector3& aabbMax ) const;\r
172         void                                                    calculateOverlappingPairs(btDispatcher* dispatcher);\r
173         btOverlappingPairCache*                 getOverlappingPairCache();\r
174         const btOverlappingPairCache*   getOverlappingPairCache() const;\r
175         void                                                    getBroadphaseAabb(btVector3& aabbMin,btVector3& aabbMax) const;\r
176         virtual void    printStats();\r
177 \r
178         virtual void    setNumTasks(int numTasks);\r
179         \r
180 };\r
181 \r
182 #endif\r