com.bulletphysics.collision.dispatch.DefaultCollisionConfiguration Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jbullet Show documentation
Show all versions of jbullet Show documentation
JBullet - Java port of Bullet Physics Library
The newest version!
/*
* Java port of Bullet (c) 2008 Martin Dvorak
*
* 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;
}
}