2 Bullet Continuous Collision Detection and Physics Library
3 Copyright (c) 2003-2006 Erwin Coumans https://bulletphysics.org
5 This software is provided 'as-is', without any express or implied warranty.
6 In no event will the authors be held liable for any damages arising from the use of this software.
7 Permission is granted to anyone to use this software for any purpose,
8 including commercial applications, and to alter it and redistribute it freely,
9 subject to the following restrictions:
11 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.
12 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
13 3. This notice may not be removed or altered from any source distribution.
16 #include "btDefaultCollisionConfiguration.h"
18 #include "BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.h"
19 #include "BulletCollision/CollisionDispatch/btEmptyCollisionAlgorithm.h"
20 #include "BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.h"
21 #include "BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.h"
22 #include "BulletCollision/CollisionDispatch/btCompoundCompoundCollisionAlgorithm.h"
24 #include "BulletCollision/CollisionDispatch/btConvexPlaneCollisionAlgorithm.h"
25 #include "BulletCollision/CollisionDispatch/btBoxBoxCollisionAlgorithm.h"
26 #include "BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.h"
27 #ifdef USE_BUGGY_SPHERE_BOX_ALGORITHM
28 #include "BulletCollision/CollisionDispatch/btSphereBoxCollisionAlgorithm.h"
29 #endif //USE_BUGGY_SPHERE_BOX_ALGORITHM
30 #include "BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.h"
31 #include "BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.h"
32 #include "BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.h"
33 #include "BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h"
35 #include "LinearMath/btPoolAllocator.h"
37 btDefaultCollisionConfiguration::btDefaultCollisionConfiguration(const btDefaultCollisionConstructionInfo& constructionInfo)
38 //btDefaultCollisionConfiguration::btDefaultCollisionConfiguration(btStackAlloc* stackAlloc,btPoolAllocator* persistentManifoldPool,btPoolAllocator* collisionAlgorithmPool)
41 if (constructionInfo.m_useEpaPenetrationAlgorithm)
43 mem = btAlignedAlloc(sizeof(btGjkEpaPenetrationDepthSolver), 16);
44 m_pdSolver = new (mem) btGjkEpaPenetrationDepthSolver;
48 mem = btAlignedAlloc(sizeof(btMinkowskiPenetrationDepthSolver), 16);
49 m_pdSolver = new (mem) btMinkowskiPenetrationDepthSolver;
52 //default CreationFunctions, filling the m_doubleDispatch table
53 mem = btAlignedAlloc(sizeof(btConvexConvexAlgorithm::CreateFunc), 16);
54 m_convexConvexCreateFunc = new (mem) btConvexConvexAlgorithm::CreateFunc(m_pdSolver);
55 mem = btAlignedAlloc(sizeof(btConvexConcaveCollisionAlgorithm::CreateFunc), 16);
56 m_convexConcaveCreateFunc = new (mem) btConvexConcaveCollisionAlgorithm::CreateFunc;
57 mem = btAlignedAlloc(sizeof(btConvexConcaveCollisionAlgorithm::CreateFunc), 16);
58 m_swappedConvexConcaveCreateFunc = new (mem) btConvexConcaveCollisionAlgorithm::SwappedCreateFunc;
59 mem = btAlignedAlloc(sizeof(btCompoundCollisionAlgorithm::CreateFunc), 16);
60 m_compoundCreateFunc = new (mem) btCompoundCollisionAlgorithm::CreateFunc;
62 mem = btAlignedAlloc(sizeof(btCompoundCompoundCollisionAlgorithm::CreateFunc), 16);
63 m_compoundCompoundCreateFunc = new (mem) btCompoundCompoundCollisionAlgorithm::CreateFunc;
65 mem = btAlignedAlloc(sizeof(btCompoundCollisionAlgorithm::SwappedCreateFunc), 16);
66 m_swappedCompoundCreateFunc = new (mem) btCompoundCollisionAlgorithm::SwappedCreateFunc;
67 mem = btAlignedAlloc(sizeof(btEmptyAlgorithm::CreateFunc), 16);
68 m_emptyCreateFunc = new (mem) btEmptyAlgorithm::CreateFunc;
70 mem = btAlignedAlloc(sizeof(btSphereSphereCollisionAlgorithm::CreateFunc), 16);
71 m_sphereSphereCF = new (mem) btSphereSphereCollisionAlgorithm::CreateFunc;
72 #ifdef USE_BUGGY_SPHERE_BOX_ALGORITHM
73 mem = btAlignedAlloc(sizeof(btSphereBoxCollisionAlgorithm::CreateFunc), 16);
74 m_sphereBoxCF = new (mem) btSphereBoxCollisionAlgorithm::CreateFunc;
75 mem = btAlignedAlloc(sizeof(btSphereBoxCollisionAlgorithm::CreateFunc), 16);
76 m_boxSphereCF = new (mem) btSphereBoxCollisionAlgorithm::CreateFunc;
77 m_boxSphereCF->m_swapped = true;
78 #endif //USE_BUGGY_SPHERE_BOX_ALGORITHM
80 mem = btAlignedAlloc(sizeof(btSphereTriangleCollisionAlgorithm::CreateFunc), 16);
81 m_sphereTriangleCF = new (mem) btSphereTriangleCollisionAlgorithm::CreateFunc;
82 mem = btAlignedAlloc(sizeof(btSphereTriangleCollisionAlgorithm::CreateFunc), 16);
83 m_triangleSphereCF = new (mem) btSphereTriangleCollisionAlgorithm::CreateFunc;
84 m_triangleSphereCF->m_swapped = true;
86 mem = btAlignedAlloc(sizeof(btBoxBoxCollisionAlgorithm::CreateFunc), 16);
87 m_boxBoxCF = new (mem) btBoxBoxCollisionAlgorithm::CreateFunc;
90 mem = btAlignedAlloc(sizeof(btConvexPlaneCollisionAlgorithm::CreateFunc), 16);
91 m_convexPlaneCF = new (mem) btConvexPlaneCollisionAlgorithm::CreateFunc;
92 mem = btAlignedAlloc(sizeof(btConvexPlaneCollisionAlgorithm::CreateFunc), 16);
93 m_planeConvexCF = new (mem) btConvexPlaneCollisionAlgorithm::CreateFunc;
94 m_planeConvexCF->m_swapped = true;
96 ///calculate maximum element size, big enough to fit any collision algorithm in the memory pool
97 int maxSize = sizeof(btConvexConvexAlgorithm);
98 int maxSize2 = sizeof(btConvexConcaveCollisionAlgorithm);
99 int maxSize3 = sizeof(btCompoundCollisionAlgorithm);
100 int maxSize4 = sizeof(btCompoundCompoundCollisionAlgorithm);
102 int collisionAlgorithmMaxElementSize = btMax(maxSize, constructionInfo.m_customCollisionAlgorithmMaxElementSize);
103 collisionAlgorithmMaxElementSize = btMax(collisionAlgorithmMaxElementSize, maxSize2);
104 collisionAlgorithmMaxElementSize = btMax(collisionAlgorithmMaxElementSize, maxSize3);
105 collisionAlgorithmMaxElementSize = btMax(collisionAlgorithmMaxElementSize, maxSize4);
107 if (constructionInfo.m_persistentManifoldPool)
109 m_ownsPersistentManifoldPool = false;
110 m_persistentManifoldPool = constructionInfo.m_persistentManifoldPool;
114 m_ownsPersistentManifoldPool = true;
115 void* mem = btAlignedAlloc(sizeof(btPoolAllocator), 16);
116 m_persistentManifoldPool = new (mem) btPoolAllocator(sizeof(btPersistentManifold), constructionInfo.m_defaultMaxPersistentManifoldPoolSize);
119 collisionAlgorithmMaxElementSize = (collisionAlgorithmMaxElementSize + 16) & 0xffffffffffff0;
120 if (constructionInfo.m_collisionAlgorithmPool)
122 m_ownsCollisionAlgorithmPool = false;
123 m_collisionAlgorithmPool = constructionInfo.m_collisionAlgorithmPool;
127 m_ownsCollisionAlgorithmPool = true;
128 void* mem = btAlignedAlloc(sizeof(btPoolAllocator), 16);
129 m_collisionAlgorithmPool = new (mem) btPoolAllocator(collisionAlgorithmMaxElementSize, constructionInfo.m_defaultMaxCollisionAlgorithmPoolSize);
133 btDefaultCollisionConfiguration::~btDefaultCollisionConfiguration()
135 if (m_ownsCollisionAlgorithmPool)
137 m_collisionAlgorithmPool->~btPoolAllocator();
138 btAlignedFree(m_collisionAlgorithmPool);
140 if (m_ownsPersistentManifoldPool)
142 m_persistentManifoldPool->~btPoolAllocator();
143 btAlignedFree(m_persistentManifoldPool);
146 m_convexConvexCreateFunc->~btCollisionAlgorithmCreateFunc();
147 btAlignedFree(m_convexConvexCreateFunc);
149 m_convexConcaveCreateFunc->~btCollisionAlgorithmCreateFunc();
150 btAlignedFree(m_convexConcaveCreateFunc);
151 m_swappedConvexConcaveCreateFunc->~btCollisionAlgorithmCreateFunc();
152 btAlignedFree(m_swappedConvexConcaveCreateFunc);
154 m_compoundCreateFunc->~btCollisionAlgorithmCreateFunc();
155 btAlignedFree(m_compoundCreateFunc);
157 m_compoundCompoundCreateFunc->~btCollisionAlgorithmCreateFunc();
158 btAlignedFree(m_compoundCompoundCreateFunc);
160 m_swappedCompoundCreateFunc->~btCollisionAlgorithmCreateFunc();
161 btAlignedFree(m_swappedCompoundCreateFunc);
163 m_emptyCreateFunc->~btCollisionAlgorithmCreateFunc();
164 btAlignedFree(m_emptyCreateFunc);
166 m_sphereSphereCF->~btCollisionAlgorithmCreateFunc();
167 btAlignedFree(m_sphereSphereCF);
169 #ifdef USE_BUGGY_SPHERE_BOX_ALGORITHM
170 m_sphereBoxCF->~btCollisionAlgorithmCreateFunc();
171 btAlignedFree(m_sphereBoxCF);
172 m_boxSphereCF->~btCollisionAlgorithmCreateFunc();
173 btAlignedFree(m_boxSphereCF);
174 #endif //USE_BUGGY_SPHERE_BOX_ALGORITHM
176 m_sphereTriangleCF->~btCollisionAlgorithmCreateFunc();
177 btAlignedFree(m_sphereTriangleCF);
178 m_triangleSphereCF->~btCollisionAlgorithmCreateFunc();
179 btAlignedFree(m_triangleSphereCF);
180 m_boxBoxCF->~btCollisionAlgorithmCreateFunc();
181 btAlignedFree(m_boxBoxCF);
183 m_convexPlaneCF->~btCollisionAlgorithmCreateFunc();
184 btAlignedFree(m_convexPlaneCF);
185 m_planeConvexCF->~btCollisionAlgorithmCreateFunc();
186 btAlignedFree(m_planeConvexCF);
188 m_pdSolver->~btConvexPenetrationDepthSolver();
190 btAlignedFree(m_pdSolver);
193 btCollisionAlgorithmCreateFunc* btDefaultCollisionConfiguration::getClosestPointsAlgorithmCreateFunc(int proxyType0, int proxyType1)
195 if ((proxyType0 == SPHERE_SHAPE_PROXYTYPE) && (proxyType1 == SPHERE_SHAPE_PROXYTYPE))
197 return m_sphereSphereCF;
199 #ifdef USE_BUGGY_SPHERE_BOX_ALGORITHM
200 if ((proxyType0 == SPHERE_SHAPE_PROXYTYPE) && (proxyType1 == BOX_SHAPE_PROXYTYPE))
202 return m_sphereBoxCF;
205 if ((proxyType0 == BOX_SHAPE_PROXYTYPE) && (proxyType1 == SPHERE_SHAPE_PROXYTYPE))
207 return m_boxSphereCF;
209 #endif //USE_BUGGY_SPHERE_BOX_ALGORITHM
211 if ((proxyType0 == SPHERE_SHAPE_PROXYTYPE) && (proxyType1 == TRIANGLE_SHAPE_PROXYTYPE))
213 return m_sphereTriangleCF;
216 if ((proxyType0 == TRIANGLE_SHAPE_PROXYTYPE) && (proxyType1 == SPHERE_SHAPE_PROXYTYPE))
218 return m_triangleSphereCF;
221 if (btBroadphaseProxy::isConvex(proxyType0) && (proxyType1 == STATIC_PLANE_PROXYTYPE))
223 return m_convexPlaneCF;
226 if (btBroadphaseProxy::isConvex(proxyType1) && (proxyType0 == STATIC_PLANE_PROXYTYPE))
228 return m_planeConvexCF;
231 if (btBroadphaseProxy::isConvex(proxyType0) && btBroadphaseProxy::isConvex(proxyType1))
233 return m_convexConvexCreateFunc;
236 if (btBroadphaseProxy::isConvex(proxyType0) && btBroadphaseProxy::isConcave(proxyType1))
238 return m_convexConcaveCreateFunc;
241 if (btBroadphaseProxy::isConvex(proxyType1) && btBroadphaseProxy::isConcave(proxyType0))
243 return m_swappedConvexConcaveCreateFunc;
246 if (btBroadphaseProxy::isCompound(proxyType0) && btBroadphaseProxy::isCompound(proxyType1))
248 return m_compoundCompoundCreateFunc;
251 if (btBroadphaseProxy::isCompound(proxyType0))
253 return m_compoundCreateFunc;
257 if (btBroadphaseProxy::isCompound(proxyType1))
259 return m_swappedCompoundCreateFunc;
263 //failed to find an algorithm
264 return m_emptyCreateFunc;
267 btCollisionAlgorithmCreateFunc* btDefaultCollisionConfiguration::getCollisionAlgorithmCreateFunc(int proxyType0, int proxyType1)
269 if ((proxyType0 == SPHERE_SHAPE_PROXYTYPE) && (proxyType1 == SPHERE_SHAPE_PROXYTYPE))
271 return m_sphereSphereCF;
273 #ifdef USE_BUGGY_SPHERE_BOX_ALGORITHM
274 if ((proxyType0 == SPHERE_SHAPE_PROXYTYPE) && (proxyType1 == BOX_SHAPE_PROXYTYPE))
276 return m_sphereBoxCF;
279 if ((proxyType0 == BOX_SHAPE_PROXYTYPE) && (proxyType1 == SPHERE_SHAPE_PROXYTYPE))
281 return m_boxSphereCF;
283 #endif //USE_BUGGY_SPHERE_BOX_ALGORITHM
285 if ((proxyType0 == SPHERE_SHAPE_PROXYTYPE) && (proxyType1 == TRIANGLE_SHAPE_PROXYTYPE))
287 return m_sphereTriangleCF;
290 if ((proxyType0 == TRIANGLE_SHAPE_PROXYTYPE) && (proxyType1 == SPHERE_SHAPE_PROXYTYPE))
292 return m_triangleSphereCF;
295 if ((proxyType0 == BOX_SHAPE_PROXYTYPE) && (proxyType1 == BOX_SHAPE_PROXYTYPE))
300 if (btBroadphaseProxy::isConvex(proxyType0) && (proxyType1 == STATIC_PLANE_PROXYTYPE))
302 return m_convexPlaneCF;
305 if (btBroadphaseProxy::isConvex(proxyType1) && (proxyType0 == STATIC_PLANE_PROXYTYPE))
307 return m_planeConvexCF;
310 if (btBroadphaseProxy::isConvex(proxyType0) && btBroadphaseProxy::isConvex(proxyType1))
312 return m_convexConvexCreateFunc;
315 if (btBroadphaseProxy::isConvex(proxyType0) && btBroadphaseProxy::isConcave(proxyType1))
317 return m_convexConcaveCreateFunc;
320 if (btBroadphaseProxy::isConvex(proxyType1) && btBroadphaseProxy::isConcave(proxyType0))
322 return m_swappedConvexConcaveCreateFunc;
325 if (btBroadphaseProxy::isCompound(proxyType0) && btBroadphaseProxy::isCompound(proxyType1))
327 return m_compoundCompoundCreateFunc;
330 if (btBroadphaseProxy::isCompound(proxyType0))
332 return m_compoundCreateFunc;
336 if (btBroadphaseProxy::isCompound(proxyType1))
338 return m_swappedCompoundCreateFunc;
342 //failed to find an algorithm
343 return m_emptyCreateFunc;
346 void btDefaultCollisionConfiguration::setConvexConvexMultipointIterations(int numPerturbationIterations, int minimumPointsPerturbationThreshold)
348 btConvexConvexAlgorithm::CreateFunc* convexConvex = (btConvexConvexAlgorithm::CreateFunc*)m_convexConvexCreateFunc;
349 convexConvex->m_numPerturbationIterations = numPerturbationIterations;
350 convexConvex->m_minimumPointsPerturbationThreshold = minimumPointsPerturbationThreshold;
353 void btDefaultCollisionConfiguration::setPlaneConvexMultipointIterations(int numPerturbationIterations, int minimumPointsPerturbationThreshold)
355 btConvexPlaneCollisionAlgorithm::CreateFunc* cpCF = (btConvexPlaneCollisionAlgorithm::CreateFunc*)m_convexPlaneCF;
356 cpCF->m_numPerturbationIterations = numPerturbationIterations;
357 cpCF->m_minimumPointsPerturbationThreshold = minimumPointsPerturbationThreshold;
359 btConvexPlaneCollisionAlgorithm::CreateFunc* pcCF = (btConvexPlaneCollisionAlgorithm::CreateFunc*)m_planeConvexCF;
360 pcCF->m_numPerturbationIterations = numPerturbationIterations;
361 pcCF->m_minimumPointsPerturbationThreshold = minimumPointsPerturbationThreshold;