Make getShapeType() a non virtual function.
Add localGetSupportVertexNonVirtual, localGetSupportVertexWithoutMarginNonVirtual, getAabbNonVirtual and getMarginNonVirtual methods to convex shape classes
This commit is contained in:
@@ -31,6 +31,7 @@ enum BroadphaseNativeTypes
|
|||||||
TETRAHEDRAL_SHAPE_PROXYTYPE,
|
TETRAHEDRAL_SHAPE_PROXYTYPE,
|
||||||
CONVEX_TRIANGLEMESH_SHAPE_PROXYTYPE,
|
CONVEX_TRIANGLEMESH_SHAPE_PROXYTYPE,
|
||||||
CONVEX_HULL_SHAPE_PROXYTYPE,
|
CONVEX_HULL_SHAPE_PROXYTYPE,
|
||||||
|
CONVEX_POINT_CLOUD_SHAPE_PROXYTYPE,
|
||||||
//implicit convex shapes
|
//implicit convex shapes
|
||||||
IMPLICIT_CONVEX_SHAPES_START_HERE,
|
IMPLICIT_CONVEX_SHAPES_START_HERE,
|
||||||
SPHERE_SHAPE_PROXYTYPE,
|
SPHERE_SHAPE_PROXYTYPE,
|
||||||
@@ -64,7 +65,10 @@ CONCAVE_SHAPES_END_HERE,
|
|||||||
|
|
||||||
SOFTBODY_SHAPE_PROXYTYPE,
|
SOFTBODY_SHAPE_PROXYTYPE,
|
||||||
|
|
||||||
|
INVALID_SHAPE_PROXYTYPE,
|
||||||
|
|
||||||
MAX_BROADPHASE_COLLISION_TYPES
|
MAX_BROADPHASE_COLLISION_TYPES
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -45,8 +45,6 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
virtual int getShapeType() const { return BOX_SHAPE_PROXYTYPE;}
|
|
||||||
|
|
||||||
virtual btVector3 localGetSupportingVertex(const btVector3& vec) const
|
virtual btVector3 localGetSupportingVertex(const btVector3& vec) const
|
||||||
{
|
{
|
||||||
btVector3 halfExtents = getHalfExtentsWithoutMargin();
|
btVector3 halfExtents = getHalfExtentsWithoutMargin();
|
||||||
@@ -83,7 +81,9 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
btBoxShape( const btVector3& boxHalfExtents)
|
btBoxShape( const btVector3& boxHalfExtents)
|
||||||
|
: btPolyhedralConvexShape()
|
||||||
{
|
{
|
||||||
|
m_shapeType = BOX_SHAPE_PROXYTYPE;
|
||||||
btVector3 margin(getMargin(),getMargin(),getMargin());
|
btVector3 margin(getMargin(),getMargin(),getMargin());
|
||||||
m_implicitShapeDimensions = (boxHalfExtents * m_localScaling) - margin;
|
m_implicitShapeDimensions = (boxHalfExtents * m_localScaling) - margin;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ m_bvh(0),
|
|||||||
m_useQuantizedAabbCompression(useQuantizedAabbCompression),
|
m_useQuantizedAabbCompression(useQuantizedAabbCompression),
|
||||||
m_ownsBvh(false)
|
m_ownsBvh(false)
|
||||||
{
|
{
|
||||||
|
m_shapeType = TRIANGLE_MESH_SHAPE_PROXYTYPE;
|
||||||
//construct bvh from meshInterface
|
//construct bvh from meshInterface
|
||||||
#ifndef DISABLE_BVH
|
#ifndef DISABLE_BVH
|
||||||
|
|
||||||
@@ -57,6 +58,7 @@ m_bvh(0),
|
|||||||
m_useQuantizedAabbCompression(useQuantizedAabbCompression),
|
m_useQuantizedAabbCompression(useQuantizedAabbCompression),
|
||||||
m_ownsBvh(false)
|
m_ownsBvh(false)
|
||||||
{
|
{
|
||||||
|
m_shapeType = TRIANGLE_MESH_SHAPE_PROXYTYPE;
|
||||||
//construct bvh from meshInterface
|
//construct bvh from meshInterface
|
||||||
#ifndef DISABLE_BVH
|
#ifndef DISABLE_BVH
|
||||||
|
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ public:
|
|||||||
|
|
||||||
BT_DECLARE_ALIGNED_ALLOCATOR();
|
BT_DECLARE_ALIGNED_ALLOCATOR();
|
||||||
|
|
||||||
btBvhTriangleMeshShape() :btTriangleMeshShape(0),m_bvh(0),m_ownsBvh(false) {};
|
btBvhTriangleMeshShape() : btTriangleMeshShape(0),m_bvh(0),m_ownsBvh(false) {m_shapeType = TRIANGLE_MESH_SHAPE_PROXYTYPE;};
|
||||||
btBvhTriangleMeshShape(btStridingMeshInterface* meshInterface, bool useQuantizedAabbCompression, bool buildBvh = true);
|
btBvhTriangleMeshShape(btStridingMeshInterface* meshInterface, bool useQuantizedAabbCompression, bool buildBvh = true);
|
||||||
|
|
||||||
///optionally pass in a larger bvh aabb, used for quantization. This allows for deformations within this aabb
|
///optionally pass in a larger bvh aabb, used for quantization. This allows for deformations within this aabb
|
||||||
@@ -50,10 +50,7 @@ public:
|
|||||||
return m_ownsBvh;
|
return m_ownsBvh;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual int getShapeType() const
|
|
||||||
{
|
|
||||||
return TRIANGLE_MESH_SHAPE_PROXYTYPE;
|
|
||||||
}
|
|
||||||
|
|
||||||
void performRaycast (btTriangleCallback* callback, const btVector3& raySource, const btVector3& rayTarget);
|
void performRaycast (btTriangleCallback* callback, const btVector3& raySource, const btVector3& rayTarget);
|
||||||
void performConvexcast (btTriangleCallback* callback, const btVector3& boxSource, const btVector3& boxTarget, const btVector3& boxMin, const btVector3& boxMax);
|
void performConvexcast (btTriangleCallback* callback, const btVector3& boxSource, const btVector3& boxTarget, const btVector3& boxMin, const btVector3& boxMax);
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ subject to the following restrictions:
|
|||||||
#include "BulletCollision/CollisionShapes/btCollisionMargin.h"
|
#include "BulletCollision/CollisionShapes/btCollisionMargin.h"
|
||||||
#include "LinearMath/btQuaternion.h"
|
#include "LinearMath/btQuaternion.h"
|
||||||
|
|
||||||
btCapsuleShape::btCapsuleShape(btScalar radius, btScalar height)
|
btCapsuleShape::btCapsuleShape(btScalar radius, btScalar height) : btConvexInternalShape ()
|
||||||
{
|
{
|
||||||
m_upAxis = 1;
|
m_upAxis = 1;
|
||||||
m_implicitShapeDimensions.setValue(radius,0.5f*height,radius);
|
m_implicitShapeDimensions.setValue(radius,0.5f*height,radius);
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ protected:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
///only used for btCapsuleShapeZ and btCapsuleShapeX subclasses.
|
///only used for btCapsuleShapeZ and btCapsuleShapeX subclasses.
|
||||||
btCapsuleShape() {};
|
btCapsuleShape() : btConvexInternalShape() {m_shapeType = CAPSULE_SHAPE_PROXYTYPE;};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
btCapsuleShape(btScalar radius,btScalar height);
|
btCapsuleShape(btScalar radius,btScalar height);
|
||||||
@@ -43,8 +43,6 @@ public:
|
|||||||
|
|
||||||
virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const;
|
virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const;
|
||||||
|
|
||||||
virtual int getShapeType() const { return CAPSULE_SHAPE_PROXYTYPE; }
|
|
||||||
|
|
||||||
virtual void getAabb (const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const
|
virtual void getAabb (const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const
|
||||||
{
|
{
|
||||||
btVector3 halfExtents(getRadius(),getRadius(),getRadius());
|
btVector3 halfExtents(getRadius(),getRadius(),getRadius());
|
||||||
|
|||||||
@@ -25,14 +25,16 @@ subject to the following restrictions:
|
|||||||
///The btCollisionShape class provides an interface for collision shapes that can be shared among btCollisionObjects.
|
///The btCollisionShape class provides an interface for collision shapes that can be shared among btCollisionObjects.
|
||||||
class btCollisionShape
|
class btCollisionShape
|
||||||
{
|
{
|
||||||
|
protected:
|
||||||
|
int m_shapeType;
|
||||||
void* m_userPointer;
|
void* m_userPointer;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
btCollisionShape() : m_userPointer(0)
|
btCollisionShape() : m_shapeType (INVALID_SHAPE_PROXYTYPE), m_userPointer(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual ~btCollisionShape()
|
virtual ~btCollisionShape()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@@ -76,7 +78,7 @@ public:
|
|||||||
return btBroadphaseProxy::isInfinite(getShapeType());
|
return btBroadphaseProxy::isInfinite(getShapeType());
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual int getShapeType() const=0;
|
|
||||||
virtual void setLocalScaling(const btVector3& scaling) =0;
|
virtual void setLocalScaling(const btVector3& scaling) =0;
|
||||||
virtual const btVector3& getLocalScaling() const =0;
|
virtual const btVector3& getLocalScaling() const =0;
|
||||||
virtual void calculateLocalInertia(btScalar mass,btVector3& inertia) const = 0;
|
virtual void calculateLocalInertia(btScalar mass,btVector3& inertia) const = 0;
|
||||||
@@ -87,7 +89,7 @@ public:
|
|||||||
#endif //__SPU__
|
#endif //__SPU__
|
||||||
|
|
||||||
|
|
||||||
|
int getShapeType() const { return m_shapeType; }
|
||||||
virtual void setMargin(btScalar margin) = 0;
|
virtual void setMargin(btScalar margin) = 0;
|
||||||
virtual btScalar getMargin() const = 0;
|
virtual btScalar getMargin() const = 0;
|
||||||
|
|
||||||
|
|||||||
@@ -121,8 +121,6 @@ public:
|
|||||||
|
|
||||||
virtual void calculateLocalInertia(btScalar mass,btVector3& inertia) const;
|
virtual void calculateLocalInertia(btScalar mass,btVector3& inertia) const;
|
||||||
|
|
||||||
virtual int getShapeType() const { return COMPOUND_SHAPE_PROXYTYPE;}
|
|
||||||
|
|
||||||
virtual void setMargin(btScalar margin)
|
virtual void setMargin(btScalar margin)
|
||||||
{
|
{
|
||||||
m_collisionMargin = margin;
|
m_collisionMargin = margin;
|
||||||
|
|||||||
@@ -18,10 +18,11 @@ subject to the following restrictions:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
btConeShape::btConeShape (btScalar radius,btScalar height):
|
btConeShape::btConeShape (btScalar radius,btScalar height): btConvexInternalShape (),
|
||||||
m_radius (radius),
|
m_radius (radius),
|
||||||
m_height(height)
|
m_height(height)
|
||||||
{
|
{
|
||||||
|
m_shapeType = CONE_SHAPE_PROXYTYPE;
|
||||||
setConeUpIndex(1);
|
setConeUpIndex(1);
|
||||||
btVector3 halfExtents;
|
btVector3 halfExtents;
|
||||||
m_sinAngle = (m_radius / btSqrt(m_radius * m_radius + m_height * m_height));
|
m_sinAngle = (m_radius / btSqrt(m_radius * m_radius + m_height * m_height));
|
||||||
|
|||||||
@@ -69,9 +69,6 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
virtual int getShapeType() const { return CONE_SHAPE_PROXYTYPE; }
|
|
||||||
|
|
||||||
virtual const char* getName()const
|
virtual const char* getName()const
|
||||||
{
|
{
|
||||||
return "Cone";
|
return "Cone";
|
||||||
|
|||||||
@@ -19,8 +19,9 @@ subject to the following restrictions:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
btConvexHullShape ::btConvexHullShape (const btScalar* points,int numPoints,int stride)
|
btConvexHullShape ::btConvexHullShape (const btScalar* points,int numPoints,int stride) : btPolyhedralConvexShape ()
|
||||||
{
|
{
|
||||||
|
m_shapeType = CONVEX_HULL_SHAPE_PROXYTYPE;
|
||||||
m_points.resize(numPoints);
|
m_points.resize(numPoints);
|
||||||
|
|
||||||
unsigned char* pointsBaseAddress = (unsigned char*)points;
|
unsigned char* pointsBaseAddress = (unsigned char*)points;
|
||||||
|
|||||||
@@ -57,7 +57,6 @@ public:
|
|||||||
virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const;
|
virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const;
|
||||||
|
|
||||||
|
|
||||||
virtual int getShapeType()const { return CONVEX_HULL_SHAPE_PROXYTYPE; }
|
|
||||||
|
|
||||||
//debugging
|
//debugging
|
||||||
virtual const char* getName()const {return "Convex";}
|
virtual const char* getName()const {return "Convex";}
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ subject to the following restrictions:
|
|||||||
|
|
||||||
|
|
||||||
btConvexInternalShape::btConvexInternalShape()
|
btConvexInternalShape::btConvexInternalShape()
|
||||||
: m_localScaling(btScalar(1.),btScalar(1.),btScalar(1.)),
|
: btConvexShape (), m_localScaling(btScalar(1.),btScalar(1.),btScalar(1.)),
|
||||||
m_collisionMargin(CONVEX_DISTANCE_MARGIN)
|
m_collisionMargin(CONVEX_DISTANCE_MARGIN)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,9 +19,11 @@ class btConvexInternalShape : public btConvexShape
|
|||||||
|
|
||||||
btScalar m_padding;
|
btScalar m_padding;
|
||||||
|
|
||||||
|
btConvexInternalShape();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
btConvexInternalShape();
|
|
||||||
|
|
||||||
virtual ~btConvexInternalShape()
|
virtual ~btConvexInternalShape()
|
||||||
{
|
{
|
||||||
|
|||||||
173
src/BulletCollision/CollisionShapes/btConvexPointCloudShape.cpp
Normal file
173
src/BulletCollision/CollisionShapes/btConvexPointCloudShape.cpp
Normal file
@@ -0,0 +1,173 @@
|
|||||||
|
/*
|
||||||
|
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 "btConvexPointCloudShape.h"
|
||||||
|
#include "BulletCollision/CollisionShapes/btCollisionMargin.h"
|
||||||
|
|
||||||
|
#include "LinearMath/btQuaternion.h"
|
||||||
|
|
||||||
|
btConvexPointCloudShape::btConvexPointCloudShape (btVector3* points,int numPoints) : btPolyhedralConvexShape ()
|
||||||
|
{
|
||||||
|
m_shapeType = CONVEX_POINT_CLOUD_SHAPE_PROXYTYPE;
|
||||||
|
m_points = points;
|
||||||
|
m_numPoints = numPoints;
|
||||||
|
|
||||||
|
recalcLocalAabb();
|
||||||
|
}
|
||||||
|
|
||||||
|
void btConvexPointCloudShape::setPoints (btVector3* points, int numPoints)
|
||||||
|
{
|
||||||
|
m_points = points;
|
||||||
|
m_numPoints = numPoints;
|
||||||
|
|
||||||
|
recalcLocalAabb();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void btConvexPointCloudShape::setLocalScaling(const btVector3& scaling)
|
||||||
|
{
|
||||||
|
m_localScaling = scaling;
|
||||||
|
recalcLocalAabb();
|
||||||
|
}
|
||||||
|
|
||||||
|
btVector3 btConvexPointCloudShape::localGetSupportingVertexWithoutMargin(const btVector3& vec0)const
|
||||||
|
{
|
||||||
|
btVector3 supVec(btScalar(0.),btScalar(0.),btScalar(0.));
|
||||||
|
btScalar newDot,maxDot = btScalar(-1e30);
|
||||||
|
|
||||||
|
btVector3 vec = vec0;
|
||||||
|
btScalar lenSqr = vec.length2();
|
||||||
|
if (lenSqr < btScalar(0.0001))
|
||||||
|
{
|
||||||
|
vec.setValue(1,0,0);
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
btScalar rlen = btScalar(1.) / btSqrt(lenSqr );
|
||||||
|
vec *= rlen;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
for (int i=0;i<m_numPoints;i++)
|
||||||
|
{
|
||||||
|
btPoint3 vtx = m_points[i] * m_localScaling;
|
||||||
|
|
||||||
|
newDot = vec.dot(vtx);
|
||||||
|
if (newDot > maxDot)
|
||||||
|
{
|
||||||
|
maxDot = newDot;
|
||||||
|
supVec = vtx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return supVec;
|
||||||
|
}
|
||||||
|
|
||||||
|
void btConvexPointCloudShape::batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const
|
||||||
|
{
|
||||||
|
btScalar newDot;
|
||||||
|
//use 'w' component of supportVerticesOut?
|
||||||
|
{
|
||||||
|
for (int i=0;i<numVectors;i++)
|
||||||
|
{
|
||||||
|
supportVerticesOut[i][3] = btScalar(-1e30);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int i=0;i<m_numPoints;i++)
|
||||||
|
{
|
||||||
|
btPoint3 vtx = m_points[i] * m_localScaling;
|
||||||
|
|
||||||
|
for (int j=0;j<numVectors;j++)
|
||||||
|
{
|
||||||
|
const btVector3& vec = vectors[j];
|
||||||
|
|
||||||
|
newDot = vec.dot(vtx);
|
||||||
|
if (newDot > supportVerticesOut[j][3])
|
||||||
|
{
|
||||||
|
//WARNING: don't swap next lines, the w component would get overwritten!
|
||||||
|
supportVerticesOut[j] = vtx;
|
||||||
|
supportVerticesOut[j][3] = newDot;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
btVector3 btConvexPointCloudShape::localGetSupportingVertex(const btVector3& vec)const
|
||||||
|
{
|
||||||
|
btVector3 supVertex = localGetSupportingVertexWithoutMargin(vec);
|
||||||
|
|
||||||
|
if ( getMargin()!=btScalar(0.) )
|
||||||
|
{
|
||||||
|
btVector3 vecnorm = vec;
|
||||||
|
if (vecnorm .length2() < (SIMD_EPSILON*SIMD_EPSILON))
|
||||||
|
{
|
||||||
|
vecnorm.setValue(btScalar(-1.),btScalar(-1.),btScalar(-1.));
|
||||||
|
}
|
||||||
|
vecnorm.normalize();
|
||||||
|
supVertex+= getMargin() * vecnorm;
|
||||||
|
}
|
||||||
|
return supVertex;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//currently just for debugging (drawing), perhaps future support for algebraic continuous collision detection
|
||||||
|
//Please note that you can debug-draw btConvexHullShape with the Raytracer Demo
|
||||||
|
int btConvexPointCloudShape::getNumVertices() const
|
||||||
|
{
|
||||||
|
return m_numPoints;
|
||||||
|
}
|
||||||
|
|
||||||
|
int btConvexPointCloudShape::getNumEdges() const
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void btConvexPointCloudShape::getEdge(int i,btPoint3& pa,btPoint3& pb) const
|
||||||
|
{
|
||||||
|
btAssert (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void btConvexPointCloudShape::getVertex(int i,btPoint3& vtx) const
|
||||||
|
{
|
||||||
|
vtx = m_points[i]*m_localScaling;
|
||||||
|
}
|
||||||
|
|
||||||
|
int btConvexPointCloudShape::getNumPlanes() const
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void btConvexPointCloudShape::getPlane(btVector3& ,btPoint3& ,int ) const
|
||||||
|
{
|
||||||
|
|
||||||
|
btAssert(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
//not yet
|
||||||
|
bool btConvexPointCloudShape::isInside(const btPoint3& ,btScalar ) const
|
||||||
|
{
|
||||||
|
assert(0);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,72 @@
|
|||||||
|
/*
|
||||||
|
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 BT_CONVEX_POINT_CLOUD_SHAPE_H
|
||||||
|
#define BT_CONVEX_POINT_CLOUD_SHAPE_H
|
||||||
|
|
||||||
|
#include "btPolyhedralConvexShape.h"
|
||||||
|
#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types
|
||||||
|
#include "LinearMath/btAlignedObjectArray.h"
|
||||||
|
|
||||||
|
///The btConvexPointCloudShape implements an implicit convex hull of an array of vertices.
|
||||||
|
ATTRIBUTE_ALIGNED16(class) btConvexPointCloudShape : public btPolyhedralConvexShape
|
||||||
|
{
|
||||||
|
btVector3* m_points;
|
||||||
|
int m_numPoints;
|
||||||
|
public:
|
||||||
|
BT_DECLARE_ALIGNED_ALLOCATOR();
|
||||||
|
|
||||||
|
btConvexPointCloudShape(btVector3* points,int numPoints);
|
||||||
|
|
||||||
|
void setPoints (btVector3* points, int numPoints);
|
||||||
|
|
||||||
|
btPoint3* getPoints()
|
||||||
|
{
|
||||||
|
return m_points;
|
||||||
|
}
|
||||||
|
|
||||||
|
const btPoint3* getPoints() const
|
||||||
|
{
|
||||||
|
return m_points;
|
||||||
|
}
|
||||||
|
|
||||||
|
int getNumPoints() const
|
||||||
|
{
|
||||||
|
return m_numPoints;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual btVector3 localGetSupportingVertex(const btVector3& vec)const;
|
||||||
|
virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec)const;
|
||||||
|
virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const;
|
||||||
|
|
||||||
|
|
||||||
|
//debugging
|
||||||
|
virtual const char* getName()const {return "ConvexPointCloud";}
|
||||||
|
|
||||||
|
virtual int getNumVertices() const;
|
||||||
|
virtual int getNumEdges() const;
|
||||||
|
virtual void getEdge(int i,btPoint3& pa,btPoint3& pb) const;
|
||||||
|
virtual void getVertex(int i,btPoint3& vtx) const;
|
||||||
|
virtual int getNumPlanes() const;
|
||||||
|
virtual void getPlane(btVector3& planeNormal,btPoint3& planeSupport,int i ) const;
|
||||||
|
virtual bool isInside(const btPoint3& pt,btScalar tolerance) const;
|
||||||
|
|
||||||
|
///in case we receive negative scaling
|
||||||
|
virtual void setLocalScaling(const btVector3& scaling);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif //BT_CONVEX_POINT_CLOUD_SHAPE_H
|
||||||
|
|
||||||
@@ -14,5 +14,534 @@ subject to the following restrictions:
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "btConvexShape.h"
|
#include "btConvexShape.h"
|
||||||
|
#include "btConvexInternalShape.h"
|
||||||
|
#include "btTriangleShape.h"
|
||||||
|
#include "btSphereShape.h"
|
||||||
|
#include "btCylinderShape.h"
|
||||||
|
#include "btCapsuleShape.h"
|
||||||
|
#include "btConvexHullShape.h"
|
||||||
|
#include "btConvexPointCloudShape.h"
|
||||||
|
|
||||||
|
static btVector3 convexHullSupport (const btVector3& localDir, const btVector3* points, int numPoints)
|
||||||
|
{
|
||||||
|
btVector3 supVec(btScalar(0.),btScalar(0.),btScalar(0.));
|
||||||
|
btScalar newDot,maxDot = btScalar(-1e30);
|
||||||
|
|
||||||
|
btVector3 vec0(localDir.getX(),localDir.getY(),localDir.getZ());
|
||||||
|
btVector3 vec = vec0;
|
||||||
|
btScalar lenSqr = vec.length2();
|
||||||
|
if (lenSqr < btScalar(0.0001))
|
||||||
|
{
|
||||||
|
vec.setValue(1,0,0);
|
||||||
|
} else {
|
||||||
|
btScalar rlen = btScalar(1.) / btSqrt(lenSqr );
|
||||||
|
vec *= rlen;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
for (int i=0;i<numPoints;i++)
|
||||||
|
{
|
||||||
|
btPoint3 vtx = points[i];// * m_localScaling;
|
||||||
|
|
||||||
|
newDot = vec.dot(vtx);
|
||||||
|
if (newDot > maxDot)
|
||||||
|
{
|
||||||
|
maxDot = newDot;
|
||||||
|
supVec = vtx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return btVector3(supVec.getX(),supVec.getY(),supVec.getZ());
|
||||||
|
}
|
||||||
|
|
||||||
|
btVector3 btConvexShape::localGetSupportVertexWithoutMarginNonVirtual (const btVector3& localDir) const
|
||||||
|
{
|
||||||
|
switch (m_shapeType)
|
||||||
|
{
|
||||||
|
case SPHERE_SHAPE_PROXYTYPE:
|
||||||
|
{
|
||||||
|
return btVector3(0,0,0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case BOX_SHAPE_PROXYTYPE:
|
||||||
|
{
|
||||||
|
btConvexInternalShape* convexShape = (btConvexInternalShape*)this;
|
||||||
|
const btVector3& halfExtents = convexShape->getImplicitShapeDimensions();
|
||||||
|
|
||||||
|
return btVector3(localDir.getX() < 0.0f ? -halfExtents.x() : halfExtents.x(),
|
||||||
|
localDir.getY() < 0.0f ? -halfExtents.y() : halfExtents.y(),
|
||||||
|
localDir.getZ() < 0.0f ? -halfExtents.z() : halfExtents.z());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case TRIANGLE_SHAPE_PROXYTYPE:
|
||||||
|
{
|
||||||
|
btTriangleShape* triangleShape = (btTriangleShape*)this;
|
||||||
|
btVector3 dir(localDir.getX(),localDir.getY(),localDir.getZ());
|
||||||
|
btVector3* vertices = &triangleShape->m_vertices1[0];
|
||||||
|
btVector3 dots(dir.dot(vertices[0]), dir.dot(vertices[1]), dir.dot(vertices[2]));
|
||||||
|
btVector3 sup = vertices[dots.maxAxis()];
|
||||||
|
return btVector3(sup.getX(),sup.getY(),sup.getZ());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case CYLINDER_SHAPE_PROXYTYPE:
|
||||||
|
{
|
||||||
|
btCylinderShape* cylShape = (btCylinderShape*)this;
|
||||||
|
//mapping of halfextents/dimension onto radius/height depends on how cylinder local orientation is (upAxis)
|
||||||
|
|
||||||
|
btVector3 halfExtents = cylShape->getImplicitShapeDimensions();
|
||||||
|
btVector3 v(localDir.getX(),localDir.getY(),localDir.getZ());
|
||||||
|
int cylinderUpAxis = cylShape->getUpAxis();
|
||||||
|
int XX(1),YY(0),ZZ(2);
|
||||||
|
|
||||||
|
switch (cylinderUpAxis)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
{
|
||||||
|
XX = 1;
|
||||||
|
YY = 0;
|
||||||
|
ZZ = 2;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
XX = 0;
|
||||||
|
YY = 1;
|
||||||
|
ZZ = 2;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
{
|
||||||
|
XX = 0;
|
||||||
|
YY = 2;
|
||||||
|
ZZ = 1;
|
||||||
|
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
btAssert(0);
|
||||||
|
break;
|
||||||
|
};
|
||||||
|
|
||||||
|
btScalar radius = halfExtents[XX];
|
||||||
|
btScalar halfHeight = halfExtents[cylinderUpAxis];
|
||||||
|
|
||||||
|
btVector3 tmp;
|
||||||
|
btScalar d ;
|
||||||
|
|
||||||
|
btScalar s = btSqrt(v[XX] * v[XX] + v[ZZ] * v[ZZ]);
|
||||||
|
if (s != btScalar(0.0))
|
||||||
|
{
|
||||||
|
d = radius / s;
|
||||||
|
tmp[XX] = v[XX] * d;
|
||||||
|
tmp[YY] = v[YY] < 0.0 ? -halfHeight : halfHeight;
|
||||||
|
tmp[ZZ] = v[ZZ] * d;
|
||||||
|
return btVector3(tmp.getX(),tmp.getY(),tmp.getZ());
|
||||||
|
} else {
|
||||||
|
tmp[XX] = radius;
|
||||||
|
tmp[YY] = v[YY] < 0.0 ? -halfHeight : halfHeight;
|
||||||
|
tmp[ZZ] = btScalar(0.0);
|
||||||
|
return btVector3(tmp.getX(),tmp.getY(),tmp.getZ());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case CAPSULE_SHAPE_PROXYTYPE:
|
||||||
|
{
|
||||||
|
btVector3 vec0(localDir.getX(),localDir.getY(),localDir.getZ());
|
||||||
|
|
||||||
|
btCapsuleShape* capsuleShape = (btCapsuleShape*)this;
|
||||||
|
btVector3 halfExtents = capsuleShape->getImplicitShapeDimensions();
|
||||||
|
btScalar halfHeight = capsuleShape->getHalfHeight();
|
||||||
|
int capsuleUpAxis = capsuleShape->getUpAxis();
|
||||||
|
|
||||||
|
btScalar radius = capsuleShape->getRadius();
|
||||||
|
btVector3 supVec(0,0,0);
|
||||||
|
|
||||||
|
btScalar maxDot(btScalar(-1e30));
|
||||||
|
|
||||||
|
btVector3 vec = vec0;
|
||||||
|
btScalar lenSqr = vec.length2();
|
||||||
|
if (lenSqr < btScalar(0.0001))
|
||||||
|
{
|
||||||
|
vec.setValue(1,0,0);
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
btScalar rlen = btScalar(1.) / btSqrt(lenSqr );
|
||||||
|
vec *= rlen;
|
||||||
|
}
|
||||||
|
btVector3 vtx;
|
||||||
|
btScalar newDot;
|
||||||
|
{
|
||||||
|
btVector3 pos(0,0,0);
|
||||||
|
pos[capsuleUpAxis] = halfHeight;
|
||||||
|
|
||||||
|
vtx = pos +vec*(radius);
|
||||||
|
newDot = vec.dot(vtx);
|
||||||
|
if (newDot > maxDot)
|
||||||
|
{
|
||||||
|
maxDot = newDot;
|
||||||
|
supVec = vtx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
btVector3 pos(0,0,0);
|
||||||
|
pos[capsuleUpAxis] = -halfHeight;
|
||||||
|
|
||||||
|
vtx = pos +vec*(radius);
|
||||||
|
newDot = vec.dot(vtx);
|
||||||
|
if (newDot > maxDot)
|
||||||
|
{
|
||||||
|
maxDot = newDot;
|
||||||
|
supVec = vtx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return btVector3(supVec.getX(),supVec.getY(),supVec.getZ());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case CONVEX_POINT_CLOUD_SHAPE_PROXYTYPE:
|
||||||
|
{
|
||||||
|
btConvexPointCloudShape* convexPointCloudShape = (btConvexPointCloudShape*)this;
|
||||||
|
btVector3* points = convexPointCloudShape->getPoints ();
|
||||||
|
int numPoints = convexPointCloudShape->getNumPoints ();
|
||||||
|
return convexHullSupport (localDir, points, numPoints);
|
||||||
|
}
|
||||||
|
case CONVEX_HULL_SHAPE_PROXYTYPE:
|
||||||
|
{
|
||||||
|
btConvexHullShape* convexHullShape = (btConvexHullShape*)this;
|
||||||
|
btPoint3* points = convexHullShape->getPoints ();
|
||||||
|
int numPoints = convexHullShape->getNumPoints ();
|
||||||
|
return convexHullSupport (localDir, points, numPoints);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
#ifndef __SPU__
|
||||||
|
return this->localGetSupportingVertexWithoutMargin (localDir);
|
||||||
|
#else
|
||||||
|
btAssert (0);
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// should never reach here
|
||||||
|
btAssert (0);
|
||||||
|
return btPoint3 (btScalar(0.0f), btScalar(0.0f), btScalar(0.0f));
|
||||||
|
}
|
||||||
|
|
||||||
|
btVector3 btConvexShape::localGetSupportVertexNonVirtual (const btVector3& localDir) const
|
||||||
|
{
|
||||||
|
btVector3 localDirNorm = localDir;
|
||||||
|
if (localDirNorm .length2() < (SIMD_EPSILON*SIMD_EPSILON))
|
||||||
|
{
|
||||||
|
localDirNorm.setValue(btScalar(-1.),btScalar(-1.),btScalar(-1.));
|
||||||
|
}
|
||||||
|
localDirNorm.normalize ();
|
||||||
|
switch (m_shapeType)
|
||||||
|
{
|
||||||
|
case SPHERE_SHAPE_PROXYTYPE:
|
||||||
|
{
|
||||||
|
return btVector3(0,0,0) + getMarginNonVirtual() * localDirNorm;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case BOX_SHAPE_PROXYTYPE:
|
||||||
|
{
|
||||||
|
btConvexInternalShape* convexShape = (btConvexInternalShape*)this;
|
||||||
|
const btVector3& halfExtents = convexShape->getImplicitShapeDimensions();
|
||||||
|
|
||||||
|
return btVector3(localDir.getX() < 0.0f ? -halfExtents.x() : halfExtents.x(),
|
||||||
|
localDir.getY() < 0.0f ? -halfExtents.y() : halfExtents.y(),
|
||||||
|
localDir.getZ() < 0.0f ? -halfExtents.z() : halfExtents.z()) + getMarginNonVirtual() * localDirNorm;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case TRIANGLE_SHAPE_PROXYTYPE:
|
||||||
|
{
|
||||||
|
btTriangleShape* triangleShape = (btTriangleShape*)this;
|
||||||
|
btVector3 dir(localDir.getX(),localDir.getY(),localDir.getZ());
|
||||||
|
btVector3* vertices = &triangleShape->m_vertices1[0];
|
||||||
|
btVector3 dots(dir.dot(vertices[0]), dir.dot(vertices[1]), dir.dot(vertices[2]));
|
||||||
|
btVector3 sup = vertices[dots.maxAxis()];
|
||||||
|
return btVector3(sup.getX(),sup.getY(),sup.getZ()) + getMarginNonVirtual() * localDirNorm;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case CYLINDER_SHAPE_PROXYTYPE:
|
||||||
|
{
|
||||||
|
btCylinderShape* cylShape = (btCylinderShape*)this;
|
||||||
|
//mapping of halfextents/dimension onto radius/height depends on how cylinder local orientation is (upAxis)
|
||||||
|
|
||||||
|
btVector3 halfExtents = cylShape->getImplicitShapeDimensions();
|
||||||
|
btVector3 v(localDir.getX(),localDir.getY(),localDir.getZ());
|
||||||
|
int cylinderUpAxis = cylShape->getUpAxis();
|
||||||
|
int XX(1),YY(0),ZZ(2);
|
||||||
|
|
||||||
|
switch (cylinderUpAxis)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
{
|
||||||
|
XX = 1;
|
||||||
|
YY = 0;
|
||||||
|
ZZ = 2;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
XX = 0;
|
||||||
|
YY = 1;
|
||||||
|
ZZ = 2;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
{
|
||||||
|
XX = 0;
|
||||||
|
YY = 2;
|
||||||
|
ZZ = 1;
|
||||||
|
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
btAssert(0);
|
||||||
|
break;
|
||||||
|
};
|
||||||
|
|
||||||
|
btScalar radius = halfExtents[XX];
|
||||||
|
btScalar halfHeight = halfExtents[cylinderUpAxis];
|
||||||
|
|
||||||
|
btVector3 tmp;
|
||||||
|
btScalar d ;
|
||||||
|
|
||||||
|
btScalar s = btSqrt(v[XX] * v[XX] + v[ZZ] * v[ZZ]);
|
||||||
|
if (s != btScalar(0.0))
|
||||||
|
{
|
||||||
|
d = radius / s;
|
||||||
|
tmp[XX] = v[XX] * d;
|
||||||
|
tmp[YY] = v[YY] < 0.0 ? -halfHeight : halfHeight;
|
||||||
|
tmp[ZZ] = v[ZZ] * d;
|
||||||
|
return btVector3(tmp.getX(),tmp.getY(),tmp.getZ()) + getMarginNonVirtual() * localDirNorm;
|
||||||
|
} else {
|
||||||
|
tmp[XX] = radius;
|
||||||
|
tmp[YY] = v[YY] < 0.0 ? -halfHeight : halfHeight;
|
||||||
|
tmp[ZZ] = btScalar(0.0);
|
||||||
|
return btVector3(tmp.getX(),tmp.getY(),tmp.getZ()) + getMarginNonVirtual() * localDirNorm;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case CAPSULE_SHAPE_PROXYTYPE:
|
||||||
|
{
|
||||||
|
btVector3 vec0(localDir.getX(),localDir.getY(),localDir.getZ());
|
||||||
|
|
||||||
|
btCapsuleShape* capsuleShape = (btCapsuleShape*)this;
|
||||||
|
btVector3 halfExtents = capsuleShape->getImplicitShapeDimensions();
|
||||||
|
btScalar halfHeight = capsuleShape->getHalfHeight();
|
||||||
|
int capsuleUpAxis = capsuleShape->getUpAxis();
|
||||||
|
|
||||||
|
btScalar radius = capsuleShape->getRadius();
|
||||||
|
btVector3 supVec(0,0,0);
|
||||||
|
|
||||||
|
btScalar maxDot(btScalar(-1e30));
|
||||||
|
|
||||||
|
btVector3 vec = vec0;
|
||||||
|
btScalar lenSqr = vec.length2();
|
||||||
|
if (lenSqr < btScalar(0.0001))
|
||||||
|
{
|
||||||
|
vec.setValue(1,0,0);
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
btScalar rlen = btScalar(1.) / btSqrt(lenSqr );
|
||||||
|
vec *= rlen;
|
||||||
|
}
|
||||||
|
btVector3 vtx;
|
||||||
|
btScalar newDot;
|
||||||
|
{
|
||||||
|
btVector3 pos(0,0,0);
|
||||||
|
pos[capsuleUpAxis] = halfHeight;
|
||||||
|
|
||||||
|
vtx = pos +vec*(radius);
|
||||||
|
newDot = vec.dot(vtx);
|
||||||
|
if (newDot > maxDot)
|
||||||
|
{
|
||||||
|
maxDot = newDot;
|
||||||
|
supVec = vtx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
btVector3 pos(0,0,0);
|
||||||
|
pos[capsuleUpAxis] = -halfHeight;
|
||||||
|
|
||||||
|
vtx = pos +vec*(radius);
|
||||||
|
newDot = vec.dot(vtx);
|
||||||
|
if (newDot > maxDot)
|
||||||
|
{
|
||||||
|
maxDot = newDot;
|
||||||
|
supVec = vtx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return btVector3(supVec.getX(),supVec.getY(),supVec.getZ()) + getMarginNonVirtual() * localDirNorm;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case CONVEX_POINT_CLOUD_SHAPE_PROXYTYPE:
|
||||||
|
{
|
||||||
|
btConvexPointCloudShape* convexPointCloudShape = (btConvexPointCloudShape*)this;
|
||||||
|
btVector3* points = convexPointCloudShape->getPoints ();
|
||||||
|
int numPoints = convexPointCloudShape->getNumPoints ();
|
||||||
|
return convexHullSupport (localDir, points, numPoints) + getMarginNonVirtual() * localDirNorm;
|
||||||
|
}
|
||||||
|
case CONVEX_HULL_SHAPE_PROXYTYPE:
|
||||||
|
{
|
||||||
|
btConvexHullShape* convexHullShape = (btConvexHullShape*)this;
|
||||||
|
btPoint3* points = convexHullShape->getPoints ();
|
||||||
|
int numPoints = convexHullShape->getNumPoints ();
|
||||||
|
return convexHullSupport (localDir, points, numPoints) + getMarginNonVirtual() * localDirNorm;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
#ifndef __SPU__
|
||||||
|
return this->localGetSupportingVertex (localDir);
|
||||||
|
#else
|
||||||
|
btAssert (0);
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// should never reach here
|
||||||
|
btAssert (0);
|
||||||
|
return btPoint3 (btScalar(0.0f), btScalar(0.0f), btScalar(0.0f));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TODO: This should be bumped up to btCollisionShape () */
|
||||||
|
btScalar btConvexShape::getMarginNonVirtual () const
|
||||||
|
{
|
||||||
|
switch (m_shapeType)
|
||||||
|
{
|
||||||
|
case SPHERE_SHAPE_PROXYTYPE:
|
||||||
|
{
|
||||||
|
btSphereShape* sphereShape = (btSphereShape*)this;
|
||||||
|
return sphereShape->getRadius ();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case BOX_SHAPE_PROXYTYPE:
|
||||||
|
{
|
||||||
|
btConvexInternalShape* convexShape = (btConvexInternalShape*)this;
|
||||||
|
return convexShape->getMarginNV ();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case TRIANGLE_SHAPE_PROXYTYPE:
|
||||||
|
{
|
||||||
|
btTriangleShape* triangleShape = (btTriangleShape*)this;
|
||||||
|
return triangleShape->getMarginNV ();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case CYLINDER_SHAPE_PROXYTYPE:
|
||||||
|
{
|
||||||
|
btCylinderShape* cylShape = (btCylinderShape*)this;
|
||||||
|
return cylShape->getMarginNV();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case CAPSULE_SHAPE_PROXYTYPE:
|
||||||
|
{
|
||||||
|
btCapsuleShape* capsuleShape = (btCapsuleShape*)this;
|
||||||
|
return capsuleShape->getMarginNV();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case CONVEX_POINT_CLOUD_SHAPE_PROXYTYPE:
|
||||||
|
/* fall through */
|
||||||
|
case CONVEX_HULL_SHAPE_PROXYTYPE:
|
||||||
|
{
|
||||||
|
btPolyhedralConvexShape* convexHullShape = (btPolyhedralConvexShape*)this;
|
||||||
|
return convexHullShape->getMarginNV();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
#ifndef __SPU__
|
||||||
|
return this->getMargin ();
|
||||||
|
#else
|
||||||
|
btAssert (0);
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// should never reach here
|
||||||
|
btAssert (0);
|
||||||
|
return btScalar(0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
void btConvexShape::getAabbNonVirtual (const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const
|
||||||
|
{
|
||||||
|
switch (m_shapeType)
|
||||||
|
{
|
||||||
|
case SPHERE_SHAPE_PROXYTYPE:
|
||||||
|
{
|
||||||
|
btSphereShape* sphereShape = (btSphereShape*)this;
|
||||||
|
float radius = sphereShape->getImplicitShapeDimensions().getX();// * convexShape->getLocalScaling().getX();
|
||||||
|
float margin = radius + sphereShape->getMarginNonVirtual();
|
||||||
|
const btVector3& center = t.getOrigin();
|
||||||
|
btVector3 extent(margin,margin,margin);
|
||||||
|
aabbMin = center - extent;
|
||||||
|
aabbMax = center + extent;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case CYLINDER_SHAPE_PROXYTYPE:
|
||||||
|
/* fall through */
|
||||||
|
case BOX_SHAPE_PROXYTYPE:
|
||||||
|
{
|
||||||
|
btConvexInternalShape* convexShape = (btConvexInternalShape*)this;
|
||||||
|
float margin=convexShape->getMarginNonVirtual();
|
||||||
|
btVector3 halfExtents = convexShape->getImplicitShapeDimensions();
|
||||||
|
halfExtents += btVector3(margin,margin,margin);
|
||||||
|
btMatrix3x3 abs_b = t.getBasis().absolute();
|
||||||
|
btPoint3 center = t.getOrigin();
|
||||||
|
btVector3 extent = btVector3(abs_b[0].dot(halfExtents),abs_b[1].dot(halfExtents),abs_b[2].dot(halfExtents));
|
||||||
|
|
||||||
|
aabbMin = center - extent;
|
||||||
|
aabbMax = center + extent;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case TRIANGLE_SHAPE_PROXYTYPE:
|
||||||
|
{
|
||||||
|
btTriangleShape* triangleShape = (btTriangleShape*)this;
|
||||||
|
btScalar margin = triangleShape->getMarginNonVirtual();
|
||||||
|
for (int i=0;i<3;i++)
|
||||||
|
{
|
||||||
|
btVector3 vec(btScalar(0.),btScalar(0.),btScalar(0.));
|
||||||
|
vec[i] = btScalar(1.);
|
||||||
|
|
||||||
|
btVector3 sv = localGetSupportVertexWithoutMarginNonVirtual(vec*t.getBasis());
|
||||||
|
|
||||||
|
btVector3 tmp = t(sv);
|
||||||
|
aabbMax[i] = tmp[i]+margin;
|
||||||
|
vec[i] = btScalar(-1.);
|
||||||
|
tmp = t(localGetSupportVertexWithoutMarginNonVirtual(vec*t.getBasis()));
|
||||||
|
aabbMin[i] = tmp[i]-margin;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case CAPSULE_SHAPE_PROXYTYPE:
|
||||||
|
{
|
||||||
|
btCapsuleShape* capsuleShape = (btCapsuleShape*)this;
|
||||||
|
btVector3 halfExtents(capsuleShape->getRadius(),capsuleShape->getRadius(),capsuleShape->getRadius());
|
||||||
|
int m_upAxis = capsuleShape->getUpAxis();
|
||||||
|
halfExtents[m_upAxis] = capsuleShape->getRadius() + capsuleShape->getHalfHeight();
|
||||||
|
halfExtents += btVector3(capsuleShape->getMarginNonVirtual(),capsuleShape->getMarginNonVirtual(),capsuleShape->getMarginNonVirtual());
|
||||||
|
btMatrix3x3 abs_b = t.getBasis().absolute();
|
||||||
|
btPoint3 center = t.getOrigin();
|
||||||
|
btVector3 extent = btVector3(abs_b[0].dot(halfExtents),abs_b[1].dot(halfExtents),abs_b[2].dot(halfExtents));
|
||||||
|
aabbMin = center - extent;
|
||||||
|
aabbMax = center + extent;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case CONVEX_POINT_CLOUD_SHAPE_PROXYTYPE:
|
||||||
|
case CONVEX_HULL_SHAPE_PROXYTYPE:
|
||||||
|
{
|
||||||
|
btPolyhedralConvexShape* convexHullShape = (btPolyhedralConvexShape*)this;
|
||||||
|
btScalar margin = convexHullShape->getMarginNonVirtual();
|
||||||
|
convexHullShape->getNonvirtualAabb (t, aabbMin, aabbMax, margin);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
#ifndef __SPU__
|
||||||
|
this->getAabb (t, aabbMin, aabbMax);
|
||||||
|
#else
|
||||||
|
btAssert (0);
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// should never reach here
|
||||||
|
btAssert (0);
|
||||||
|
}
|
||||||
@@ -38,6 +38,10 @@ public:
|
|||||||
|
|
||||||
BT_DECLARE_ALIGNED_ALLOCATOR();
|
BT_DECLARE_ALIGNED_ALLOCATOR();
|
||||||
|
|
||||||
|
btConvexShape ()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
virtual ~btConvexShape()
|
virtual ~btConvexShape()
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -52,6 +56,10 @@ public:
|
|||||||
virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const= 0;
|
virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const= 0;
|
||||||
#endif //#ifndef __SPU__
|
#endif //#ifndef __SPU__
|
||||||
|
|
||||||
|
btVector3 localGetSupportVertexWithoutMarginNonVirtual (const btVector3& vec) const;
|
||||||
|
btVector3 localGetSupportVertexNonVirtual (const btVector3& vec) const;
|
||||||
|
btScalar getMarginNonVirtual () const;
|
||||||
|
void getAabbNonVirtual (const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const;
|
||||||
|
|
||||||
///getAabb's default implementation is brute force, expected derived classes to implement a fast dedicated version
|
///getAabb's default implementation is brute force, expected derived classes to implement a fast dedicated version
|
||||||
void getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const =0;
|
void getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const =0;
|
||||||
|
|||||||
@@ -20,8 +20,9 @@ subject to the following restrictions:
|
|||||||
|
|
||||||
|
|
||||||
btConvexTriangleMeshShape ::btConvexTriangleMeshShape (btStridingMeshInterface* meshInterface, bool calcAabb)
|
btConvexTriangleMeshShape ::btConvexTriangleMeshShape (btStridingMeshInterface* meshInterface, bool calcAabb)
|
||||||
:m_stridingMesh(meshInterface)
|
: btPolyhedralConvexShape(), m_stridingMesh(meshInterface)
|
||||||
{
|
{
|
||||||
|
m_shapeType = CONVEX_TRIANGLEMESH_SHAPE_PROXYTYPE;
|
||||||
if ( calcAabb )
|
if ( calcAabb )
|
||||||
recalcLocalAabb();
|
recalcLocalAabb();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,8 +29,6 @@ public:
|
|||||||
virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec)const;
|
virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec)const;
|
||||||
virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const;
|
virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const;
|
||||||
|
|
||||||
virtual int getShapeType()const { return CONVEX_TRIANGLEMESH_SHAPE_PROXYTYPE; }
|
|
||||||
|
|
||||||
//debugging
|
//debugging
|
||||||
virtual const char* getName()const {return "ConvexTrimesh";}
|
virtual const char* getName()const {return "ConvexTrimesh";}
|
||||||
|
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ btCylinderShape::btCylinderShape (const btVector3& halfExtents)
|
|||||||
:btBoxShape(halfExtents),
|
:btBoxShape(halfExtents),
|
||||||
m_upAxis(1)
|
m_upAxis(1)
|
||||||
{
|
{
|
||||||
|
m_shapeType = CYLINDER_SHAPE_PROXYTYPE;
|
||||||
recalcLocalAabb();
|
recalcLocalAabb();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -62,10 +62,6 @@ public:
|
|||||||
//use box inertia
|
//use box inertia
|
||||||
// virtual void calculateLocalInertia(btScalar mass,btVector3& inertia) const;
|
// virtual void calculateLocalInertia(btScalar mass,btVector3& inertia) const;
|
||||||
|
|
||||||
virtual int getShapeType() const
|
|
||||||
{
|
|
||||||
return CYLINDER_SHAPE_PROXYTYPE;
|
|
||||||
}
|
|
||||||
|
|
||||||
int getUpAxis() const
|
int getUpAxis() const
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -19,8 +19,9 @@ subject to the following restrictions:
|
|||||||
#include "btCollisionShape.h"
|
#include "btCollisionShape.h"
|
||||||
|
|
||||||
|
|
||||||
btEmptyShape::btEmptyShape()
|
btEmptyShape::btEmptyShape() : btConcaveShape ()
|
||||||
{
|
{
|
||||||
|
m_shapeType = EMPTY_SHAPE_PROXYTYPE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -51,9 +51,6 @@ public:
|
|||||||
|
|
||||||
virtual void calculateLocalInertia(btScalar mass,btVector3& inertia) const;
|
virtual void calculateLocalInertia(btScalar mass,btVector3& inertia) const;
|
||||||
|
|
||||||
virtual int getShapeType() const { return EMPTY_SHAPE_PROXYTYPE;}
|
|
||||||
|
|
||||||
|
|
||||||
virtual const char* getName()const
|
virtual const char* getName()const
|
||||||
{
|
{
|
||||||
return "Empty";
|
return "Empty";
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ subject to the following restrictions:
|
|||||||
|
|
||||||
|
|
||||||
btHeightfieldTerrainShape::btHeightfieldTerrainShape(int heightStickWidth, int heightStickLength,void* heightfieldData,btScalar maxHeight,int upAxis,bool useFloatData,bool flipQuadEdges)
|
btHeightfieldTerrainShape::btHeightfieldTerrainShape(int heightStickWidth, int heightStickLength,void* heightfieldData,btScalar maxHeight,int upAxis,bool useFloatData,bool flipQuadEdges)
|
||||||
: m_heightStickWidth(heightStickWidth),
|
: btConcaveShape (), m_heightStickWidth(heightStickWidth),
|
||||||
m_heightStickLength(heightStickLength),
|
m_heightStickLength(heightStickLength),
|
||||||
m_maxHeight(maxHeight),
|
m_maxHeight(maxHeight),
|
||||||
m_width((btScalar)heightStickWidth-1),
|
m_width((btScalar)heightStickWidth-1),
|
||||||
@@ -31,7 +31,7 @@ m_useDiamondSubdivision(false),
|
|||||||
m_upAxis(upAxis),
|
m_upAxis(upAxis),
|
||||||
m_localScaling(btScalar(1.),btScalar(1.),btScalar(1.))
|
m_localScaling(btScalar(1.),btScalar(1.),btScalar(1.))
|
||||||
{
|
{
|
||||||
|
m_shapeType = TERRAIN_SHAPE_PROXYTYPE;
|
||||||
|
|
||||||
btScalar quantizationMargin = 1.f;
|
btScalar quantizationMargin = 1.f;
|
||||||
|
|
||||||
|
|||||||
@@ -68,10 +68,6 @@ public:
|
|||||||
|
|
||||||
void setUseDiamondSubdivision(bool useDiamondSubdivision=true) { m_useDiamondSubdivision = useDiamondSubdivision;}
|
void setUseDiamondSubdivision(bool useDiamondSubdivision=true) { m_useDiamondSubdivision = useDiamondSubdivision;}
|
||||||
|
|
||||||
virtual int getShapeType() const
|
|
||||||
{
|
|
||||||
return TERRAIN_SHAPE_PROXYTYPE;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const;
|
virtual void getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const;
|
||||||
|
|
||||||
|
|||||||
@@ -17,9 +17,11 @@ subject to the following restrictions:
|
|||||||
|
|
||||||
|
|
||||||
btMinkowskiSumShape::btMinkowskiSumShape(const btConvexShape* shapeA,const btConvexShape* shapeB)
|
btMinkowskiSumShape::btMinkowskiSumShape(const btConvexShape* shapeA,const btConvexShape* shapeB)
|
||||||
:m_shapeA(shapeA),
|
: btConvexInternalShape (),
|
||||||
|
m_shapeA(shapeA),
|
||||||
m_shapeB(shapeB)
|
m_shapeB(shapeB)
|
||||||
{
|
{
|
||||||
|
m_shapeType = MINKOWSKI_DIFFERENCE_SHAPE_PROXYTYPE;
|
||||||
m_transA.setIdentity();
|
m_transA.setIdentity();
|
||||||
m_transB.setIdentity();
|
m_transB.setIdentity();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,8 +46,6 @@ public:
|
|||||||
const btTransform& GetTransformB()const { return m_transB;}
|
const btTransform& GetTransformB()const { return m_transB;}
|
||||||
|
|
||||||
|
|
||||||
virtual int getShapeType() const { return MINKOWSKI_SUM_SHAPE_PROXYTYPE; }
|
|
||||||
|
|
||||||
virtual btScalar getMargin() const;
|
virtual btScalar getMargin() const;
|
||||||
|
|
||||||
const btConvexShape* getShapeA() const { return m_shapeA;}
|
const btConvexShape* getShapeA() const { return m_shapeA;}
|
||||||
|
|||||||
@@ -18,8 +18,9 @@ subject to the following restrictions:
|
|||||||
#include "LinearMath/btQuaternion.h"
|
#include "LinearMath/btQuaternion.h"
|
||||||
|
|
||||||
btMultiSphereShape::btMultiSphereShape (const btVector3& inertiaHalfExtents,const btVector3* positions,const btScalar* radi,int numSpheres)
|
btMultiSphereShape::btMultiSphereShape (const btVector3& inertiaHalfExtents,const btVector3* positions,const btScalar* radi,int numSpheres)
|
||||||
:m_inertiaHalfExtents(inertiaHalfExtents)
|
:btConvexInternalShape (), m_inertiaHalfExtents(inertiaHalfExtents)
|
||||||
{
|
{
|
||||||
|
m_shapeType = MULTI_SPHERE_SHAPE_PROXYTYPE;
|
||||||
btScalar startMargin = btScalar(1e30);
|
btScalar startMargin = btScalar(1e30);
|
||||||
|
|
||||||
m_numSpheres = numSpheres;
|
m_numSpheres = numSpheres;
|
||||||
|
|||||||
@@ -62,7 +62,6 @@ public:
|
|||||||
return m_radi[index];
|
return m_radi[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual int getShapeType() const { return MULTI_SPHERE_SHAPE_PROXYTYPE; }
|
|
||||||
|
|
||||||
virtual const char* getName()const
|
virtual const char* getName()const
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -16,7 +16,8 @@ subject to the following restrictions:
|
|||||||
#include "BulletCollision/CollisionShapes/btPolyhedralConvexShape.h"
|
#include "BulletCollision/CollisionShapes/btPolyhedralConvexShape.h"
|
||||||
|
|
||||||
btPolyhedralConvexShape::btPolyhedralConvexShape()
|
btPolyhedralConvexShape::btPolyhedralConvexShape()
|
||||||
:m_localAabbMin(1,1,1),
|
:btConvexInternalShape(),
|
||||||
|
m_localAabbMin(1,1,1),
|
||||||
m_localAabbMax(-1,-1,-1),
|
m_localAabbMax(-1,-1,-1),
|
||||||
m_isLocalAabbValid(false),
|
m_isLocalAabbValid(false),
|
||||||
m_optionalHull(0)
|
m_optionalHull(0)
|
||||||
|
|||||||
@@ -31,9 +31,10 @@ protected:
|
|||||||
btVector3 m_localAabbMax;
|
btVector3 m_localAabbMax;
|
||||||
bool m_isLocalAabbValid;
|
bool m_isLocalAabbValid;
|
||||||
|
|
||||||
|
btPolyhedralConvexShape();
|
||||||
public:
|
public:
|
||||||
|
|
||||||
btPolyhedralConvexShape();
|
|
||||||
|
|
||||||
//brute force implementations
|
//brute force implementations
|
||||||
virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec)const;
|
virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec)const;
|
||||||
|
|||||||
@@ -16,10 +16,9 @@ subject to the following restrictions:
|
|||||||
#include "btScaledBvhTriangleMeshShape.h"
|
#include "btScaledBvhTriangleMeshShape.h"
|
||||||
|
|
||||||
btScaledBvhTriangleMeshShape::btScaledBvhTriangleMeshShape(btBvhTriangleMeshShape* childShape,btVector3 localScaling)
|
btScaledBvhTriangleMeshShape::btScaledBvhTriangleMeshShape(btBvhTriangleMeshShape* childShape,btVector3 localScaling)
|
||||||
:m_bvhTriMeshShape(childShape),
|
:m_localScaling(localScaling),m_bvhTriMeshShape(childShape)
|
||||||
m_localScaling(localScaling)
|
|
||||||
{
|
{
|
||||||
|
m_shapeType = SCALED_TRIANGLE_MESH_SHAPE_PROXYTYPE;
|
||||||
}
|
}
|
||||||
|
|
||||||
btScaledBvhTriangleMeshShape::~btScaledBvhTriangleMeshShape()
|
btScaledBvhTriangleMeshShape::~btScaledBvhTriangleMeshShape()
|
||||||
|
|||||||
@@ -36,11 +36,6 @@ public:
|
|||||||
|
|
||||||
virtual ~btScaledBvhTriangleMeshShape();
|
virtual ~btScaledBvhTriangleMeshShape();
|
||||||
|
|
||||||
virtual int getShapeType() const
|
|
||||||
{
|
|
||||||
//use un-used 'FAST_CONCAVE_MESH_PROXYTYPE' for now, later add SCALED_TRIANGLE_MESH_SHAPE_PROXYTYPE to btBroadphaseProxy.h
|
|
||||||
return SCALED_TRIANGLE_MESH_SHAPE_PROXYTYPE;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const;
|
virtual void getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const;
|
||||||
virtual void setLocalScaling(const btVector3& scaling);
|
virtual void setLocalScaling(const btVector3& scaling);
|
||||||
|
|||||||
@@ -19,9 +19,11 @@ subject to the following restrictions:
|
|||||||
#include "LinearMath/btQuaternion.h"
|
#include "LinearMath/btQuaternion.h"
|
||||||
|
|
||||||
|
|
||||||
btSphereShape ::btSphereShape (btScalar radius)
|
btSphereShape ::btSphereShape (btScalar radius) : btConvexInternalShape ()
|
||||||
{
|
{
|
||||||
|
m_shapeType = SPHERE_SHAPE_PROXYTYPE;
|
||||||
m_implicitShapeDimensions.setX(radius);
|
m_implicitShapeDimensions.setX(radius);
|
||||||
|
m_collisionMargin = radius;
|
||||||
}
|
}
|
||||||
|
|
||||||
btVector3 btSphereShape::localGetSupportingVertexWithoutMargin(const btVector3& vec)const
|
btVector3 btSphereShape::localGetSupportingVertexWithoutMargin(const btVector3& vec)const
|
||||||
|
|||||||
@@ -40,7 +40,6 @@ public:
|
|||||||
|
|
||||||
virtual void getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const;
|
virtual void getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const;
|
||||||
|
|
||||||
virtual int getShapeType() const { return SPHERE_SHAPE_PROXYTYPE; }
|
|
||||||
|
|
||||||
btScalar getRadius() const { return m_implicitShapeDimensions.getX() * m_localScaling.getX();}
|
btScalar getRadius() const { return m_implicitShapeDimensions.getX() * m_localScaling.getX();}
|
||||||
|
|
||||||
|
|||||||
@@ -19,10 +19,11 @@ subject to the following restrictions:
|
|||||||
|
|
||||||
|
|
||||||
btStaticPlaneShape::btStaticPlaneShape(const btVector3& planeNormal,btScalar planeConstant)
|
btStaticPlaneShape::btStaticPlaneShape(const btVector3& planeNormal,btScalar planeConstant)
|
||||||
:m_planeNormal(planeNormal.normalized()),
|
: btConcaveShape (), m_planeNormal(planeNormal.normalized()),
|
||||||
m_planeConstant(planeConstant),
|
m_planeConstant(planeConstant),
|
||||||
m_localScaling(btScalar(0.),btScalar(0.),btScalar(0.))
|
m_localScaling(btScalar(0.),btScalar(0.),btScalar(0.))
|
||||||
{
|
{
|
||||||
|
m_shapeType = STATIC_PLANE_PROXYTYPE;
|
||||||
// btAssert( btFuzzyZero(m_planeNormal.length() - btScalar(1.)) );
|
// btAssert( btFuzzyZero(m_planeNormal.length() - btScalar(1.)) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -36,11 +36,6 @@ public:
|
|||||||
virtual ~btStaticPlaneShape();
|
virtual ~btStaticPlaneShape();
|
||||||
|
|
||||||
|
|
||||||
virtual int getShapeType() const
|
|
||||||
{
|
|
||||||
return STATIC_PLANE_PROXYTYPE;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const;
|
virtual void getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const;
|
||||||
|
|
||||||
virtual void processAllTriangles(btTriangleCallback* callback,const btVector3& aabbMin,const btVector3& aabbMax) const;
|
virtual void processAllTriangles(btTriangleCallback* callback,const btVector3& aabbMin,const btVector3& aabbMax) const;
|
||||||
|
|||||||
@@ -16,35 +16,40 @@ subject to the following restrictions:
|
|||||||
#include "btTetrahedronShape.h"
|
#include "btTetrahedronShape.h"
|
||||||
#include "LinearMath/btMatrix3x3.h"
|
#include "LinearMath/btMatrix3x3.h"
|
||||||
|
|
||||||
btBU_Simplex1to4::btBU_Simplex1to4()
|
btBU_Simplex1to4::btBU_Simplex1to4() : btPolyhedralConvexShape (),
|
||||||
:m_numVertices(0)
|
m_numVertices(0)
|
||||||
{
|
{
|
||||||
|
m_shapeType = TETRAHEDRAL_SHAPE_PROXYTYPE;
|
||||||
}
|
}
|
||||||
|
|
||||||
btBU_Simplex1to4::btBU_Simplex1to4(const btPoint3& pt0)
|
btBU_Simplex1to4::btBU_Simplex1to4(const btPoint3& pt0) : btPolyhedralConvexShape (),
|
||||||
:m_numVertices(0)
|
m_numVertices(0)
|
||||||
{
|
{
|
||||||
|
m_shapeType = TETRAHEDRAL_SHAPE_PROXYTYPE;
|
||||||
addVertex(pt0);
|
addVertex(pt0);
|
||||||
}
|
}
|
||||||
|
|
||||||
btBU_Simplex1to4::btBU_Simplex1to4(const btPoint3& pt0,const btPoint3& pt1)
|
btBU_Simplex1to4::btBU_Simplex1to4(const btPoint3& pt0,const btPoint3& pt1) : btPolyhedralConvexShape (),
|
||||||
:m_numVertices(0)
|
m_numVertices(0)
|
||||||
{
|
{
|
||||||
|
m_shapeType = TETRAHEDRAL_SHAPE_PROXYTYPE;
|
||||||
addVertex(pt0);
|
addVertex(pt0);
|
||||||
addVertex(pt1);
|
addVertex(pt1);
|
||||||
}
|
}
|
||||||
|
|
||||||
btBU_Simplex1to4::btBU_Simplex1to4(const btPoint3& pt0,const btPoint3& pt1,const btPoint3& pt2)
|
btBU_Simplex1to4::btBU_Simplex1to4(const btPoint3& pt0,const btPoint3& pt1,const btPoint3& pt2) : btPolyhedralConvexShape (),
|
||||||
:m_numVertices(0)
|
m_numVertices(0)
|
||||||
{
|
{
|
||||||
|
m_shapeType = TETRAHEDRAL_SHAPE_PROXYTYPE;
|
||||||
addVertex(pt0);
|
addVertex(pt0);
|
||||||
addVertex(pt1);
|
addVertex(pt1);
|
||||||
addVertex(pt2);
|
addVertex(pt2);
|
||||||
}
|
}
|
||||||
|
|
||||||
btBU_Simplex1to4::btBU_Simplex1to4(const btPoint3& pt0,const btPoint3& pt1,const btPoint3& pt2,const btPoint3& pt3)
|
btBU_Simplex1to4::btBU_Simplex1to4(const btPoint3& pt0,const btPoint3& pt1,const btPoint3& pt2,const btPoint3& pt3) : btPolyhedralConvexShape (),
|
||||||
:m_numVertices(0)
|
m_numVertices(0)
|
||||||
{
|
{
|
||||||
|
m_shapeType = TETRAHEDRAL_SHAPE_PROXYTYPE;
|
||||||
addVertex(pt0);
|
addVertex(pt0);
|
||||||
addVertex(pt1);
|
addVertex(pt1);
|
||||||
addVertex(pt2);
|
addVertex(pt2);
|
||||||
|
|||||||
@@ -44,7 +44,6 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
virtual int getShapeType() const{ return TETRAHEDRAL_SHAPE_PROXYTYPE; }
|
|
||||||
|
|
||||||
void addVertex(const btPoint3& pt);
|
void addVertex(const btPoint3& pt);
|
||||||
|
|
||||||
|
|||||||
@@ -22,8 +22,9 @@ subject to the following restrictions:
|
|||||||
|
|
||||||
|
|
||||||
btTriangleMeshShape::btTriangleMeshShape(btStridingMeshInterface* meshInterface)
|
btTriangleMeshShape::btTriangleMeshShape(btStridingMeshInterface* meshInterface)
|
||||||
: m_meshInterface(meshInterface)
|
: btConcaveShape (), m_meshInterface(meshInterface)
|
||||||
{
|
{
|
||||||
|
m_shapeType = TRIANGLE_MESH_SHAPE_PROXYTYPE;
|
||||||
if(meshInterface->hasPremadeAabb())
|
if(meshInterface->hasPremadeAabb())
|
||||||
{
|
{
|
||||||
meshInterface->getPremadeAabb(&m_localAabbMin, &m_localAabbMax);
|
meshInterface->getPremadeAabb(&m_localAabbMin, &m_localAabbMax);
|
||||||
|
|||||||
@@ -40,10 +40,6 @@ public:
|
|||||||
{
|
{
|
||||||
vert = m_vertices1[index];
|
vert = m_vertices1[index];
|
||||||
}
|
}
|
||||||
virtual int getShapeType() const
|
|
||||||
{
|
|
||||||
return TRIANGLE_SHAPE_PROXYTYPE;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual int getNumEdges() const
|
virtual int getNumEdges() const
|
||||||
{
|
{
|
||||||
@@ -83,8 +79,9 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
btTriangleShape(const btVector3& p0,const btVector3& p1,const btVector3& p2)
|
btTriangleShape(const btVector3& p0,const btVector3& p1,const btVector3& p2) : btPolyhedralConvexShape ()
|
||||||
{
|
{
|
||||||
|
m_shapeType = TRIANGLE_SHAPE_PROXYTYPE;
|
||||||
m_vertices1[0] = p0;
|
m_vertices1[0] = p0;
|
||||||
m_vertices1[1] = p1;
|
m_vertices1[1] = p1;
|
||||||
m_vertices1[2] = p2;
|
m_vertices1[2] = p2;
|
||||||
|
|||||||
@@ -16,9 +16,10 @@ subject to the following restrictions:
|
|||||||
#include "btUniformScalingShape.h"
|
#include "btUniformScalingShape.h"
|
||||||
|
|
||||||
btUniformScalingShape::btUniformScalingShape( btConvexShape* convexChildShape,btScalar uniformScalingFactor):
|
btUniformScalingShape::btUniformScalingShape( btConvexShape* convexChildShape,btScalar uniformScalingFactor):
|
||||||
m_childConvexShape(convexChildShape),
|
btConvexShape (), m_childConvexShape(convexChildShape),
|
||||||
m_uniformScalingFactor(uniformScalingFactor)
|
m_uniformScalingFactor(uniformScalingFactor)
|
||||||
{
|
{
|
||||||
|
m_shapeType = UNIFORM_SCALING_SHAPE_PROXYTYPE;
|
||||||
}
|
}
|
||||||
|
|
||||||
btUniformScalingShape::~btUniformScalingShape()
|
btUniformScalingShape::~btUniformScalingShape()
|
||||||
|
|||||||
@@ -61,7 +61,6 @@ class btUniformScalingShape : public btConvexShape
|
|||||||
return "UniformScalingShape";
|
return "UniformScalingShape";
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual int getShapeType() const { return UNIFORM_SCALING_SHAPE_PROXYTYPE; }
|
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////
|
///////////////////////////
|
||||||
|
|||||||
@@ -72,9 +72,9 @@ struct MinkowskiDiff
|
|||||||
void EnableMargin(bool enable)
|
void EnableMargin(bool enable)
|
||||||
{
|
{
|
||||||
if(enable)
|
if(enable)
|
||||||
Ls=&btConvexShape::localGetSupportingVertex;
|
Ls=&btConvexShape::localGetSupportVertexNonVirtual;
|
||||||
else
|
else
|
||||||
Ls=&btConvexShape::localGetSupportingVertexWithoutMargin;
|
Ls=&btConvexShape::localGetSupportVertexWithoutMarginNonVirtual;
|
||||||
}
|
}
|
||||||
inline btVector3 Support0(const btVector3& d) const
|
inline btVector3 Support0(const btVector3& d) const
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -17,7 +17,15 @@ subject to the following restrictions:
|
|||||||
|
|
||||||
#include "BulletCollision/CollisionShapes/btConvexShape.h"
|
#include "BulletCollision/CollisionShapes/btConvexShape.h"
|
||||||
#include "btGjkEpaPenetrationDepthSolver.h"
|
#include "btGjkEpaPenetrationDepthSolver.h"
|
||||||
|
|
||||||
|
#ifndef __SPU__
|
||||||
|
//#define USE_ORIGINAL_GJK 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_ORIGINAL_GJK
|
||||||
#include "BulletCollision/NarrowPhaseCollision/btGjkEpa.h"
|
#include "BulletCollision/NarrowPhaseCollision/btGjkEpa.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "BulletCollision/NarrowPhaseCollision/btGjkEpa2.h"
|
#include "BulletCollision/NarrowPhaseCollision/btGjkEpa2.h"
|
||||||
|
|
||||||
bool btGjkEpaPenetrationDepthSolver::calcPenDepth( btSimplexSolverInterface& simplexSolver,
|
bool btGjkEpaPenetrationDepthSolver::calcPenDepth( btSimplexSolverInterface& simplexSolver,
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ subject to the following restrictions:
|
|||||||
#ifdef __SPU__
|
#ifdef __SPU__
|
||||||
#include <spu_printf.h>
|
#include <spu_printf.h>
|
||||||
#define printf spu_printf
|
#define printf spu_printf
|
||||||
|
//#define DEBUG_SPU_COLLISION_DETECTION 1
|
||||||
#endif //__SPU__
|
#endif //__SPU__
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -58,16 +59,22 @@ void btGjkPairDetector::getClosestPoints(const ClosestPointInput& input,Result&
|
|||||||
localTransA.getOrigin() -= positionOffset;
|
localTransA.getOrigin() -= positionOffset;
|
||||||
localTransB.getOrigin() -= positionOffset;
|
localTransB.getOrigin() -= positionOffset;
|
||||||
|
|
||||||
btScalar marginA = m_minkowskiA->getMargin();
|
btScalar marginA = m_minkowskiA->getMarginNonVirtual();
|
||||||
btScalar marginB = m_minkowskiB->getMargin();
|
btScalar marginB = m_minkowskiB->getMarginNonVirtual();
|
||||||
|
|
||||||
gNumGjkChecks++;
|
gNumGjkChecks++;
|
||||||
|
|
||||||
|
#ifdef DEBUG_SPU_COLLISION_DETECTION
|
||||||
|
spu_printf("inside gjk\n");
|
||||||
|
#endif
|
||||||
//for CCD we don't use margins
|
//for CCD we don't use margins
|
||||||
if (m_ignoreMargin)
|
if (m_ignoreMargin)
|
||||||
{
|
{
|
||||||
marginA = btScalar(0.);
|
marginA = btScalar(0.);
|
||||||
marginB = btScalar(0.);
|
marginB = btScalar(0.);
|
||||||
|
#ifdef DEBUG_SPU_COLLISION_DETECTION
|
||||||
|
spu_printf("ignoring margin\n");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
m_curIter = 0;
|
m_curIter = 0;
|
||||||
@@ -98,11 +105,15 @@ void btGjkPairDetector::getClosestPoints(const ClosestPointInput& input,Result&
|
|||||||
btVector3 seperatingAxisInA = (-m_cachedSeparatingAxis)* input.m_transformA.getBasis();
|
btVector3 seperatingAxisInA = (-m_cachedSeparatingAxis)* input.m_transformA.getBasis();
|
||||||
btVector3 seperatingAxisInB = m_cachedSeparatingAxis* input.m_transformB.getBasis();
|
btVector3 seperatingAxisInB = m_cachedSeparatingAxis* input.m_transformB.getBasis();
|
||||||
|
|
||||||
btVector3 pInA = m_minkowskiA->localGetSupportingVertexWithoutMargin(seperatingAxisInA);
|
btVector3 pInA = m_minkowskiA->localGetSupportVertexWithoutMarginNonVirtual(seperatingAxisInA);
|
||||||
btVector3 qInB = m_minkowskiB->localGetSupportingVertexWithoutMargin(seperatingAxisInB);
|
btVector3 qInB = m_minkowskiB->localGetSupportVertexWithoutMarginNonVirtual(seperatingAxisInB);
|
||||||
btPoint3 pWorld = localTransA(pInA);
|
btPoint3 pWorld = localTransA(pInA);
|
||||||
btPoint3 qWorld = localTransB(qInB);
|
btPoint3 qWorld = localTransB(qInB);
|
||||||
|
|
||||||
|
#ifdef DEBUG_SPU_COLLISION_DETECTION
|
||||||
|
spu_printf("got local supporting vertices\n");
|
||||||
|
#endif
|
||||||
|
|
||||||
btVector3 w = pWorld - qWorld;
|
btVector3 w = pWorld - qWorld;
|
||||||
delta = m_cachedSeparatingAxis.dot(w);
|
delta = m_cachedSeparatingAxis.dot(w);
|
||||||
|
|
||||||
@@ -133,9 +144,15 @@ void btGjkPairDetector::getClosestPoints(const ClosestPointInput& input,Result&
|
|||||||
checkSimplex = true;
|
checkSimplex = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef DEBUG_SPU_COLLISION_DETECTION
|
||||||
|
spu_printf("addVertex 1\n");
|
||||||
|
#endif
|
||||||
//add current vertex to simplex
|
//add current vertex to simplex
|
||||||
m_simplexSolver->addVertex(w, pWorld, qWorld);
|
m_simplexSolver->addVertex(w, pWorld, qWorld);
|
||||||
|
#ifdef DEBUG_SPU_COLLISION_DETECTION
|
||||||
|
spu_printf("addVertex 2\n");
|
||||||
|
#endif
|
||||||
//calculate the closest point to the origin (update vector v)
|
//calculate the closest point to the origin (update vector v)
|
||||||
if (!m_simplexSolver->closest(m_cachedSeparatingAxis))
|
if (!m_simplexSolver->closest(m_cachedSeparatingAxis))
|
||||||
{
|
{
|
||||||
@@ -167,7 +184,7 @@ void btGjkPairDetector::getClosestPoints(const ClosestPointInput& input,Result&
|
|||||||
//degeneracy, this is typically due to invalid/uninitialized worldtransforms for a btCollisionObject
|
//degeneracy, this is typically due to invalid/uninitialized worldtransforms for a btCollisionObject
|
||||||
if (m_curIter++ > gGjkMaxIter)
|
if (m_curIter++ > gGjkMaxIter)
|
||||||
{
|
{
|
||||||
#if defined(DEBUG) || defined (_DEBUG)
|
#if defined(DEBUG) || defined (_DEBUG) || defined (DEBUG_SPU_COLLISION_DETECTION)
|
||||||
|
|
||||||
printf("btGjkPairDetector maxIter exceeded:%i\n",m_curIter);
|
printf("btGjkPairDetector maxIter exceeded:%i\n",m_curIter);
|
||||||
printf("sepAxis=(%f,%f,%f), squaredDistance = %f, shapeTypeA=%i,shapeTypeB=%i\n",
|
printf("sepAxis=(%f,%f,%f), squaredDistance = %f, shapeTypeA=%i,shapeTypeB=%i\n",
|
||||||
@@ -290,10 +307,17 @@ void btGjkPairDetector::getClosestPoints(const ClosestPointInput& input,Result&
|
|||||||
#endif //__CELLOS_LV2__
|
#endif //__CELLOS_LV2__
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef DEBUG_SPU_COLLISION_DETECTION
|
||||||
|
spu_printf("output 1\n");
|
||||||
|
#endif
|
||||||
output.addContactPoint(
|
output.addContactPoint(
|
||||||
normalInB,
|
normalInB,
|
||||||
pointOnB+positionOffset,
|
pointOnB+positionOffset,
|
||||||
distance);
|
distance);
|
||||||
|
|
||||||
|
#ifdef DEBUG_SPU_COLLISION_DETECTION
|
||||||
|
spu_printf("output 2\n");
|
||||||
|
#endif
|
||||||
//printf("gjk add:%f",distance);
|
//printf("gjk add:%f",distance);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,9 +19,6 @@ subject to the following restrictions:
|
|||||||
#include "BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h"
|
#include "BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h"
|
||||||
#include "BulletCollision/CollisionShapes/btConvexShape.h"
|
#include "BulletCollision/CollisionShapes/btConvexShape.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define NUM_UNITSPHERE_POINTS 42
|
#define NUM_UNITSPHERE_POINTS 42
|
||||||
static btVector3 sPenetrationDirections[NUM_UNITSPHERE_POINTS+MAX_PREFERRED_PENETRATION_DIRECTIONS*2] =
|
static btVector3 sPenetrationDirections[NUM_UNITSPHERE_POINTS+MAX_PREFERRED_PENETRATION_DIRECTIONS*2] =
|
||||||
{
|
{
|
||||||
@@ -117,7 +114,9 @@ bool btMinkowskiPenetrationDepthSolver::calcPenDepth(btSimplexSolverInterface& s
|
|||||||
btVector3 seperatingAxisInA,seperatingAxisInB;
|
btVector3 seperatingAxisInA,seperatingAxisInB;
|
||||||
btVector3 pInA,qInB,pWorld,qWorld,w;
|
btVector3 pInA,qInB,pWorld,qWorld,w;
|
||||||
|
|
||||||
|
#ifndef __SPU__
|
||||||
#define USE_BATCHED_SUPPORT 1
|
#define USE_BATCHED_SUPPORT 1
|
||||||
|
#endif
|
||||||
#ifdef USE_BATCHED_SUPPORT
|
#ifdef USE_BATCHED_SUPPORT
|
||||||
|
|
||||||
btVector3 supportVerticesABatch[NUM_UNITSPHERE_POINTS+MAX_PREFERRED_PENETRATION_DIRECTIONS*2];
|
btVector3 supportVerticesABatch[NUM_UNITSPHERE_POINTS+MAX_PREFERRED_PENETRATION_DIRECTIONS*2];
|
||||||
@@ -200,6 +199,7 @@ bool btMinkowskiPenetrationDepthSolver::calcPenDepth(btSimplexSolverInterface& s
|
|||||||
|
|
||||||
int numSampleDirections = NUM_UNITSPHERE_POINTS;
|
int numSampleDirections = NUM_UNITSPHERE_POINTS;
|
||||||
|
|
||||||
|
#ifndef __SPU__
|
||||||
{
|
{
|
||||||
int numPDA = convexA->getNumPreferredPenetrationDirections();
|
int numPDA = convexA->getNumPreferredPenetrationDirections();
|
||||||
if (numPDA)
|
if (numPDA)
|
||||||
@@ -229,14 +229,15 @@ bool btMinkowskiPenetrationDepthSolver::calcPenDepth(btSimplexSolverInterface& s
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif // __SPU__
|
||||||
|
|
||||||
for (int i=0;i<numSampleDirections;i++)
|
for (int i=0;i<numSampleDirections;i++)
|
||||||
{
|
{
|
||||||
const btVector3& norm = sPenetrationDirections[i];
|
const btVector3& norm = sPenetrationDirections[i];
|
||||||
seperatingAxisInA = (-norm)* transA.getBasis();
|
seperatingAxisInA = (-norm)* transA.getBasis();
|
||||||
seperatingAxisInB = norm* transB.getBasis();
|
seperatingAxisInB = norm* transB.getBasis();
|
||||||
pInA = convexA->localGetSupportingVertexWithoutMargin(seperatingAxisInA);
|
pInA = convexA->localGetSupportVertexWithoutMarginNonVirtual(seperatingAxisInA);
|
||||||
qInB = convexB->localGetSupportingVertexWithoutMargin(seperatingAxisInB);
|
qInB = convexB->localGetSupportVertexWithoutMarginNonVirtual(seperatingAxisInB);
|
||||||
pWorld = transA(pInA);
|
pWorld = transA(pInA);
|
||||||
qWorld = transB(qInB);
|
qWorld = transB(qInB);
|
||||||
w = qWorld - pWorld;
|
w = qWorld - pWorld;
|
||||||
@@ -254,13 +255,13 @@ bool btMinkowskiPenetrationDepthSolver::calcPenDepth(btSimplexSolverInterface& s
|
|||||||
|
|
||||||
//add the margins
|
//add the margins
|
||||||
|
|
||||||
minA += minNorm*convexA->getMargin();
|
minA += minNorm*convexA->getMarginNonVirtual();
|
||||||
minB -= minNorm*convexB->getMargin();
|
minB -= minNorm*convexB->getMarginNonVirtual();
|
||||||
//no penetration
|
//no penetration
|
||||||
if (minProj < btScalar(0.))
|
if (minProj < btScalar(0.))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
minProj += (convexA->getMargin() + convexB->getMargin());
|
minProj += (convexA->getMarginNonVirtual() + convexB->getMarginNonVirtual());
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -30,7 +30,6 @@ public:
|
|||||||
btVector3& v, btPoint3& pa, btPoint3& pb,
|
btVector3& v, btPoint3& pa, btPoint3& pb,
|
||||||
class btIDebugDraw* debugDraw,btStackAlloc* stackAlloc
|
class btIDebugDraw* debugDraw,btStackAlloc* stackAlloc
|
||||||
);
|
);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //MINKOWSKI_PENETRATION_DEPTH_SOLVER_H
|
#endif //MINKOWSKI_PENETRATION_DEPTH_SOLVER_H
|
||||||
|
|||||||
Reference in New Issue
Block a user