+ CMake build system fix under Windows: don't define _WINDOWS to allow Glut console demo to build properly
+ Allow user to enable useConvexConservativeDistanceUtil . Use dynamicsWorld->getDispatchInfo().m_useConvexConservativeDistanceUtil = true; (see Demos/Benchmarks/Benchmark4 (convex objects falling down) + Fix for plane drawing (just wire-frame) + Gimpact: use collision margin of 0.07 for demo (because BULLET_TRIANGLE_COLLISION is used) + replace dot,cross,distance,angle,triple in btVector3 by btDot, btCross,btDistance,btAngle,btDistance to avoid naming conflicts + Some fixes in GJK penetration depth normal direction (broken in a previous commit) + fix in calculateDiffAxisAngleQuaternion to make ConvexConservativeDistanceUtil work properly + allow debug drawing to debug btContinuousConvexCollision + add comment/warning that btTriangleMesh::findOrAddVertex is an internal method, users should use addTriangle instead
This commit is contained in:
@@ -96,21 +96,21 @@ btVector3 PlaneLineIntersection(const btPlane &plane, const btVector3 &p0, const
|
||||
// returns the point where the line p0-p1 intersects the plane n&d
|
||||
static btVector3 dif;
|
||||
dif = p1-p0;
|
||||
btScalar dn= dot(plane.normal,dif);
|
||||
btScalar t = -(plane.dist+dot(plane.normal,p0) )/dn;
|
||||
btScalar dn= btDot(plane.normal,dif);
|
||||
btScalar t = -(plane.dist+btDot(plane.normal,p0) )/dn;
|
||||
return p0 + (dif*t);
|
||||
}
|
||||
|
||||
btVector3 PlaneProject(const btPlane &plane, const btVector3 &point)
|
||||
{
|
||||
return point - plane.normal * (dot(point,plane.normal)+plane.dist);
|
||||
return point - plane.normal * (btDot(point,plane.normal)+plane.dist);
|
||||
}
|
||||
|
||||
btVector3 TriNormal(const btVector3 &v0, const btVector3 &v1, const btVector3 &v2)
|
||||
{
|
||||
// return the normal of the triangle
|
||||
// inscribed by v0, v1, and v2
|
||||
btVector3 cp=cross(v1-v0,v2-v1);
|
||||
btVector3 cp=btCross(v1-v0,v2-v1);
|
||||
btScalar m=cp.length();
|
||||
if(m==0) return btVector3(1,0,0);
|
||||
return cp*(btScalar(1.0)/m);
|
||||
@@ -120,23 +120,23 @@ btVector3 TriNormal(const btVector3 &v0, const btVector3 &v1, const btVector3 &v
|
||||
btScalar DistanceBetweenLines(const btVector3 &ustart, const btVector3 &udir, const btVector3 &vstart, const btVector3 &vdir, btVector3 *upoint, btVector3 *vpoint)
|
||||
{
|
||||
static btVector3 cp;
|
||||
cp = cross(udir,vdir).normalized();
|
||||
cp = btCross(udir,vdir).normalized();
|
||||
|
||||
btScalar distu = -dot(cp,ustart);
|
||||
btScalar distv = -dot(cp,vstart);
|
||||
btScalar distu = -btDot(cp,ustart);
|
||||
btScalar distv = -btDot(cp,vstart);
|
||||
btScalar dist = (btScalar)fabs(distu-distv);
|
||||
if(upoint)
|
||||
{
|
||||
btPlane plane;
|
||||
plane.normal = cross(vdir,cp).normalized();
|
||||
plane.dist = -dot(plane.normal,vstart);
|
||||
plane.normal = btCross(vdir,cp).normalized();
|
||||
plane.dist = -btDot(plane.normal,vstart);
|
||||
*upoint = PlaneLineIntersection(plane,ustart,ustart+udir);
|
||||
}
|
||||
if(vpoint)
|
||||
{
|
||||
btPlane plane;
|
||||
plane.normal = cross(udir,cp).normalized();
|
||||
plane.dist = -dot(plane.normal,ustart);
|
||||
plane.normal = btCross(udir,cp).normalized();
|
||||
plane.dist = -btDot(plane.normal,ustart);
|
||||
*vpoint = PlaneLineIntersection(plane,vstart,vstart+vdir);
|
||||
}
|
||||
return dist;
|
||||
@@ -170,7 +170,7 @@ ConvexH::ConvexH(int vertices_size,int edges_size,int facets_size)
|
||||
|
||||
int PlaneTest(const btPlane &p, const btVector3 &v);
|
||||
int PlaneTest(const btPlane &p, const btVector3 &v) {
|
||||
btScalar a = dot(v,p.normal)+p.dist;
|
||||
btScalar a = btDot(v,p.normal)+p.dist;
|
||||
int flag = (a>planetestepsilon)?OVER:((a<-planetestepsilon)?UNDER:COPLANAR);
|
||||
return flag;
|
||||
}
|
||||
@@ -228,7 +228,7 @@ int maxdirfiltered(const T *p,int count,const T &dir,btAlignedObjectArray<int> &
|
||||
for(int i=0;i<count;i++)
|
||||
if(allow[i])
|
||||
{
|
||||
if(m==-1 || dot(p[i],dir)>dot(p[m],dir))
|
||||
if(m==-1 || btDot(p[i],dir)>btDot(p[m],dir))
|
||||
m=i;
|
||||
}
|
||||
btAssert(m!=-1);
|
||||
@@ -238,8 +238,8 @@ int maxdirfiltered(const T *p,int count,const T &dir,btAlignedObjectArray<int> &
|
||||
btVector3 orth(const btVector3 &v);
|
||||
btVector3 orth(const btVector3 &v)
|
||||
{
|
||||
btVector3 a=cross(v,btVector3(0,0,1));
|
||||
btVector3 b=cross(v,btVector3(0,1,0));
|
||||
btVector3 a=btCross(v,btVector3(0,0,1));
|
||||
btVector3 b=btCross(v,btVector3(0,1,0));
|
||||
if (a.length() > b.length())
|
||||
{
|
||||
return a.normalized();
|
||||
@@ -258,7 +258,7 @@ int maxdirsterid(const T *p,int count,const T &dir,btAlignedObjectArray<int> &al
|
||||
m = maxdirfiltered(p,count,dir,allow);
|
||||
if(allow[m]==3) return m;
|
||||
T u = orth(dir);
|
||||
T v = cross(u,dir);
|
||||
T v = btCross(u,dir);
|
||||
int ma=-1;
|
||||
for(btScalar x = btScalar(0.0) ; x<= btScalar(360.0) ; x+= btScalar(45.0))
|
||||
{
|
||||
@@ -313,7 +313,7 @@ int above(btVector3* vertices,const int3& t, const btVector3 &p, btScalar epsilo
|
||||
int above(btVector3* vertices,const int3& t, const btVector3 &p, btScalar epsilon)
|
||||
{
|
||||
btVector3 n=TriNormal(vertices[t[0]],vertices[t[1]],vertices[t[2]]);
|
||||
return (dot(n,p-vertices[t[0]]) > epsilon); // EPSILON???
|
||||
return (btDot(n,p-vertices[t[0]]) > epsilon); // EPSILON???
|
||||
}
|
||||
int hasedge(const int3 &t, int a,int b);
|
||||
int hasedge(const int3 &t, int a,int b)
|
||||
@@ -495,8 +495,8 @@ int4 HullLibrary::FindSimplex(btVector3 *verts,int verts_count,btAlignedObjectAr
|
||||
basis[0] = verts[p0]-verts[p1];
|
||||
if(p0==p1 || basis[0]==btVector3(0,0,0))
|
||||
return int4(-1,-1,-1,-1);
|
||||
basis[1] = cross(btVector3( btScalar(1),btScalar(0.02), btScalar(0)),basis[0]);
|
||||
basis[2] = cross(btVector3(btScalar(-0.02), btScalar(1), btScalar(0)),basis[0]);
|
||||
basis[1] = btCross(btVector3( btScalar(1),btScalar(0.02), btScalar(0)),basis[0]);
|
||||
basis[2] = btCross(btVector3(btScalar(-0.02), btScalar(1), btScalar(0)),basis[0]);
|
||||
if (basis[1].length() > basis[2].length())
|
||||
{
|
||||
basis[1].normalize();
|
||||
@@ -512,13 +512,13 @@ int4 HullLibrary::FindSimplex(btVector3 *verts,int verts_count,btAlignedObjectAr
|
||||
if(p2 == p0 || p2 == p1)
|
||||
return int4(-1,-1,-1,-1);
|
||||
basis[1] = verts[p2] - verts[p0];
|
||||
basis[2] = cross(basis[1],basis[0]).normalized();
|
||||
basis[2] = btCross(basis[1],basis[0]).normalized();
|
||||
int p3 = maxdirsterid(verts,verts_count,basis[2],allow);
|
||||
if(p3==p0||p3==p1||p3==p2) p3 = maxdirsterid(verts,verts_count,-basis[2],allow);
|
||||
if(p3==p0||p3==p1||p3==p2)
|
||||
return int4(-1,-1,-1,-1);
|
||||
btAssert(!(p0==p1||p0==p2||p0==p3||p1==p2||p1==p3||p2==p3));
|
||||
if(dot(verts[p3]-verts[p0],cross(verts[p1]-verts[p0],verts[p2]-verts[p0])) <0) {Swap(p2,p3);}
|
||||
if(btDot(verts[p3]-verts[p0],btCross(verts[p1]-verts[p0],verts[p2]-verts[p0])) <0) {Swap(p2,p3);}
|
||||
return int4(p0,p1,p2,p3);
|
||||
}
|
||||
|
||||
@@ -564,7 +564,7 @@ int HullLibrary::calchullgen(btVector3 *verts,int verts_count, int vlimit)
|
||||
btAssert(t->vmax<0);
|
||||
btVector3 n=TriNormal(verts[(*t)[0]],verts[(*t)[1]],verts[(*t)[2]]);
|
||||
t->vmax = maxdirsterid(verts,verts_count,n,allow);
|
||||
t->rise = dot(n,verts[t->vmax]-verts[(*t)[0]]);
|
||||
t->rise = btDot(n,verts[t->vmax]-verts[(*t)[0]]);
|
||||
}
|
||||
btHullTriangle *te;
|
||||
vlimit-=4;
|
||||
@@ -592,7 +592,7 @@ int HullLibrary::calchullgen(btVector3 *verts,int verts_count, int vlimit)
|
||||
if(!m_tris[j]) continue;
|
||||
if(!hasvert(*m_tris[j],v)) break;
|
||||
int3 nt=*m_tris[j];
|
||||
if(above(verts,nt,center,btScalar(0.01)*epsilon) || cross(verts[nt[1]]-verts[nt[0]],verts[nt[2]]-verts[nt[1]]).length()< epsilon*epsilon*btScalar(0.1) )
|
||||
if(above(verts,nt,center,btScalar(0.01)*epsilon) || btCross(verts[nt[1]]-verts[nt[0]],verts[nt[2]]-verts[nt[1]]).length()< epsilon*epsilon*btScalar(0.1) )
|
||||
{
|
||||
btHullTriangle *nb = m_tris[m_tris[j]->n[0]];
|
||||
btAssert(nb);btAssert(!hasvert(*nb,v));btAssert(nb->id<j);
|
||||
@@ -614,7 +614,7 @@ int HullLibrary::calchullgen(btVector3 *verts,int verts_count, int vlimit)
|
||||
}
|
||||
else
|
||||
{
|
||||
t->rise = dot(n,verts[t->vmax]-verts[(*t)[0]]);
|
||||
t->rise = btDot(n,verts[t->vmax]-verts[(*t)[0]]);
|
||||
}
|
||||
}
|
||||
vlimit --;
|
||||
|
||||
@@ -503,7 +503,7 @@ class btMatrix3x3 {
|
||||
SIMD_FORCE_INLINE btScalar
|
||||
btMatrix3x3::determinant() const
|
||||
{
|
||||
return triple((*this)[0], (*this)[1], (*this)[2]);
|
||||
return btTriple((*this)[0], (*this)[1], (*this)[2]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -261,6 +261,18 @@ public:
|
||||
return (-qd);
|
||||
}
|
||||
|
||||
/**@todo document this and it's use */
|
||||
SIMD_FORCE_INLINE btQuaternion nearest( const btQuaternion& qd) const
|
||||
{
|
||||
btQuaternion diff,sum;
|
||||
diff = *this - qd;
|
||||
sum = *this + qd;
|
||||
if( diff.dot(diff) < sum.dot(sum) )
|
||||
return qd;
|
||||
return (-qd);
|
||||
}
|
||||
|
||||
|
||||
/**@brief Return the quaternion which is the result of Spherical Linear Interpolation between this and the other quaternion
|
||||
* @param q The other quaternion to interpolate with
|
||||
* @param t The ratio between this and q to interpolate. If t = 0 the result is this, if t=1 the result is q.
|
||||
|
||||
@@ -96,7 +96,7 @@ public:
|
||||
|
||||
static void calculateDiffAxisAngleQuaternion(const btQuaternion& orn0,const btQuaternion& orn1a,btVector3& axis,btScalar& angle)
|
||||
{
|
||||
btQuaternion orn1 = orn0.farthest(orn1a);
|
||||
btQuaternion orn1 = orn0.nearest(orn1a);
|
||||
btQuaternion dorn = orn1 * orn0.inverse();
|
||||
///floating point inaccuracy can lead to w component > 1..., which breaks
|
||||
dorn.normalize();
|
||||
@@ -206,17 +206,21 @@ public:
|
||||
|
||||
void initSeparatingDistance(const btVector3& separatingVector,btScalar separatingDistance,const btTransform& transA,const btTransform& transB)
|
||||
{
|
||||
m_separatingNormal = separatingVector;
|
||||
m_separatingDistance = separatingDistance;
|
||||
|
||||
const btVector3& toPosA = transA.getOrigin();
|
||||
const btVector3& toPosB = transB.getOrigin();
|
||||
btQuaternion toOrnA = transA.getRotation();
|
||||
btQuaternion toOrnB = transB.getRotation();
|
||||
m_posA = toPosA;
|
||||
m_posB = toPosB;
|
||||
m_ornA = toOrnA;
|
||||
m_ornB = toOrnB;
|
||||
|
||||
if (m_separatingDistance>0.f)
|
||||
{
|
||||
m_separatingNormal = separatingVector;
|
||||
|
||||
const btVector3& toPosA = transA.getOrigin();
|
||||
const btVector3& toPosB = transB.getOrigin();
|
||||
btQuaternion toOrnA = transA.getRotation();
|
||||
btQuaternion toOrnB = transB.getRotation();
|
||||
m_posA = toPosA;
|
||||
m_posB = toPosB;
|
||||
m_ornA = toOrnA;
|
||||
m_ornB = toOrnB;
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
@@ -306,7 +306,7 @@ public:
|
||||
m_floats[0]=x;
|
||||
m_floats[1]=y;
|
||||
m_floats[2]=z;
|
||||
m_floats[3] = 0.f;
|
||||
m_floats[3] = btScalar(0.);
|
||||
}
|
||||
|
||||
void getSkewSymmetricMatrix(btVector3* v0,btVector3* v1,btVector3* v2) const
|
||||
@@ -316,6 +316,11 @@ public:
|
||||
v2->setValue(-y() ,x() ,0.);
|
||||
}
|
||||
|
||||
void setZero()
|
||||
{
|
||||
setValue(btScalar(0.),btScalar(0.),btScalar(0.));
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
/**@brief Return the sum of two vectors (Point symantics)*/
|
||||
@@ -376,7 +381,7 @@ operator/(const btVector3& v1, const btVector3& v2)
|
||||
|
||||
/**@brief Return the dot product between two vectors */
|
||||
SIMD_FORCE_INLINE btScalar
|
||||
dot(const btVector3& v1, const btVector3& v2)
|
||||
btDot(const btVector3& v1, const btVector3& v2)
|
||||
{
|
||||
return v1.dot(v2);
|
||||
}
|
||||
@@ -384,7 +389,7 @@ dot(const btVector3& v1, const btVector3& v2)
|
||||
|
||||
/**@brief Return the distance squared between two vectors */
|
||||
SIMD_FORCE_INLINE btScalar
|
||||
distance2(const btVector3& v1, const btVector3& v2)
|
||||
btDistance2(const btVector3& v1, const btVector3& v2)
|
||||
{
|
||||
return v1.distance2(v2);
|
||||
}
|
||||
@@ -392,27 +397,27 @@ distance2(const btVector3& v1, const btVector3& v2)
|
||||
|
||||
/**@brief Return the distance between two vectors */
|
||||
SIMD_FORCE_INLINE btScalar
|
||||
distance(const btVector3& v1, const btVector3& v2)
|
||||
btDistance(const btVector3& v1, const btVector3& v2)
|
||||
{
|
||||
return v1.distance(v2);
|
||||
}
|
||||
|
||||
/**@brief Return the angle between two vectors */
|
||||
SIMD_FORCE_INLINE btScalar
|
||||
angle(const btVector3& v1, const btVector3& v2)
|
||||
btAngle(const btVector3& v1, const btVector3& v2)
|
||||
{
|
||||
return v1.angle(v2);
|
||||
}
|
||||
|
||||
/**@brief Return the cross product of two vectors */
|
||||
SIMD_FORCE_INLINE btVector3
|
||||
cross(const btVector3& v1, const btVector3& v2)
|
||||
btCross(const btVector3& v1, const btVector3& v2)
|
||||
{
|
||||
return v1.cross(v2);
|
||||
}
|
||||
|
||||
SIMD_FORCE_INLINE btScalar
|
||||
triple(const btVector3& v1, const btVector3& v2, const btVector3& v3)
|
||||
btTriple(const btVector3& v1, const btVector3& v2, const btVector3& v3)
|
||||
{
|
||||
return v1.triple(v2, v3);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user