Package com.bulletphysics.collision.dispatch

Source Code of com.bulletphysics.collision.dispatch.DefaultCollisionConfiguration

/*
* 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;
  }

}
TOP

Related Classes of com.bulletphysics.collision.dispatch.DefaultCollisionConfiguration

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.