/* * Java port of Bullet (c) 2008 Martin Dvorak <jezek2@advel.cz> * * Bullet Continuous Collision Detection and Physics Library * Copyright (c) 2003-2008 Erwin Coumans http://www.bulletphysics.com/ * * This software is provided 'as-is', without any express or implied warranty. * In no event will the authors be held liable for any damages arising from * the use of this software. * * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * * 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. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ package com.bulletphysics.collision.dispatch; import com.bulletphysics.collision.broadphase.BroadphaseNativeType; import com.bulletphysics.collision.narrowphase.ConvexPenetrationDepthSolver; import com.bulletphysics.collision.narrowphase.GjkEpaPenetrationDepthSolver; import com.bulletphysics.collision.narrowphase.VoronoiSimplexSolver; import com.bulletphysics.extras.gimpact.GImpactCollisionAlgorithm; import static com.bulletphysics.collision.broadphase.BroadphaseNativeType.*; /** * Default implementation of {@link CollisionConfiguration}. Provides all core * collision algorithms. Some extra algorithms (like {@link GImpactCollisionAlgorithm GImpact}) * must be registered manually by calling appropriate register method. * * @author jezek2 */ public class DefaultCollisionConfiguration extends CollisionConfiguration { //default simplex/penetration depth solvers protected VoronoiSimplexSolver simplexSolver; protected ConvexPenetrationDepthSolver pdSolver; //default CreationFunctions, filling the m_doubleDispatch table protected CollisionAlgorithmCreateFunc convexConvexCreateFunc; protected CollisionAlgorithmCreateFunc convexConcaveCreateFunc; protected CollisionAlgorithmCreateFunc swappedConvexConcaveCreateFunc; protected CollisionAlgorithmCreateFunc compoundCreateFunc; protected CollisionAlgorithmCreateFunc swappedCompoundCreateFunc; protected CollisionAlgorithmCreateFunc emptyCreateFunc; protected CollisionAlgorithmCreateFunc sphereSphereCF; protected CollisionAlgorithmCreateFunc sphereBoxCF; protected CollisionAlgorithmCreateFunc boxSphereCF; protected CollisionAlgorithmCreateFunc boxBoxCF; protected CollisionAlgorithmCreateFunc sphereTriangleCF; protected CollisionAlgorithmCreateFunc triangleSphereCF; protected CollisionAlgorithmCreateFunc planeConvexCF; protected CollisionAlgorithmCreateFunc convexPlaneCF; public DefaultCollisionConfiguration() { simplexSolver = new VoronoiSimplexSolver(); //#define USE_EPA 1 //#ifdef USE_EPA pdSolver = new GjkEpaPenetrationDepthSolver(); //#else //pdSolver = new MinkowskiPenetrationDepthSolver(); //#endif//USE_EPA /* //default CreationFunctions, filling the m_doubleDispatch table */ convexConvexCreateFunc = new ConvexConvexAlgorithm.CreateFunc(simplexSolver, pdSolver); convexConcaveCreateFunc = new ConvexConcaveCollisionAlgorithm.CreateFunc(); swappedConvexConcaveCreateFunc = new ConvexConcaveCollisionAlgorithm.SwappedCreateFunc(); compoundCreateFunc = new CompoundCollisionAlgorithm.CreateFunc(); swappedCompoundCreateFunc = new CompoundCollisionAlgorithm.SwappedCreateFunc(); emptyCreateFunc = new EmptyAlgorithm.CreateFunc(); sphereSphereCF = new SphereSphereCollisionAlgorithm.CreateFunc(); /* m_sphereBoxCF = new(mem) btSphereBoxCollisionAlgorithm::CreateFunc; m_boxSphereCF = new (mem)btSphereBoxCollisionAlgorithm::CreateFunc; m_boxSphereCF->m_swapped = true; m_sphereTriangleCF = new (mem)btSphereTriangleCollisionAlgorithm::CreateFunc; m_triangleSphereCF = new (mem)btSphereTriangleCollisionAlgorithm::CreateFunc; m_triangleSphereCF->m_swapped = true; mem = btAlignedAlloc(sizeof(btBoxBoxCollisionAlgorithm::CreateFunc),16); m_boxBoxCF = new(mem)btBoxBoxCollisionAlgorithm::CreateFunc; */ // convex versus plane convexPlaneCF = new ConvexPlaneCollisionAlgorithm.CreateFunc(); planeConvexCF = new ConvexPlaneCollisionAlgorithm.CreateFunc(); planeConvexCF.swapped = true; /* ///calculate maximum element size, big enough to fit any collision algorithm in the memory pool int maxSize = sizeof(btConvexConvexAlgorithm); int maxSize2 = sizeof(btConvexConcaveCollisionAlgorithm); int maxSize3 = sizeof(btCompoundCollisionAlgorithm); int maxSize4 = sizeof(btEmptyAlgorithm); int collisionAlgorithmMaxElementSize = btMax(maxSize,maxSize2); collisionAlgorithmMaxElementSize = btMax(collisionAlgorithmMaxElementSize,maxSize3); collisionAlgorithmMaxElementSize = btMax(collisionAlgorithmMaxElementSize,maxSize4); if (stackAlloc) { m_ownsStackAllocator = false; this->m_stackAlloc = stackAlloc; } else { m_ownsStackAllocator = true; void* mem = btAlignedAlloc(sizeof(btStackAlloc),16); m_stackAlloc = new(mem)btStackAlloc(DEFAULT_STACK_ALLOCATOR_SIZE); } if (persistentManifoldPool) { m_ownsPersistentManifoldPool = false; m_persistentManifoldPool = persistentManifoldPool; } else { m_ownsPersistentManifoldPool = true; void* mem = btAlignedAlloc(sizeof(btPoolAllocator),16); m_persistentManifoldPool = new (mem) btPoolAllocator(sizeof(btPersistentManifold),DEFAULT_MAX_OVERLAPPING_PAIRS); } if (collisionAlgorithmPool) { m_ownsCollisionAlgorithmPool = false; m_collisionAlgorithmPool = collisionAlgorithmPool; } else { m_ownsCollisionAlgorithmPool = true; void* mem = btAlignedAlloc(sizeof(btPoolAllocator),16); m_collisionAlgorithmPool = new(mem) btPoolAllocator(collisionAlgorithmMaxElementSize,DEFAULT_MAX_OVERLAPPING_PAIRS); } */ } @Override public CollisionAlgorithmCreateFunc getCollisionAlgorithmCreateFunc(BroadphaseNativeType proxyType0, BroadphaseNativeType proxyType1) { if ((proxyType0 == SPHERE_SHAPE_PROXYTYPE) && (proxyType1 == SPHERE_SHAPE_PROXYTYPE)) { return sphereSphereCF; } /* if ((proxyType0 == SPHERE_SHAPE_PROXYTYPE) && (proxyType1==BOX_SHAPE_PROXYTYPE)) { return m_sphereBoxCF; } if ((proxyType0 == BOX_SHAPE_PROXYTYPE ) && (proxyType1==SPHERE_SHAPE_PROXYTYPE)) { return m_boxSphereCF; } if ((proxyType0 == SPHERE_SHAPE_PROXYTYPE ) && (proxyType1==TRIANGLE_SHAPE_PROXYTYPE)) { return m_sphereTriangleCF; } if ((proxyType0 == TRIANGLE_SHAPE_PROXYTYPE ) && (proxyType1==SPHERE_SHAPE_PROXYTYPE)) { return m_triangleSphereCF; } if ((proxyType0 == BOX_SHAPE_PROXYTYPE) && (proxyType1 == BOX_SHAPE_PROXYTYPE)) { return boxBoxCF; } */ if (proxyType0.isConvex() && (proxyType1 == STATIC_PLANE_PROXYTYPE)) { return convexPlaneCF; } if (proxyType1.isConvex() && (proxyType0 == STATIC_PLANE_PROXYTYPE)) { return planeConvexCF; } if (proxyType0.isConvex() && proxyType1.isConvex()) { return convexConvexCreateFunc; } if (proxyType0.isConvex() && proxyType1.isConcave()) { return convexConcaveCreateFunc; } if (proxyType1.isConvex() && proxyType0.isConcave()) { return swappedConvexConcaveCreateFunc; } if (proxyType0.isCompound()) { return compoundCreateFunc; } else { if (proxyType1.isCompound()) { return swappedCompoundCreateFunc; } } // failed to find an algorithm return emptyCreateFunc; } }