1 /*! \file btGImpactShape.h
2 \author Francisco Leon Najera
5 This source file is part of GIMPACT Library.
7 For the latest info, see http://gimpact.sourceforge.net/
9 Copyright (c) 2007 Francisco Leon Najera. C.C. 80087371.
10 email: projectileman@yahoo.com
13 This software is provided 'as-is', without any express or implied warranty.
14 In no event will the authors be held liable for any damages arising from the use of this software.
15 Permission is granted to anyone to use this software for any purpose,
16 including commercial applications, and to alter it and redistribute it freely,
17 subject to the following restrictions:
19 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
20 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
21 3. This notice may not be removed or altered from any source distribution.
24 #ifndef BT_GIMPACT_BVH_CONCAVE_COLLISION_ALGORITHM_H
25 #define BT_GIMPACT_BVH_CONCAVE_COLLISION_ALGORITHM_H
27 #include "BulletCollision/CollisionDispatch/btActivatingCollisionAlgorithm.h"
28 #include "BulletCollision/BroadphaseCollision/btDispatcher.h"
29 #include "BulletCollision/BroadphaseCollision/btBroadphaseInterface.h"
30 #include "BulletCollision/NarrowPhaseCollision/btPersistentManifold.h"
32 #include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h"
33 #include "BulletCollision/CollisionDispatch/btCollisionCreateFunc.h"
34 #include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h"
36 #include "LinearMath/btAlignedObjectArray.h"
38 #include "btGImpactShape.h"
39 #include "BulletCollision/CollisionShapes/btStaticPlaneShape.h"
40 #include "BulletCollision/CollisionShapes/btCompoundShape.h"
41 #include "BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.h"
42 #include "LinearMath/btIDebugDraw.h"
46 //! Collision Algorithm for GImpact Shapes
48 For register this algorithm in Bullet, proceed as following:
50 btCollisionDispatcher * dispatcher = static_cast<btCollisionDispatcher *>(m_dynamicsWorld ->getDispatcher());
51 btGImpactCollisionAlgorithm::registerAlgorithm(dispatcher);
54 class btGImpactCollisionAlgorithm : public btActivatingCollisionAlgorithm
57 btCollisionAlgorithm * m_convex_algorithm;
58 btPersistentManifold * m_manifoldPtr;
59 btManifoldResult* m_resultOut;
60 const btDispatcherInfo * m_dispatchInfo;
67 //! Creates a new contact point
68 SIMD_FORCE_INLINE btPersistentManifold* newContactManifold(btCollisionObject* body0,btCollisionObject* body1)
70 m_manifoldPtr = m_dispatcher->getNewManifold(body0,body1);
74 SIMD_FORCE_INLINE void destroyConvexAlgorithm()
76 if(m_convex_algorithm)
78 m_convex_algorithm->~btCollisionAlgorithm();
79 m_dispatcher->freeCollisionAlgorithm( m_convex_algorithm);
80 m_convex_algorithm = NULL;
84 SIMD_FORCE_INLINE void destroyContactManifolds()
86 if(m_manifoldPtr == NULL) return;
87 m_dispatcher->releaseManifold(m_manifoldPtr);
91 SIMD_FORCE_INLINE void clearCache()
93 destroyContactManifolds();
94 destroyConvexAlgorithm();
102 SIMD_FORCE_INLINE btPersistentManifold* getLastManifold()
104 return m_manifoldPtr;
108 // Call before process collision
109 SIMD_FORCE_INLINE void checkManifold(btCollisionObject* body0,btCollisionObject* body1)
111 if(getLastManifold() == 0)
113 newContactManifold(body0,body1);
116 m_resultOut->setPersistentManifold(getLastManifold());
119 // Call before process collision
120 SIMD_FORCE_INLINE btCollisionAlgorithm * newAlgorithm(btCollisionObject* body0,btCollisionObject* body1)
122 checkManifold(body0,body1);
124 btCollisionAlgorithm * convex_algorithm = m_dispatcher->findAlgorithm(
125 body0,body1,getLastManifold());
126 return convex_algorithm ;
129 // Call before process collision
130 SIMD_FORCE_INLINE void checkConvexAlgorithm(btCollisionObject* body0,btCollisionObject* body1)
132 if(m_convex_algorithm) return;
133 m_convex_algorithm = newAlgorithm(body0,body1);
139 void addContactPoint(btCollisionObject * body0,
140 btCollisionObject * body1,
141 const btVector3 & point,
142 const btVector3 & normal,
145 //! Collision routines
148 void collide_gjk_triangles(btCollisionObject * body0,
149 btCollisionObject * body1,
150 btGImpactMeshShapePart * shape0,
151 btGImpactMeshShapePart * shape1,
152 const int * pairs, int pair_count);
154 void collide_sat_triangles(btCollisionObject * body0,
155 btCollisionObject * body1,
156 btGImpactMeshShapePart * shape0,
157 btGImpactMeshShapePart * shape1,
158 const int * pairs, int pair_count);
163 void shape_vs_shape_collision(
164 btCollisionObject * body0,
165 btCollisionObject * body1,
166 btCollisionShape * shape0,
167 btCollisionShape * shape1);
169 void convex_vs_convex_collision(btCollisionObject * body0,
170 btCollisionObject * body1,
171 btCollisionShape * shape0,
172 btCollisionShape * shape1);
176 void gimpact_vs_gimpact_find_pairs(
177 const btTransform & trans0,
178 const btTransform & trans1,
179 btGImpactShapeInterface * shape0,
180 btGImpactShapeInterface * shape1,btPairSet & pairset);
182 void gimpact_vs_shape_find_pairs(
183 const btTransform & trans0,
184 const btTransform & trans1,
185 btGImpactShapeInterface * shape0,
186 btCollisionShape * shape1,
187 btAlignedObjectArray<int> & collided_primitives);
190 void gimpacttrimeshpart_vs_plane_collision(
191 btCollisionObject * body0,
192 btCollisionObject * body1,
193 btGImpactMeshShapePart * shape0,
194 btStaticPlaneShape * shape1,bool swapped);
199 btGImpactCollisionAlgorithm( const btCollisionAlgorithmConstructionInfo& ci,btCollisionObject* body0,btCollisionObject* body1);
201 virtual ~btGImpactCollisionAlgorithm();
203 virtual void processCollision (btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut);
205 btScalar calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut);
207 virtual void getAllContactManifolds(btManifoldArray& manifoldArray)
210 manifoldArray.push_back(m_manifoldPtr);
214 struct CreateFunc :public btCollisionAlgorithmCreateFunc
216 virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, btCollisionObject* body0,btCollisionObject* body1)
218 void* mem = ci.m_dispatcher1->allocateCollisionAlgorithm(sizeof(btGImpactCollisionAlgorithm));
219 return new(mem) btGImpactCollisionAlgorithm(ci,body0,body1);
223 //! Use this function for register the algorithm externally
224 static void registerAlgorithm(btCollisionDispatcher * dispatcher);
225 #ifdef TRI_COLLISION_PROFILING
226 //! Gets the average time in miliseconds of tree collisions
227 static float getAverageTreeCollisionTime();
229 //! Gets the average time in miliseconds of triangle collisions
230 static float getAverageTriangleCollisionTime();
231 #endif //TRI_COLLISION_PROFILING
233 //! Collides two gimpact shapes
235 \pre shape0 and shape1 couldn't be btGImpactMeshShape objects
239 void gimpact_vs_gimpact(btCollisionObject * body0,
240 btCollisionObject * body1,
241 btGImpactShapeInterface * shape0,
242 btGImpactShapeInterface * shape1);
244 void gimpact_vs_shape(btCollisionObject * body0,
245 btCollisionObject * body1,
246 btGImpactShapeInterface * shape0,
247 btCollisionShape * shape1,bool swapped);
249 void gimpact_vs_compoundshape(btCollisionObject * body0,
250 btCollisionObject * body1,
251 btGImpactShapeInterface * shape0,
252 btCompoundShape * shape1,bool swapped);
254 void gimpact_vs_concave(
255 btCollisionObject * body0,
256 btCollisionObject * body1,
257 btGImpactShapeInterface * shape0,
258 btConcaveShape * shape1,bool swapped);
263 /// Accessor/Mutator pairs for Part and triangleID
264 void setFace0(int value)
272 void setFace1(int value)
280 void setPart0(int value)
288 void setPart1(int value)
301 //#define BULLET_TRIANGLE_COLLISION 1
302 #define GIMPACT_VS_PLANE_COLLISION 1
306 #endif //BT_GIMPACT_BVH_CONCAVE_COLLISION_ALGORITHM_H