+ 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:
@@ -611,7 +611,7 @@ btScalar btSoftBody::getVolume() const
|
||||
for(i=0,ni=m_faces.size();i<ni;++i)
|
||||
{
|
||||
const Face& f=m_faces[i];
|
||||
vol+=dot(f.m_n[0]->m_x-org,cross(f.m_n[1]->m_x-org,f.m_n[2]->m_x-org));
|
||||
vol+=btDot(f.m_n[0]->m_x-org,btCross(f.m_n[1]->m_x-org,f.m_n[2]->m_x-org));
|
||||
}
|
||||
vol/=(btScalar)6;
|
||||
}
|
||||
@@ -644,14 +644,14 @@ btVector3 btSoftBody::clusterCom(int cluster) const
|
||||
//
|
||||
btVector3 btSoftBody::clusterVelocity(const Cluster* cluster,const btVector3& rpos)
|
||||
{
|
||||
return(cluster->m_lv+cross(cluster->m_av,rpos));
|
||||
return(cluster->m_lv+btCross(cluster->m_av,rpos));
|
||||
}
|
||||
|
||||
//
|
||||
void btSoftBody::clusterVImpulse(Cluster* cluster,const btVector3& rpos,const btVector3& impulse)
|
||||
{
|
||||
const btVector3 li=cluster->m_imass*impulse;
|
||||
const btVector3 ai=cluster->m_invwi*cross(rpos,impulse);
|
||||
const btVector3 ai=cluster->m_invwi*btCross(rpos,impulse);
|
||||
cluster->m_vimpulses[0]+=li;cluster->m_lv+=li;
|
||||
cluster->m_vimpulses[1]+=ai;cluster->m_av+=ai;
|
||||
cluster->m_nvimpulses++;
|
||||
@@ -661,7 +661,7 @@ void btSoftBody::clusterVImpulse(Cluster* cluster,const btVector3& rpos,const
|
||||
void btSoftBody::clusterDImpulse(Cluster* cluster,const btVector3& rpos,const btVector3& impulse)
|
||||
{
|
||||
const btVector3 li=cluster->m_imass*impulse;
|
||||
const btVector3 ai=cluster->m_invwi*cross(rpos,impulse);
|
||||
const btVector3 ai=cluster->m_invwi*btCross(rpos,impulse);
|
||||
cluster->m_dimpulses[0]+=li;
|
||||
cluster->m_dimpulses[1]+=ai;
|
||||
cluster->m_ndimpulses++;
|
||||
@@ -1585,19 +1585,19 @@ btScalar btSoftBody::RayFromToCaster::rayFromToTriangle( const btVector3& rayF
|
||||
static const btScalar ceps=-SIMD_EPSILON*10;
|
||||
static const btScalar teps=SIMD_EPSILON*10;
|
||||
|
||||
const btVector3 n=cross(b-a,c-a);
|
||||
const btScalar d=dot(a,n);
|
||||
const btScalar den=dot(rayNormalizedDirection,n);
|
||||
const btVector3 n=btCross(b-a,c-a);
|
||||
const btScalar d=btDot(a,n);
|
||||
const btScalar den=btDot(rayNormalizedDirection,n);
|
||||
if(!btFuzzyZero(den))
|
||||
{
|
||||
const btScalar num=dot(rayFrom,n)-d;
|
||||
const btScalar num=btDot(rayFrom,n)-d;
|
||||
const btScalar t=-num/den;
|
||||
if((t>teps)&&(t<maxt))
|
||||
{
|
||||
const btVector3 hit=rayFrom+rayNormalizedDirection*t;
|
||||
if( (dot(n,cross(a-hit,b-hit))>ceps) &&
|
||||
(dot(n,cross(b-hit,c-hit))>ceps) &&
|
||||
(dot(n,cross(c-hit,a-hit))>ceps))
|
||||
if( (btDot(n,btCross(a-hit,b-hit))>ceps) &&
|
||||
(btDot(n,btCross(b-hit,c-hit))>ceps) &&
|
||||
(btDot(n,btCross(c-hit,a-hit))>ceps))
|
||||
{
|
||||
return(t);
|
||||
}
|
||||
@@ -1783,7 +1783,7 @@ bool btSoftBody::checkContact( btCollisionObject* colObj,
|
||||
{
|
||||
cti.m_colObj = colObj;
|
||||
cti.m_normal = wtr.getBasis()*nrm;
|
||||
cti.m_offset = -dot( cti.m_normal,
|
||||
cti.m_offset = -btDot( cti.m_normal,
|
||||
x-cti.m_normal*dst);
|
||||
return(true);
|
||||
}
|
||||
@@ -1803,7 +1803,7 @@ void btSoftBody::updateNormals()
|
||||
for(i=0,ni=m_faces.size();i<ni;++i)
|
||||
{
|
||||
btSoftBody::Face& f=m_faces[i];
|
||||
const btVector3 n=cross(f.m_n[1]->m_x-f.m_n[0]->m_x,
|
||||
const btVector3 n=btCross(f.m_n[1]->m_x-f.m_n[0]->m_x,
|
||||
f.m_n[2]->m_x-f.m_n[0]->m_x);
|
||||
f.m_normal=n.normalized();
|
||||
f.m_n[0]->m_n+=n;
|
||||
@@ -2058,7 +2058,7 @@ void btSoftBody::updateClusters()
|
||||
{
|
||||
const btVector3 v=c.m_nodes[i]->m_v*c.m_masses[i];
|
||||
c.m_lv += v;
|
||||
c.m_av += cross(c.m_nodes[i]->m_x-c.m_com,v);
|
||||
c.m_av += btCross(c.m_nodes[i]->m_x-c.m_com,v);
|
||||
}
|
||||
}
|
||||
c.m_lv=c.m_imass*c.m_lv*(1-c.m_ldamping);
|
||||
@@ -2174,7 +2174,7 @@ void btSoftBody::applyClusters(bool drift)
|
||||
const int idx=int(c.m_nodes[j]-&m_nodes[0]);
|
||||
const btVector3& x=c.m_nodes[j]->m_x;
|
||||
const btScalar q=c.m_masses[j];
|
||||
deltas[idx] += (v+cross(w,x-c.m_com))*q;
|
||||
deltas[idx] += (v+btCross(w,x-c.m_com))*q;
|
||||
weights[idx] += q;
|
||||
}
|
||||
}
|
||||
@@ -2200,7 +2200,7 @@ void btSoftBody::dampClusters()
|
||||
Node& n=*c.m_nodes[j];
|
||||
if(n.m_im>0)
|
||||
{
|
||||
const btVector3 vx=c.m_lv+cross(c.m_av,c.m_nodes[j]->m_q-c.m_com);
|
||||
const btVector3 vx=c.m_lv+btCross(c.m_av,c.m_nodes[j]->m_q-c.m_com);
|
||||
if(vx.length2()<=n.m_v.length2())
|
||||
{
|
||||
n.m_v += c.m_ndamping*(vx-n.m_v);
|
||||
@@ -2269,8 +2269,8 @@ void btSoftBody::AJoint::Prepare(btScalar dt,int iterations)
|
||||
Joint::Prepare(dt,iterations);
|
||||
m_axis[0] = m_bodies[0].xform().getBasis()*m_refs[0];
|
||||
m_axis[1] = m_bodies[1].xform().getBasis()*m_refs[1];
|
||||
m_drift = NormalizeAny(cross(m_axis[1],m_axis[0]));
|
||||
m_drift *= btMin(maxdrift,btAcos(Clamp<btScalar>(dot(m_axis[0],m_axis[1]),-1,+1)));
|
||||
m_drift = NormalizeAny(btCross(m_axis[1],m_axis[0]));
|
||||
m_drift *= btMin(maxdrift,btAcos(Clamp<btScalar>(btDot(m_axis[0],m_axis[1]),-1,+1)));
|
||||
m_drift *= m_erp/dt;
|
||||
m_massmatrix= AngularImpulseMatrix(m_bodies[0].invWorldInertia(),m_bodies[1].invWorldInertia());
|
||||
if(m_split>0)
|
||||
@@ -2287,7 +2287,7 @@ void btSoftBody::AJoint::Solve(btScalar dt,btScalar sor)
|
||||
const btVector3 va=m_bodies[0].angularVelocity();
|
||||
const btVector3 vb=m_bodies[1].angularVelocity();
|
||||
const btVector3 vr=va-vb;
|
||||
const btScalar sp=dot(vr,m_axis[0]);
|
||||
const btScalar sp=btDot(vr,m_axis[0]);
|
||||
const btVector3 vc=vr-m_axis[0]*m_icontrol->Speed(this,sp);
|
||||
btSoftBody::Impulse impulse;
|
||||
impulse.m_asVelocity = 1;
|
||||
@@ -2334,7 +2334,7 @@ void btSoftBody::CJoint::Solve(btScalar dt,btScalar sor)
|
||||
const btVector3 va=m_bodies[0].velocity(m_rpos[0]);
|
||||
const btVector3 vb=m_bodies[1].velocity(m_rpos[1]);
|
||||
const btVector3 vrel=va-vb;
|
||||
const btScalar rvac=dot(vrel,m_normal);
|
||||
const btScalar rvac=btDot(vrel,m_normal);
|
||||
btSoftBody::Impulse impulse;
|
||||
impulse.m_asVelocity = 1;
|
||||
impulse.m_velocity = m_drift;
|
||||
@@ -2417,9 +2417,9 @@ void btSoftBody::applyForces()
|
||||
case btSoftBody::eAeroModel::V_Point:
|
||||
nrm=NormalizeAny(rel_v);break;
|
||||
case btSoftBody::eAeroModel::V_TwoSided:
|
||||
nrm*=(btScalar)(dot(nrm,rel_v)<0?-1:+1);break;
|
||||
nrm*=(btScalar)(btDot(nrm,rel_v)<0?-1:+1);break;
|
||||
}
|
||||
const btScalar dvn=dot(rel_v,nrm);
|
||||
const btScalar dvn=btDot(rel_v,nrm);
|
||||
/* Compute forces */
|
||||
if(dvn>0)
|
||||
{
|
||||
@@ -2463,9 +2463,9 @@ void btSoftBody::applyForces()
|
||||
switch(m_cfg.aeromodel)
|
||||
{
|
||||
case btSoftBody::eAeroModel::F_TwoSided:
|
||||
nrm*=(btScalar)(dot(nrm,rel_v)<0?-1:+1);break;
|
||||
nrm*=(btScalar)(btDot(nrm,rel_v)<0?-1:+1);break;
|
||||
}
|
||||
const btScalar dvn=dot(rel_v,nrm);
|
||||
const btScalar dvn=btDot(rel_v,nrm);
|
||||
/* Compute forces */
|
||||
if(dvn>0)
|
||||
{
|
||||
@@ -2516,10 +2516,10 @@ void btSoftBody::PSolve_RContacts(btSoftBody* psb,btScalar kst,btScalar ti)
|
||||
const btVector3 va=tmpRigid ? tmpRigid->getVelocityInLocalPoint(c.m_c1)*dt : btVector3(0,0,0);
|
||||
const btVector3 vb=c.m_node->m_x-c.m_node->m_q;
|
||||
const btVector3 vr=vb-va;
|
||||
const btScalar dn=dot(vr,cti.m_normal);
|
||||
const btScalar dn=btDot(vr,cti.m_normal);
|
||||
if(dn<=SIMD_EPSILON)
|
||||
{
|
||||
const btScalar dp=btMin(dot(c.m_node->m_x,cti.m_normal)+cti.m_offset,mrg);
|
||||
const btScalar dp=btMin(btDot(c.m_node->m_x,cti.m_normal)+cti.m_offset,mrg);
|
||||
const btVector3 fv=vr-cti.m_normal*dn;
|
||||
const btVector3 impulse=c.m_c0*((vr-fv*c.m_c3+cti.m_normal*(dp*c.m_c4))*kst);
|
||||
c.m_node->m_x-=impulse*c.m_c2;
|
||||
@@ -2548,9 +2548,9 @@ void btSoftBody::PSolve_SContacts(btSoftBody* psb,btScalar,btScalar ti)
|
||||
c.m_weights);
|
||||
const btVector3 vr=(n.m_x-n.m_q)-(p-q);
|
||||
btVector3 corr(0,0,0);
|
||||
if(dot(vr,nr)<0)
|
||||
if(btDot(vr,nr)<0)
|
||||
{
|
||||
const btScalar j=c.m_margin-(dot(nr,n.m_x)-dot(nr,p));
|
||||
const btScalar j=c.m_margin-(btDot(nr,n.m_x)-btDot(nr,p));
|
||||
corr+=c.m_normal*j;
|
||||
}
|
||||
corr -= ProjectOnPlane(vr,nr)*c.m_friction;
|
||||
@@ -2588,7 +2588,7 @@ void btSoftBody::VSolve_Links(btSoftBody* psb,btScalar kst)
|
||||
{
|
||||
Link& l=psb->m_links[i];
|
||||
Node** n=l.m_n;
|
||||
const btScalar j=-dot(l.m_c3,n[0]->m_v-n[1]->m_v)*l.m_c2*kst;
|
||||
const btScalar j=-btDot(l.m_c3,n[0]->m_v-n[1]->m_v)*l.m_c2*kst;
|
||||
n[0]->m_v+= l.m_c3*(j*n[0]->m_im);
|
||||
n[1]->m_v-= l.m_c3*(j*n[1]->m_im);
|
||||
}
|
||||
|
||||
@@ -370,8 +370,8 @@ public:
|
||||
}
|
||||
btVector3 angularVelocity(const btVector3& rpos) const
|
||||
{
|
||||
if(m_rigid) return(cross(m_rigid->getAngularVelocity(),rpos));
|
||||
if(m_soft) return(cross(m_soft->m_av,rpos));
|
||||
if(m_rigid) return(btCross(m_rigid->getAngularVelocity(),rpos));
|
||||
if(m_soft) return(btCross(m_soft->m_av,rpos));
|
||||
return(btVector3(0,0,0));
|
||||
}
|
||||
btVector3 angularVelocity() const
|
||||
|
||||
@@ -130,7 +130,7 @@ static inline btScalar tetravolume(const btVector3& x0,
|
||||
const btVector3 a=x1-x0;
|
||||
const btVector3 b=x2-x0;
|
||||
const btVector3 c=x3-x0;
|
||||
return(dot(a,cross(b,c)));
|
||||
return(btDot(a,btCross(b,c)));
|
||||
}
|
||||
|
||||
//
|
||||
@@ -209,9 +209,9 @@ void btSoftBodyHelpers::Draw( btSoftBody* psb,
|
||||
{
|
||||
const btSoftBody::RContact& c=psb->m_rcontacts[i];
|
||||
const btVector3 o= c.m_node->m_x-c.m_cti.m_normal*
|
||||
(dot(c.m_node->m_x,c.m_cti.m_normal)+c.m_cti.m_offset);
|
||||
const btVector3 x=cross(c.m_cti.m_normal,axis[c.m_cti.m_normal.minAxis()]).normalized();
|
||||
const btVector3 y=cross(x,c.m_cti.m_normal).normalized();
|
||||
(btDot(c.m_node->m_x,c.m_cti.m_normal)+c.m_cti.m_offset);
|
||||
const btVector3 x=btCross(c.m_cti.m_normal,axis[c.m_cti.m_normal.minAxis()]).normalized();
|
||||
const btVector3 y=btCross(x,c.m_cti.m_normal).normalized();
|
||||
idraw->drawLine(o-x*nscl,o+x*nscl,ccolor);
|
||||
idraw->drawLine(o-y*nscl,o+y*nscl,ccolor);
|
||||
idraw->drawLine(o,o+c.m_cti.m_normal*nscl*3,btVector3(1,1,0));
|
||||
@@ -299,7 +299,7 @@ void btSoftBodyHelpers::Draw( btSoftBody* psb,
|
||||
{
|
||||
const btSoftBody::Cluster& c=psb->m_clusters[i];
|
||||
const btVector3 r=c.m_nodes[j]->m_x-c.m_com;
|
||||
const btVector3 v=c.m_lv+cross(c.m_av,r);
|
||||
const btVector3 v=c.m_lv+btCross(c.m_av,r);
|
||||
idraw->drawLine(c.m_nodes[j]->m_x,c.m_nodes[j]->m_x+v,btVector3(1,0,0));
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -124,11 +124,11 @@ public:
|
||||
virtual btVector3 localGetSupportingVertex(const btVector3& vec) const
|
||||
{
|
||||
btSoftBody::Node* const * n=&m_cluster->m_nodes[0];
|
||||
btScalar d=dot(vec,n[0]->m_x);
|
||||
btScalar d=btDot(vec,n[0]->m_x);
|
||||
int j=0;
|
||||
for(int i=1,ni=m_cluster->m_nodes.size();i<ni;++i)
|
||||
{
|
||||
const btScalar k=dot(vec,n[i]->m_x);
|
||||
const btScalar k=btDot(vec,n[i]->m_x);
|
||||
if(k>d) { d=k;j=i; }
|
||||
}
|
||||
return(n[j]->m_x);
|
||||
@@ -296,9 +296,9 @@ static inline btMatrix3x3 Mul(const btMatrix3x3& a,
|
||||
//
|
||||
static inline void Orthogonalize(btMatrix3x3& m)
|
||||
{
|
||||
m[2]=cross(m[0],m[1]).normalized();
|
||||
m[1]=cross(m[2],m[0]).normalized();
|
||||
m[0]=cross(m[1],m[2]).normalized();
|
||||
m[2]=btCross(m[0],m[1]).normalized();
|
||||
m[1]=btCross(m[2],m[0]).normalized();
|
||||
m[0]=btCross(m[1],m[2]).normalized();
|
||||
}
|
||||
//
|
||||
static inline btMatrix3x3 MassMatrix(btScalar im,const btMatrix3x3& iwi,const btVector3& r)
|
||||
@@ -335,7 +335,7 @@ static inline btMatrix3x3 AngularImpulseMatrix( const btMatrix3x3& iia,
|
||||
static inline btVector3 ProjectOnAxis( const btVector3& v,
|
||||
const btVector3& a)
|
||||
{
|
||||
return(a*dot(v,a));
|
||||
return(a*btDot(v,a));
|
||||
}
|
||||
//
|
||||
static inline btVector3 ProjectOnPlane( const btVector3& v,
|
||||
@@ -354,7 +354,7 @@ static inline void ProjectOrigin( const btVector3& a,
|
||||
const btScalar m2=d.length2();
|
||||
if(m2>SIMD_EPSILON)
|
||||
{
|
||||
const btScalar t=Clamp<btScalar>(-dot(a,d)/m2,0,1);
|
||||
const btScalar t=Clamp<btScalar>(-btDot(a,d)/m2,0,1);
|
||||
const btVector3 p=a+d*t;
|
||||
const btScalar l2=p.length2();
|
||||
if(l2<sqd)
|
||||
@@ -371,19 +371,19 @@ static inline void ProjectOrigin( const btVector3& a,
|
||||
btVector3& prj,
|
||||
btScalar& sqd)
|
||||
{
|
||||
const btVector3& q=cross(b-a,c-a);
|
||||
const btVector3& q=btCross(b-a,c-a);
|
||||
const btScalar m2=q.length2();
|
||||
if(m2>SIMD_EPSILON)
|
||||
{
|
||||
const btVector3 n=q/btSqrt(m2);
|
||||
const btScalar k=dot(a,n);
|
||||
const btScalar k=btDot(a,n);
|
||||
const btScalar k2=k*k;
|
||||
if(k2<sqd)
|
||||
{
|
||||
const btVector3 p=n*k;
|
||||
if( (dot(cross(a-p,b-p),q)>0)&&
|
||||
(dot(cross(b-p,c-p),q)>0)&&
|
||||
(dot(cross(c-p,a-p),q)>0))
|
||||
if( (btDot(btCross(a-p,b-p),q)>0)&&
|
||||
(btDot(btCross(b-p,c-p),q)>0)&&
|
||||
(btDot(btCross(c-p,a-p),q)>0))
|
||||
{
|
||||
prj=p;
|
||||
sqd=k2;
|
||||
@@ -413,9 +413,9 @@ static inline btVector3 BaryCoord( const btVector3& a,
|
||||
const btVector3& c,
|
||||
const btVector3& p)
|
||||
{
|
||||
const btScalar w[]={ cross(a-p,b-p).length(),
|
||||
cross(b-p,c-p).length(),
|
||||
cross(c-p,a-p).length()};
|
||||
const btScalar w[]={ btCross(a-p,b-p).length(),
|
||||
btCross(b-p,c-p).length(),
|
||||
btCross(c-p,a-p).length()};
|
||||
const btScalar isum=1/(w[0]+w[1]+w[2]);
|
||||
return(btVector3(w[1]*isum,w[2]*isum,w[0]*isum));
|
||||
}
|
||||
@@ -485,7 +485,7 @@ static inline btScalar AreaOf( const btVector3& x0,
|
||||
{
|
||||
const btVector3 a=x1-x0;
|
||||
const btVector3 b=x2-x0;
|
||||
const btVector3 cr=cross(a,b);
|
||||
const btVector3 cr=btCross(a,b);
|
||||
const btScalar area=cr.length();
|
||||
return(area);
|
||||
}
|
||||
@@ -499,7 +499,7 @@ static inline btScalar VolumeOf( const btVector3& x0,
|
||||
const btVector3 a=x1-x0;
|
||||
const btVector3 b=x2-x0;
|
||||
const btVector3 c=x3-x0;
|
||||
return(dot(a,cross(b,c)));
|
||||
return(btDot(a,btCross(b,c)));
|
||||
}
|
||||
|
||||
//
|
||||
@@ -512,7 +512,7 @@ static void EvaluateMedium( const btSoftBodyWorldInfo* wfi,
|
||||
medium.m_density = wfi->air_density;
|
||||
if(wfi->water_density>0)
|
||||
{
|
||||
const btScalar depth=-(dot(x,wfi->water_normal)+wfi->water_offset);
|
||||
const btScalar depth=-(btDot(x,wfi->water_normal)+wfi->water_offset);
|
||||
if(depth>0)
|
||||
{
|
||||
medium.m_density = wfi->water_density;
|
||||
@@ -676,7 +676,7 @@ struct btSoftColliders
|
||||
const btVector3 va=ba.velocity(ra);
|
||||
const btVector3 vb=bb.velocity(rb);
|
||||
const btVector3 vrel=va-vb;
|
||||
const btScalar rvac=dot(vrel,res.normal);
|
||||
const btScalar rvac=btDot(vrel,res.normal);
|
||||
const btScalar depth=res.distance-margin;
|
||||
const btVector3 iv=res.normal*rvac;
|
||||
const btVector3 fv=vrel-iv;
|
||||
@@ -839,7 +839,7 @@ struct btSoftColliders
|
||||
const btVector3 va=m_rigidBody ? m_rigidBody->getVelocityInLocalPoint(ra)*psb->m_sst.sdt : btVector3(0,0,0);
|
||||
const btVector3 vb=n.m_x-n.m_q;
|
||||
const btVector3 vr=vb-va;
|
||||
const btScalar dn=dot(vr,c.m_cti.m_normal);
|
||||
const btScalar dn=btDot(vr,c.m_cti.m_normal);
|
||||
const btVector3 fv=vr-c.m_cti.m_normal*dn;
|
||||
const btScalar fc=psb->m_cfg.kDF*m_colObj1->getFriction();
|
||||
c.m_node = &n;
|
||||
|
||||
Reference in New Issue
Block a user