add getAabb for btSoftBody,
add btSoftBodyConcaveCollisionAlgorithm, and register algorithm
This commit is contained in:
@@ -369,6 +369,12 @@ public:
|
|||||||
tFaceArray& getFaces();
|
tFaceArray& getFaces();
|
||||||
const tFaceArray& getFaces() const;
|
const tFaceArray& getFaces() const;
|
||||||
|
|
||||||
|
virtual void getAabb(btVector3& aabbMin,btVector3& aabbMax) const
|
||||||
|
{
|
||||||
|
aabbMin = m_bounds[0];
|
||||||
|
aabbMax = m_bounds[1];
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Cast
|
// Cast
|
||||||
//
|
//
|
||||||
|
|||||||
336
src/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.cpp
Normal file
336
src/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.cpp
Normal file
@@ -0,0 +1,336 @@
|
|||||||
|
/*
|
||||||
|
Bullet Continuous Collision Detection and Physics Library
|
||||||
|
Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
|
||||||
|
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "btSoftBodyConcaveCollisionAlgorithm.h"
|
||||||
|
#include "BulletCollision/CollisionDispatch/btCollisionObject.h"
|
||||||
|
#include "BulletCollision/CollisionShapes/btMultiSphereShape.h"
|
||||||
|
#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h"
|
||||||
|
#include "BulletCollision/CollisionShapes/btConcaveShape.h"
|
||||||
|
#include "BulletCollision/CollisionDispatch/btManifoldResult.h"
|
||||||
|
#include "BulletCollision/NarrowPhaseCollision/btRaycastCallback.h"
|
||||||
|
#include "BulletCollision/CollisionShapes/btTriangleShape.h"
|
||||||
|
#include "BulletCollision/CollisionShapes/btSphereShape.h"
|
||||||
|
#include "LinearMath/btIDebugDraw.h"
|
||||||
|
#include "BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.h"
|
||||||
|
#include "BulletSoftBody/btSoftBody.h"
|
||||||
|
|
||||||
|
btSoftBodyConcaveCollisionAlgorithm::btSoftBodyConcaveCollisionAlgorithm( const btCollisionAlgorithmConstructionInfo& ci, btCollisionObject* body0,btCollisionObject* body1,bool isSwapped)
|
||||||
|
: btCollisionAlgorithm(ci),
|
||||||
|
m_isSwapped(isSwapped),
|
||||||
|
m_btSoftBodyTriangleCallback(ci.m_dispatcher1,body0,body1,isSwapped)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
btSoftBodyConcaveCollisionAlgorithm::~btSoftBodyConcaveCollisionAlgorithm()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
btSoftBodyTriangleCallback::btSoftBodyTriangleCallback(btDispatcher* dispatcher,btCollisionObject* body0,btCollisionObject* body1,bool isSwapped):
|
||||||
|
m_dispatcher(dispatcher),
|
||||||
|
m_dispatchInfoPtr(0)
|
||||||
|
{
|
||||||
|
m_softBody = (btSoftBody*) (isSwapped? body1:body0);
|
||||||
|
m_triBody = isSwapped? body0:body1;
|
||||||
|
|
||||||
|
//
|
||||||
|
// create the manifold from the dispatcher 'manifold pool'
|
||||||
|
//
|
||||||
|
// m_manifoldPtr = m_dispatcher->getNewManifold(m_convexBody,m_triBody);
|
||||||
|
|
||||||
|
clearCache();
|
||||||
|
}
|
||||||
|
|
||||||
|
btSoftBodyTriangleCallback::~btSoftBodyTriangleCallback()
|
||||||
|
{
|
||||||
|
clearCache();
|
||||||
|
// m_dispatcher->releaseManifold( m_manifoldPtr );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void btSoftBodyTriangleCallback::clearCache()
|
||||||
|
{
|
||||||
|
m_dispatcher->clearManifold(m_manifoldPtr);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void btSoftBodyTriangleCallback::processTriangle(btVector3* triangle,int partId, int triangleIndex)
|
||||||
|
{
|
||||||
|
|
||||||
|
//just for debugging purposes
|
||||||
|
//printf("triangle %d",m_triangleCount++);
|
||||||
|
|
||||||
|
|
||||||
|
//aabb filter is already applied!
|
||||||
|
|
||||||
|
btCollisionAlgorithmConstructionInfo ci;
|
||||||
|
ci.m_dispatcher1 = m_dispatcher;
|
||||||
|
|
||||||
|
btCollisionObject* ob = static_cast<btCollisionObject*>(m_triBody);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
///debug drawing of the overlapping triangles
|
||||||
|
if (m_dispatchInfoPtr && m_dispatchInfoPtr->m_debugDraw && m_dispatchInfoPtr->m_debugDraw->getDebugMode() > 0)
|
||||||
|
{
|
||||||
|
btVector3 color(255,255,0);
|
||||||
|
btTransform& tr = ob->getWorldTransform();
|
||||||
|
m_dispatchInfoPtr->m_debugDraw->drawLine(tr(triangle[0]),tr(triangle[1]),color);
|
||||||
|
m_dispatchInfoPtr->m_debugDraw->drawLine(tr(triangle[1]),tr(triangle[2]),color);
|
||||||
|
m_dispatchInfoPtr->m_debugDraw->drawLine(tr(triangle[2]),tr(triangle[0]),color);
|
||||||
|
|
||||||
|
//btVector3 center = triangle[0] + triangle[1]+triangle[2];
|
||||||
|
//center *= btScalar(0.333333);
|
||||||
|
//m_dispatchInfoPtr->m_debugDraw->drawLine(tr(triangle[0]),tr(center),color);
|
||||||
|
//m_dispatchInfoPtr->m_debugDraw->drawLine(tr(triangle[1]),tr(center),color);
|
||||||
|
//m_dispatchInfoPtr->m_debugDraw->drawLine(tr(triangle[2]),tr(center),color);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//btCollisionObject* colObj = static_cast<btCollisionObject*>(m_convexProxy->m_clientObject);
|
||||||
|
|
||||||
|
// if (m_softBody->getCollisionShape()->getShapeType()==
|
||||||
|
{
|
||||||
|
btTriangleShape tm(triangle[0],triangle[1],triangle[2]);
|
||||||
|
tm.setMargin(m_collisionMarginTriangle);
|
||||||
|
btCollisionShape* tmpShape = ob->getCollisionShape();
|
||||||
|
|
||||||
|
//copy over user pointers to temporary shape
|
||||||
|
tm.setUserPointer(tmpShape->getUserPointer());
|
||||||
|
|
||||||
|
ob->setCollisionShape( &tm );
|
||||||
|
|
||||||
|
|
||||||
|
btCollisionAlgorithm* colAlgo = ci.m_dispatcher1->findAlgorithm(m_softBody,m_triBody,m_manifoldPtr);
|
||||||
|
///this should use the btDispatcher, so the actual registered algorithm is used
|
||||||
|
// btConvexConvexAlgorithm cvxcvxalgo(m_manifoldPtr,ci,m_convexBody,m_triBody);
|
||||||
|
|
||||||
|
m_resultOut->setShapeIdentifiers(-1,-1,partId,triangleIndex);
|
||||||
|
// cvxcvxalgo.setShapeIdentifiers(-1,-1,partId,triangleIndex);
|
||||||
|
// cvxcvxalgo.processCollision(m_convexBody,m_triBody,*m_dispatchInfoPtr,m_resultOut);
|
||||||
|
colAlgo->processCollision(m_softBody,m_triBody,*m_dispatchInfoPtr,m_resultOut);
|
||||||
|
colAlgo->~btCollisionAlgorithm();
|
||||||
|
ci.m_dispatcher1->freeCollisionAlgorithm(colAlgo);
|
||||||
|
ob->setCollisionShape( tmpShape );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void btSoftBodyTriangleCallback::setTimeStepAndCounters(btScalar collisionMarginTriangle,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
|
||||||
|
{
|
||||||
|
m_dispatchInfoPtr = &dispatchInfo;
|
||||||
|
m_collisionMarginTriangle = collisionMarginTriangle;
|
||||||
|
m_resultOut = resultOut;
|
||||||
|
|
||||||
|
//recalc aabbs
|
||||||
|
// btTransform softbodyInTriangleSpace;
|
||||||
|
// softbodyInTriangleSpace = m_triBody->getWorldTransform().inverse() * m_softBody->getWorldTransform();
|
||||||
|
// btCollisionShape* convexShape = static_cast<btCollisionShape*>(m_convexBody->getCollisionShape());
|
||||||
|
//CollisionShape* triangleShape = static_cast<btCollisionShape*>(triBody->m_collisionShape);
|
||||||
|
btVector3 aabbWorldSpaceMin,aabbWorldSpaceMax;
|
||||||
|
m_softBody->getAabb(aabbWorldSpaceMin,aabbWorldSpaceMax);
|
||||||
|
|
||||||
|
btVector3 halfExtents = (aabbWorldSpaceMax-aabbWorldSpaceMin)*btScalar(0.5);
|
||||||
|
btVector3 softBodyCenter = (aabbWorldSpaceMax+aabbWorldSpaceMin)*btScalar(0.5);
|
||||||
|
|
||||||
|
btTransform triInverse = m_triBody->getWorldTransform().inverse();
|
||||||
|
|
||||||
|
btMatrix3x3 abs_b = triInverse.getBasis().absolute();
|
||||||
|
btPoint3 center = softBodyCenter + triInverse.getOrigin();
|
||||||
|
|
||||||
|
btVector3 extent = btVector3(abs_b[0].dot(halfExtents),
|
||||||
|
abs_b[1].dot(halfExtents),
|
||||||
|
abs_b[2].dot(halfExtents));
|
||||||
|
// extent += btVector3(getMargin(),getMargin(),getMargin());
|
||||||
|
|
||||||
|
btVector3 aabbMin,aabbMax;
|
||||||
|
aabbMin = center - extent;
|
||||||
|
aabbMax = center + extent;
|
||||||
|
|
||||||
|
btScalar extraMargin = collisionMarginTriangle;
|
||||||
|
btVector3 extra(extraMargin,extraMargin,extraMargin);
|
||||||
|
|
||||||
|
m_aabbMax += extra;
|
||||||
|
m_aabbMin -= extra;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void btSoftBodyConcaveCollisionAlgorithm::clearCache()
|
||||||
|
{
|
||||||
|
m_btSoftBodyTriangleCallback.clearCache();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void btSoftBodyConcaveCollisionAlgorithm::processCollision (btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
btCollisionObject* convexBody = m_isSwapped ? body1 : body0;
|
||||||
|
btCollisionObject* triBody = m_isSwapped ? body0 : body1;
|
||||||
|
|
||||||
|
if (triBody->getCollisionShape()->isConcave())
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
btCollisionObject* triOb = triBody;
|
||||||
|
btConcaveShape* concaveShape = static_cast<btConcaveShape*>( triOb->getCollisionShape());
|
||||||
|
|
||||||
|
if (convexBody->getCollisionShape()->isConvex())
|
||||||
|
{
|
||||||
|
btScalar collisionMarginTriangle = concaveShape->getMargin();
|
||||||
|
|
||||||
|
resultOut->setPersistentManifold(m_btSoftBodyTriangleCallback.m_manifoldPtr);
|
||||||
|
m_btSoftBodyTriangleCallback.setTimeStepAndCounters(collisionMarginTriangle,dispatchInfo,resultOut);
|
||||||
|
|
||||||
|
//Disable persistency. previously, some older algorithm calculated all contacts in one go, so you can clear it here.
|
||||||
|
//m_dispatcher->clearManifold(m_btSoftBodyTriangleCallback.m_manifoldPtr);
|
||||||
|
|
||||||
|
m_btSoftBodyTriangleCallback.m_manifoldPtr->setBodies(convexBody,triBody);
|
||||||
|
|
||||||
|
concaveShape->processAllTriangles( &m_btSoftBodyTriangleCallback,m_btSoftBodyTriangleCallback.getAabbMin(),m_btSoftBodyTriangleCallback.getAabbMax());
|
||||||
|
|
||||||
|
resultOut->refreshContactPoints();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
btScalar btSoftBodyConcaveCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
|
||||||
|
{
|
||||||
|
(void)resultOut;
|
||||||
|
(void)dispatchInfo;
|
||||||
|
btCollisionObject* convexbody = m_isSwapped ? body1 : body0;
|
||||||
|
btCollisionObject* triBody = m_isSwapped ? body0 : body1;
|
||||||
|
|
||||||
|
|
||||||
|
//quick approximation using raycast, todo: hook up to the continuous collision detection (one of the btConvexCast)
|
||||||
|
|
||||||
|
//only perform CCD above a certain threshold, this prevents blocking on the long run
|
||||||
|
//because object in a blocked ccd state (hitfraction<1) get their linear velocity halved each frame...
|
||||||
|
btScalar squareMot0 = (convexbody->getInterpolationWorldTransform().getOrigin() - convexbody->getWorldTransform().getOrigin()).length2();
|
||||||
|
if (squareMot0 < convexbody->getCcdSquareMotionThreshold())
|
||||||
|
{
|
||||||
|
return btScalar(1.);
|
||||||
|
}
|
||||||
|
|
||||||
|
//const btVector3& from = convexbody->m_worldTransform.getOrigin();
|
||||||
|
//btVector3 to = convexbody->m_interpolationWorldTransform.getOrigin();
|
||||||
|
//todo: only do if the motion exceeds the 'radius'
|
||||||
|
|
||||||
|
btTransform triInv = triBody->getWorldTransform().inverse();
|
||||||
|
btTransform convexFromLocal = triInv * convexbody->getWorldTransform();
|
||||||
|
btTransform convexToLocal = triInv * convexbody->getInterpolationWorldTransform();
|
||||||
|
|
||||||
|
struct LocalTriangleSphereCastCallback : public btTriangleCallback
|
||||||
|
{
|
||||||
|
btTransform m_ccdSphereFromTrans;
|
||||||
|
btTransform m_ccdSphereToTrans;
|
||||||
|
btTransform m_meshTransform;
|
||||||
|
|
||||||
|
btScalar m_ccdSphereRadius;
|
||||||
|
btScalar m_hitFraction;
|
||||||
|
|
||||||
|
|
||||||
|
LocalTriangleSphereCastCallback(const btTransform& from,const btTransform& to,btScalar ccdSphereRadius,btScalar hitFraction)
|
||||||
|
:m_ccdSphereFromTrans(from),
|
||||||
|
m_ccdSphereToTrans(to),
|
||||||
|
m_ccdSphereRadius(ccdSphereRadius),
|
||||||
|
m_hitFraction(hitFraction)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
virtual void processTriangle(btVector3* triangle, int partId, int triangleIndex)
|
||||||
|
{
|
||||||
|
(void)partId;
|
||||||
|
(void)triangleIndex;
|
||||||
|
//do a swept sphere for now
|
||||||
|
btTransform ident;
|
||||||
|
ident.setIdentity();
|
||||||
|
btConvexCast::CastResult castResult;
|
||||||
|
castResult.m_fraction = m_hitFraction;
|
||||||
|
btSphereShape pointShape(m_ccdSphereRadius);
|
||||||
|
btTriangleShape triShape(triangle[0],triangle[1],triangle[2]);
|
||||||
|
btVoronoiSimplexSolver simplexSolver;
|
||||||
|
btSubsimplexConvexCast convexCaster(&pointShape,&triShape,&simplexSolver);
|
||||||
|
//GjkConvexCast convexCaster(&pointShape,convexShape,&simplexSolver);
|
||||||
|
//ContinuousConvexCollision convexCaster(&pointShape,convexShape,&simplexSolver,0);
|
||||||
|
//local space?
|
||||||
|
|
||||||
|
if (convexCaster.calcTimeOfImpact(m_ccdSphereFromTrans,m_ccdSphereToTrans,
|
||||||
|
ident,ident,castResult))
|
||||||
|
{
|
||||||
|
if (m_hitFraction > castResult.m_fraction)
|
||||||
|
m_hitFraction = castResult.m_fraction;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if (triBody->getCollisionShape()->isConcave())
|
||||||
|
{
|
||||||
|
btVector3 rayAabbMin = convexFromLocal.getOrigin();
|
||||||
|
rayAabbMin.setMin(convexToLocal.getOrigin());
|
||||||
|
btVector3 rayAabbMax = convexFromLocal.getOrigin();
|
||||||
|
rayAabbMax.setMax(convexToLocal.getOrigin());
|
||||||
|
btScalar ccdRadius0 = convexbody->getCcdSweptSphereRadius();
|
||||||
|
rayAabbMin -= btVector3(ccdRadius0,ccdRadius0,ccdRadius0);
|
||||||
|
rayAabbMax += btVector3(ccdRadius0,ccdRadius0,ccdRadius0);
|
||||||
|
|
||||||
|
btScalar curHitFraction = btScalar(1.); //is this available?
|
||||||
|
LocalTriangleSphereCastCallback raycastCallback(convexFromLocal,convexToLocal,
|
||||||
|
convexbody->getCcdSweptSphereRadius(),curHitFraction);
|
||||||
|
|
||||||
|
raycastCallback.m_hitFraction = convexbody->getHitFraction();
|
||||||
|
|
||||||
|
btCollisionObject* concavebody = triBody;
|
||||||
|
|
||||||
|
btConcaveShape* triangleMesh = (btConcaveShape*) concavebody->getCollisionShape();
|
||||||
|
|
||||||
|
if (triangleMesh)
|
||||||
|
{
|
||||||
|
triangleMesh->processAllTriangles(&raycastCallback,rayAabbMin,rayAabbMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if (raycastCallback.m_hitFraction < convexbody->getHitFraction())
|
||||||
|
{
|
||||||
|
convexbody->setHitFraction( raycastCallback.m_hitFraction);
|
||||||
|
return raycastCallback.m_hitFraction;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return btScalar(1.);
|
||||||
|
|
||||||
|
}
|
||||||
113
src/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.h
Normal file
113
src/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.h
Normal file
@@ -0,0 +1,113 @@
|
|||||||
|
/*
|
||||||
|
Bullet Continuous Collision Detection and Physics Library
|
||||||
|
Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
|
||||||
|
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SOFT_BODY_CONCAVE_COLLISION_ALGORITHM_H
|
||||||
|
#define SOFT_BODY_CONCAVE_COLLISION_ALGORITHM_H
|
||||||
|
|
||||||
|
#include "BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h"
|
||||||
|
#include "BulletCollision/BroadphaseCollision/btDispatcher.h"
|
||||||
|
#include "BulletCollision/BroadphaseCollision/btBroadphaseInterface.h"
|
||||||
|
#include "BulletCollision/CollisionShapes/btTriangleCallback.h"
|
||||||
|
#include "BulletCollision/NarrowPhaseCollision/btPersistentManifold.h"
|
||||||
|
class btDispatcher;
|
||||||
|
#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h"
|
||||||
|
#include "BulletCollision/CollisionDispatch/btCollisionCreateFunc.h"
|
||||||
|
class btSoftBody;
|
||||||
|
|
||||||
|
///For each triangle in the concave mesh that overlaps with the AABB of a soft body (m_softBody), processTriangle is called.
|
||||||
|
class btSoftBodyTriangleCallback : public btTriangleCallback
|
||||||
|
{
|
||||||
|
btSoftBody* m_softBody;
|
||||||
|
btCollisionObject* m_triBody;
|
||||||
|
|
||||||
|
btVector3 m_aabbMin;
|
||||||
|
btVector3 m_aabbMax ;
|
||||||
|
|
||||||
|
btManifoldResult* m_resultOut;
|
||||||
|
|
||||||
|
btDispatcher* m_dispatcher;
|
||||||
|
const btDispatcherInfo* m_dispatchInfoPtr;
|
||||||
|
btScalar m_collisionMarginTriangle;
|
||||||
|
|
||||||
|
public:
|
||||||
|
int m_triangleCount;
|
||||||
|
|
||||||
|
btPersistentManifold* m_manifoldPtr;
|
||||||
|
|
||||||
|
btSoftBodyTriangleCallback(btDispatcher* dispatcher,btCollisionObject* body0,btCollisionObject* body1,bool isSwapped);
|
||||||
|
|
||||||
|
void setTimeStepAndCounters(btScalar collisionMarginTriangle,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut);
|
||||||
|
|
||||||
|
virtual ~btSoftBodyTriangleCallback();
|
||||||
|
|
||||||
|
virtual void processTriangle(btVector3* triangle, int partId, int triangleIndex);
|
||||||
|
|
||||||
|
void clearCache();
|
||||||
|
|
||||||
|
SIMD_FORCE_INLINE const btVector3& getAabbMin() const
|
||||||
|
{
|
||||||
|
return m_aabbMin;
|
||||||
|
}
|
||||||
|
SIMD_FORCE_INLINE const btVector3& getAabbMax() const
|
||||||
|
{
|
||||||
|
return m_aabbMax;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/// btSoftBodyConcaveCollisionAlgorithm supports collision between soft body shapes and (concave) trianges meshes.
|
||||||
|
class btSoftBodyConcaveCollisionAlgorithm : public btCollisionAlgorithm
|
||||||
|
{
|
||||||
|
|
||||||
|
bool m_isSwapped;
|
||||||
|
|
||||||
|
btSoftBodyTriangleCallback m_btSoftBodyTriangleCallback;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
btSoftBodyConcaveCollisionAlgorithm( const btCollisionAlgorithmConstructionInfo& ci,btCollisionObject* body0,btCollisionObject* body1,bool isSwapped);
|
||||||
|
|
||||||
|
virtual ~btSoftBodyConcaveCollisionAlgorithm();
|
||||||
|
|
||||||
|
virtual void processCollision (btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut);
|
||||||
|
|
||||||
|
btScalar calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut);
|
||||||
|
|
||||||
|
void clearCache();
|
||||||
|
|
||||||
|
struct CreateFunc :public btCollisionAlgorithmCreateFunc
|
||||||
|
{
|
||||||
|
virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, btCollisionObject* body0,btCollisionObject* body1)
|
||||||
|
{
|
||||||
|
void* mem = ci.m_dispatcher1->allocateCollisionAlgorithm(sizeof(btSoftBodyConcaveCollisionAlgorithm));
|
||||||
|
return new(mem) btSoftBodyConcaveCollisionAlgorithm(ci,body0,body1,false);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SwappedCreateFunc :public btCollisionAlgorithmCreateFunc
|
||||||
|
{
|
||||||
|
virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, btCollisionObject* body0,btCollisionObject* body1)
|
||||||
|
{
|
||||||
|
void* mem = ci.m_dispatcher1->allocateCollisionAlgorithm(sizeof(btSoftBodyConcaveCollisionAlgorithm));
|
||||||
|
return new(mem) btSoftBodyConcaveCollisionAlgorithm(ci,body0,body1,true);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //SOFT_BODY_CONCAVE_COLLISION_ALGORITHM_H
|
||||||
@@ -15,6 +15,7 @@ subject to the following restrictions:
|
|||||||
|
|
||||||
#include "btSoftBodyRigidBodyCollisionConfiguration.h"
|
#include "btSoftBodyRigidBodyCollisionConfiguration.h"
|
||||||
#include "btSoftRigidCollisionAlgorithm.h"
|
#include "btSoftRigidCollisionAlgorithm.h"
|
||||||
|
#include "btSoftBodyConcaveCollisionAlgorithm.h"
|
||||||
#include "btSoftSoftCollisionAlgorithm.h"
|
#include "btSoftSoftCollisionAlgorithm.h"
|
||||||
|
|
||||||
|
|
||||||
@@ -27,11 +28,19 @@ btSoftBodyRigidBodyCollisionConfiguration::btSoftBodyRigidBodyCollisionConfigura
|
|||||||
m_softSoftCreateFunc = new(mem) btSoftSoftCollisionAlgorithm::CreateFunc;
|
m_softSoftCreateFunc = new(mem) btSoftSoftCollisionAlgorithm::CreateFunc;
|
||||||
|
|
||||||
mem = btAlignedAlloc(sizeof(btSoftRigidCollisionAlgorithm::CreateFunc),16);
|
mem = btAlignedAlloc(sizeof(btSoftRigidCollisionAlgorithm::CreateFunc),16);
|
||||||
m_softRigidCreateFunc = new(mem) btSoftRigidCollisionAlgorithm::CreateFunc;
|
m_softRigidConvexCreateFunc = new(mem) btSoftRigidCollisionAlgorithm::CreateFunc;
|
||||||
|
|
||||||
mem = btAlignedAlloc(sizeof(btSoftRigidCollisionAlgorithm::CreateFunc),16);
|
mem = btAlignedAlloc(sizeof(btSoftRigidCollisionAlgorithm::CreateFunc),16);
|
||||||
m_swappedSoftRigidCreateFunc = new(mem) btSoftRigidCollisionAlgorithm::CreateFunc;
|
m_swappedSoftRigidConvexCreateFunc = new(mem) btSoftRigidCollisionAlgorithm::CreateFunc;
|
||||||
m_swappedSoftRigidCreateFunc->m_swapped=true;
|
m_swappedSoftRigidConvexCreateFunc->m_swapped=true;
|
||||||
|
|
||||||
|
|
||||||
|
mem = btAlignedAlloc(sizeof(btSoftBodyConcaveCollisionAlgorithm::CreateFunc),16);
|
||||||
|
m_softRigidConcaveCreateFunc = new(mem) btSoftBodyConcaveCollisionAlgorithm::CreateFunc;
|
||||||
|
|
||||||
|
mem = btAlignedAlloc(sizeof(btSoftBodyConcaveCollisionAlgorithm::CreateFunc),16);
|
||||||
|
m_swappedSoftRigidConcaveCreateFunc = new(mem) btSoftBodyConcaveCollisionAlgorithm::CreateFunc;
|
||||||
|
m_swappedSoftRigidConcaveCreateFunc->m_swapped=true;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -40,11 +49,17 @@ btSoftBodyRigidBodyCollisionConfiguration::~btSoftBodyRigidBodyCollisionConfigur
|
|||||||
m_softSoftCreateFunc->~btCollisionAlgorithmCreateFunc();
|
m_softSoftCreateFunc->~btCollisionAlgorithmCreateFunc();
|
||||||
btAlignedFree( m_softSoftCreateFunc);
|
btAlignedFree( m_softSoftCreateFunc);
|
||||||
|
|
||||||
m_softRigidCreateFunc->~btCollisionAlgorithmCreateFunc();
|
m_softRigidConvexCreateFunc->~btCollisionAlgorithmCreateFunc();
|
||||||
btAlignedFree( m_softRigidCreateFunc);
|
btAlignedFree( m_softRigidConvexCreateFunc);
|
||||||
|
|
||||||
m_swappedSoftRigidCreateFunc->~btCollisionAlgorithmCreateFunc();
|
m_swappedSoftRigidConvexCreateFunc->~btCollisionAlgorithmCreateFunc();
|
||||||
btAlignedFree( m_swappedSoftRigidCreateFunc);
|
btAlignedFree( m_swappedSoftRigidConvexCreateFunc);
|
||||||
|
|
||||||
|
m_softRigidConcaveCreateFunc->~btCollisionAlgorithmCreateFunc();
|
||||||
|
btAlignedFree( m_softRigidConcaveCreateFunc);
|
||||||
|
|
||||||
|
m_swappedSoftRigidConcaveCreateFunc->~btCollisionAlgorithmCreateFunc();
|
||||||
|
btAlignedFree( m_swappedSoftRigidConcaveCreateFunc);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -63,13 +78,25 @@ btCollisionAlgorithmCreateFunc* btSoftBodyRigidBodyCollisionConfiguration::getCo
|
|||||||
///softbody versus convex
|
///softbody versus convex
|
||||||
if (proxyType0 == SOFTBODY_SHAPE_PROXYTYPE && btBroadphaseProxy::isConvex(proxyType1))
|
if (proxyType0 == SOFTBODY_SHAPE_PROXYTYPE && btBroadphaseProxy::isConvex(proxyType1))
|
||||||
{
|
{
|
||||||
return m_softRigidCreateFunc;
|
return m_softRigidConvexCreateFunc;
|
||||||
}
|
}
|
||||||
|
|
||||||
///convex versus soft body
|
///convex versus soft body
|
||||||
if (btBroadphaseProxy::isConvex(proxyType0) && proxyType1 == SOFTBODY_SHAPE_PROXYTYPE )
|
if (btBroadphaseProxy::isConvex(proxyType0) && proxyType1 == SOFTBODY_SHAPE_PROXYTYPE )
|
||||||
{
|
{
|
||||||
return m_swappedSoftRigidCreateFunc;
|
return m_swappedSoftRigidConvexCreateFunc;
|
||||||
|
}
|
||||||
|
|
||||||
|
///softbody versus convex
|
||||||
|
if (proxyType0 == SOFTBODY_SHAPE_PROXYTYPE && btBroadphaseProxy::isConcave(proxyType1))
|
||||||
|
{
|
||||||
|
return m_softRigidConcaveCreateFunc;
|
||||||
|
}
|
||||||
|
|
||||||
|
///convex versus soft body
|
||||||
|
if (btBroadphaseProxy::isConcave(proxyType0) && proxyType1 == SOFTBODY_SHAPE_PROXYTYPE )
|
||||||
|
{
|
||||||
|
return m_swappedSoftRigidConcaveCreateFunc;
|
||||||
}
|
}
|
||||||
|
|
||||||
///fallback to the regular rigid collision shape
|
///fallback to the regular rigid collision shape
|
||||||
|
|||||||
@@ -28,8 +28,10 @@ class btSoftBodyRigidBodyCollisionConfiguration : public btDefaultCollisionConfi
|
|||||||
|
|
||||||
//default CreationFunctions, filling the m_doubleDispatch table
|
//default CreationFunctions, filling the m_doubleDispatch table
|
||||||
btCollisionAlgorithmCreateFunc* m_softSoftCreateFunc;
|
btCollisionAlgorithmCreateFunc* m_softSoftCreateFunc;
|
||||||
btCollisionAlgorithmCreateFunc* m_softRigidCreateFunc;
|
btCollisionAlgorithmCreateFunc* m_softRigidConvexCreateFunc;
|
||||||
btCollisionAlgorithmCreateFunc* m_swappedSoftRigidCreateFunc;
|
btCollisionAlgorithmCreateFunc* m_swappedSoftRigidConvexCreateFunc;
|
||||||
|
btCollisionAlgorithmCreateFunc* m_softRigidConcaveCreateFunc;
|
||||||
|
btCollisionAlgorithmCreateFunc* m_swappedSoftRigidConcaveCreateFunc;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user