Fix btSoftBody so it compiles with older compilers, such as MSVC 6.0

Add support for angularFactor for applyForce, see http://code.google.com/p/bullet/issues/detail?id=59&can=1
This commit is contained in:
erwin.coumans
2008-07-22 15:00:25 +00:00
parent d71f8d6623
commit 3483e2dfc8
5 changed files with 199 additions and 129 deletions

View File

@@ -237,7 +237,7 @@ public:
void applyForce(const btVector3& force, const btVector3& rel_pos) void applyForce(const btVector3& force, const btVector3& rel_pos)
{ {
applyCentralForce(force); applyCentralForce(force);
applyTorque(rel_pos.cross(force)); applyTorque(rel_pos.cross(force)*m_angularFactor);
} }
void applyCentralImpulse(const btVector3& impulse) void applyCentralImpulse(const btVector3& impulse)

View File

@@ -95,8 +95,12 @@ btSoftBody::~btSoftBody()
{ {
//for now, delete the internal shape //for now, delete the internal shape
delete m_collisionShape; delete m_collisionShape;
for(int i=0;i<m_materials.size();++i) btAlignedFree(m_materials[i]); int i;
for(int i=0;i<m_joints.size();++i) btAlignedFree(m_joints[i]);
for(i=0;i<m_materials.size();++i)
btAlignedFree(m_materials[i]);
for(i=0;i<m_joints.size();++i)
btAlignedFree(m_joints[i]);
} }
// //
@@ -416,13 +420,16 @@ btScalar btSoftBody::getTotalMass() const
// //
void btSoftBody::setTotalMass(btScalar mass,bool fromfaces) void btSoftBody::setTotalMass(btScalar mass,bool fromfaces)
{ {
int i;
if(fromfaces) if(fromfaces)
{ {
for(int i=0;i<m_nodes.size();++i)
for(i=0;i<m_nodes.size();++i)
{ {
m_nodes[i].m_im=0; m_nodes[i].m_im=0;
} }
for(int i=0;i<m_faces.size();++i) for(i=0;i<m_faces.size();++i)
{ {
const Face& f=m_faces[i]; const Face& f=m_faces[i];
const btScalar twicearea=AreaOf( f.m_n[0]->m_x, const btScalar twicearea=AreaOf( f.m_n[0]->m_x,
@@ -433,14 +440,14 @@ void btSoftBody::setTotalMass(btScalar mass,bool fromfaces)
f.m_n[j]->m_im+=twicearea; f.m_n[j]->m_im+=twicearea;
} }
} }
for(int i=0;i<m_nodes.size();++i) for( i=0;i<m_nodes.size();++i)
{ {
m_nodes[i].m_im=1/m_nodes[i].m_im; m_nodes[i].m_im=1/m_nodes[i].m_im;
} }
} }
const btScalar tm=getTotalMass(); const btScalar tm=getTotalMass();
const btScalar itm=1/tm; const btScalar itm=1/tm;
for(int i=0;i<m_nodes.size();++i) for( i=0;i<m_nodes.size();++i)
{ {
m_nodes[i].m_im/=itm*mass; m_nodes[i].m_im/=itm*mass;
} }
@@ -509,16 +516,18 @@ void btSoftBody::setPose(bool bvolume,bool bframe)
{ {
m_pose.m_bvolume = bvolume; m_pose.m_bvolume = bvolume;
m_pose.m_bframe = bframe; m_pose.m_bframe = bframe;
int i,ni;
/* Weights */ /* Weights */
const btScalar omass=getTotalMass(); const btScalar omass=getTotalMass();
const btScalar kmass=omass*m_nodes.size()*1000; const btScalar kmass=omass*m_nodes.size()*1000;
btScalar tmass=omass; btScalar tmass=omass;
m_pose.m_wgh.resize(m_nodes.size()); m_pose.m_wgh.resize(m_nodes.size());
for(int i=0,ni=m_nodes.size();i<ni;++i) for(i=0,ni=m_nodes.size();i<ni;++i)
{ {
if(m_nodes[i].m_im<=0) tmass+=kmass; if(m_nodes[i].m_im<=0) tmass+=kmass;
} }
for(int i=0,ni=m_nodes.size();i<ni;++i) for( i=0,ni=m_nodes.size();i<ni;++i)
{ {
Node& n=m_nodes[i]; Node& n=m_nodes[i];
m_pose.m_wgh[i]= n.m_im>0 ? m_pose.m_wgh[i]= n.m_im>0 ?
@@ -528,7 +537,7 @@ void btSoftBody::setPose(bool bvolume,bool bframe)
/* Pos */ /* Pos */
const btVector3 com=evaluateCom(); const btVector3 com=evaluateCom();
m_pose.m_pos.resize(m_nodes.size()); m_pose.m_pos.resize(m_nodes.size());
for(int i=0,ni=m_nodes.size();i<ni;++i) for( i=0,ni=m_nodes.size();i<ni;++i)
{ {
m_pose.m_pos[i]=m_nodes[i].m_x-com; m_pose.m_pos[i]=m_nodes[i].m_x-com;
} }
@@ -540,7 +549,7 @@ void btSoftBody::setPose(bool bvolume,bool bframe)
m_pose.m_aqq[0] = m_pose.m_aqq[0] =
m_pose.m_aqq[1] = m_pose.m_aqq[1] =
m_pose.m_aqq[2] = btVector3(0,0,0); m_pose.m_aqq[2] = btVector3(0,0,0);
for(int i=0,ni=m_nodes.size();i<ni;++i) for( i=0,ni=m_nodes.size();i<ni;++i)
{ {
const btVector3& q=m_pose.m_pos[i]; const btVector3& q=m_pose.m_pos[i];
const btVector3 mq=m_pose.m_wgh[i]*q; const btVector3 mq=m_pose.m_wgh[i]*q;
@@ -558,8 +567,10 @@ btScalar btSoftBody::getVolume() const
btScalar vol=0; btScalar vol=0;
if(m_nodes.size()>0) if(m_nodes.size()>0)
{ {
int i,ni;
const btVector3 org=m_nodes[0].m_x; const btVector3 org=m_nodes[0].m_x;
for(int i=0,ni=m_faces.size();i<ni;++i) for(i=0,ni=m_faces.size();i<ni;++i)
{ {
const Face& f=m_faces[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+=dot(f.m_n[0]->m_x-org,cross(f.m_n[1]->m_x-org,f.m_n[2]->m_x-org));
@@ -658,6 +669,8 @@ cluster->m_ndimpulses++;
// //
int btSoftBody::generateBendingConstraints(int distance,Material* mat) int btSoftBody::generateBendingConstraints(int distance,Material* mat)
{ {
int i,j;
if(distance>1) if(distance>1)
{ {
/* Build graph */ /* Build graph */
@@ -665,16 +678,16 @@ int btSoftBody::generateBendingConstraints(int distance,Material* mat)
const unsigned inf=(~(unsigned)0)>>1; const unsigned inf=(~(unsigned)0)>>1;
unsigned* adj=new unsigned[n*n]; unsigned* adj=new unsigned[n*n];
#define IDX(_x_,_y_) ((_y_)*n+(_x_)) #define IDX(_x_,_y_) ((_y_)*n+(_x_))
for(int j=0;j<n;++j) for(j=0;j<n;++j)
{ {
for(int i=0;i<n;++i) for(i=0;i<n;++i)
{ {
if(i!=j) adj[IDX(i,j)]=adj[IDX(j,i)]=inf; if(i!=j) adj[IDX(i,j)]=adj[IDX(j,i)]=inf;
else else
adj[IDX(i,j)]=adj[IDX(j,i)]=0; adj[IDX(i,j)]=adj[IDX(j,i)]=0;
} }
} }
for(int i=0;i<m_links.size();++i) for( i=0;i<m_links.size();++i)
{ {
const int ia=(int)(m_links[i].m_n[0]-&m_nodes[0]); const int ia=(int)(m_links[i].m_n[0]-&m_nodes[0]);
const int ib=(int)(m_links[i].m_n[1]-&m_nodes[0]); const int ib=(int)(m_links[i].m_n[1]-&m_nodes[0]);
@@ -683,9 +696,9 @@ int btSoftBody::generateBendingConstraints(int distance,Material* mat)
} }
for(int k=0;k<n;++k) for(int k=0;k<n;++k)
{ {
for(int j=0;j<n;++j) for(j=0;j<n;++j)
{ {
for(int i=j+1;i<n;++i) for(i=j+1;i<n;++i)
{ {
const unsigned sum=adj[IDX(i,k)]+adj[IDX(k,j)]; const unsigned sum=adj[IDX(i,k)]+adj[IDX(k,j)];
if(adj[IDX(i,j)]>sum) if(adj[IDX(i,j)]>sum)
@@ -697,9 +710,9 @@ int btSoftBody::generateBendingConstraints(int distance,Material* mat)
} }
/* Build links */ /* Build links */
int nlinks=0; int nlinks=0;
for(int j=0;j<n;++j) for(j=0;j<n;++j)
{ {
for(int i=j+1;i<n;++i) for(i=j+1;i<n;++i)
{ {
if(adj[IDX(i,j)]==(unsigned)distance) if(adj[IDX(i,j)]==(unsigned)distance)
{ {
@@ -720,11 +733,13 @@ void btSoftBody::randomizeConstraints()
{ {
unsigned long seed=243703; unsigned long seed=243703;
#define NEXTRAND (seed=(1664525L*seed+1013904223L)&0xffffffff) #define NEXTRAND (seed=(1664525L*seed+1013904223L)&0xffffffff)
for(int i=0,ni=m_links.size();i<ni;++i) int i,ni;
for(i=0,ni=m_links.size();i<ni;++i)
{ {
btSwap(m_links[i],m_links[NEXTRAND%ni]); btSwap(m_links[i],m_links[NEXTRAND%ni]);
} }
for(int i=0,ni=m_faces.size();i<ni;++i) for(i=0,ni=m_faces.size();i<ni;++i)
{ {
btSwap(m_faces[i],m_faces[NEXTRAND%ni]); btSwap(m_faces[i],m_faces[NEXTRAND%ni]);
} }
@@ -734,13 +749,18 @@ unsigned long seed=243703;
// //
int btSoftBody::generateClusters(int k,int maxiterations) int btSoftBody::generateClusters(int k,int maxiterations)
{ {
for(int i=0;i<m_clusters.size();++i) int i;
for(i=0;i<m_clusters.size();++i)
{ {
if(m_clusters[i]->m_leaf) m_cdbvt.remove(m_clusters[i]->m_leaf); if(m_clusters[i]->m_leaf) m_cdbvt.remove(m_clusters[i]->m_leaf);
btAlignedFree(m_clusters[i]); btAlignedFree(m_clusters[i]);
} }
m_clusters.resize(btMin(k,m_nodes.size())); m_clusters.resize(btMin(k,m_nodes.size()));
for(int i=0;i<m_clusters.size();++i)
for(i=0;i<m_clusters.size();++i)
{ {
m_clusters[i] = new(btAlignedAlloc(sizeof(Cluster),16)) Cluster(); m_clusters[i] = new(btAlignedAlloc(sizeof(Cluster),16)) Cluster();
m_clusters[i]->m_collide= true; m_clusters[i]->m_collide= true;
@@ -765,8 +785,10 @@ if(k>0)
do { do {
const btScalar w=2-btMin<btScalar>(1,iterations/slope); const btScalar w=2-btMin<btScalar>(1,iterations/slope);
changed=false; changed=false;
iterations++; iterations++;
for(int i=0;i<k;++i) int i;
for(i=0;i<k;++i)
{ {
btVector3 c(0,0,0); btVector3 c(0,0,0);
for(int j=0;j<m_clusters[i]->m_nodes.size();++j) for(int j=0;j<m_clusters[i]->m_nodes.size();++j)
@@ -777,12 +799,12 @@ if(k>0)
{ {
c /= (btScalar)m_clusters[i]->m_nodes.size(); c /= (btScalar)m_clusters[i]->m_nodes.size();
c = centers[i]+(c-centers[i])*w; c = centers[i]+(c-centers[i])*w;
changed |= (c-centers[i]).length2()>SIMD_EPSILON; changed |= ((c-centers[i]).length2()>SIMD_EPSILON);
centers[i] = c; centers[i] = c;
m_clusters[i]->m_nodes.resize(0); m_clusters[i]->m_nodes.resize(0);
} }
} }
for(int i=0;i<m_nodes.size();++i) for(i=0;i<m_nodes.size();++i)
{ {
const btVector3 nx=m_nodes[i].m_x; const btVector3 nx=m_nodes[i].m_x;
int kbest=0; int kbest=0;
@@ -802,14 +824,14 @@ if(k>0)
/* Merge */ /* Merge */
btAlignedObjectArray<int> cids; btAlignedObjectArray<int> cids;
cids.resize(m_nodes.size(),-1); cids.resize(m_nodes.size(),-1);
for(int i=0;i<m_clusters.size();++i) for( i=0;i<m_clusters.size();++i)
{ {
for(int j=0;j<m_clusters[i]->m_nodes.size();++j) for(int j=0;j<m_clusters[i]->m_nodes.size();++j)
{ {
cids[int(m_clusters[i]->m_nodes[j]-&m_nodes[0])]=i; cids[int(m_clusters[i]->m_nodes[j]-&m_nodes[0])]=i;
} }
} }
for(int i=0;i<m_faces.size();++i) for(i=0;i<m_faces.size();++i)
{ {
const int idx[]={ int(m_faces[i].m_n[0]-&m_nodes[0]), const int idx[]={ int(m_faces[i].m_n[0]-&m_nodes[0]),
int(m_faces[i].m_n[1]-&m_nodes[0]), int(m_faces[i].m_n[1]-&m_nodes[0]),
@@ -841,7 +863,7 @@ if(k>0)
btSwap(m_clusters[0],m_clusters[m_clusters.size()-1]); btSwap(m_clusters[0],m_clusters[m_clusters.size()-1]);
} }
/* Terminate */ /* Terminate */
for(int i=0;i<m_clusters.size();++i) for(i=0;i<m_clusters.size();++i)
{ {
if(m_clusters[i]->m_nodes.size()==0) if(m_clusters[i]->m_nodes.size()==0)
{ {
@@ -862,12 +884,14 @@ return(0);
// //
void btSoftBody::refine(ImplicitFn* ifn,btScalar accurary,bool cut) void btSoftBody::refine(ImplicitFn* ifn,btScalar accurary,bool cut)
{ {
const Node* nbase(&m_nodes[0]); const Node* nbase = &m_nodes[0];
int ncount(m_nodes.size()); int ncount = m_nodes.size();
btSymMatrix<int> edges(ncount,-2); btSymMatrix<int> edges(ncount,-2);
int newnodes=0; int newnodes=0;
int i,j,k,ni;
/* Filter out */ /* Filter out */
for(int i=0;i<m_links.size();++i) for(i=0;i<m_links.size();++i)
{ {
Link& l=m_links[i]; Link& l=m_links[i];
if(l.m_bbending) if(l.m_bbending)
@@ -880,12 +904,12 @@ for(int i=0;i<m_links.size();++i)
} }
} }
/* Fill edges */ /* Fill edges */
for(int i=0;i<m_links.size();++i) for(i=0;i<m_links.size();++i)
{ {
Link& l=m_links[i]; Link& l=m_links[i];
edges(int(l.m_n[0]-nbase),int(l.m_n[1]-nbase))=-1; edges(int(l.m_n[0]-nbase),int(l.m_n[1]-nbase))=-1;
} }
for(int i=0;i<m_faces.size();++i) for(i=0;i<m_faces.size();++i)
{ {
Face& f=m_faces[i]; Face& f=m_faces[i];
edges(int(f.m_n[0]-nbase),int(f.m_n[1]-nbase))=-1; edges(int(f.m_n[0]-nbase),int(f.m_n[1]-nbase))=-1;
@@ -893,9 +917,9 @@ for(int i=0;i<m_faces.size();++i)
edges(int(f.m_n[2]-nbase),int(f.m_n[0]-nbase))=-1; edges(int(f.m_n[2]-nbase),int(f.m_n[0]-nbase))=-1;
} }
/* Intersect */ /* Intersect */
for(int i=0;i<ncount;++i) for(i=0;i<ncount;++i)
{ {
for(int j=i+1;j<ncount;++j) for(j=i+1;j<ncount;++j)
{ {
if(edges(i,j)==-1) if(edges(i,j)==-1)
{ {
@@ -939,7 +963,7 @@ for(int i=0;i<ncount;++i)
} }
nbase=&m_nodes[0]; nbase=&m_nodes[0];
/* Refine links */ /* Refine links */
for(int i=0,ni=m_links.size();i<ni;++i) for(i=0,ni=m_links.size();i<ni;++i)
{ {
Link& feat=m_links[i]; Link& feat=m_links[i];
const int idx[]={ int(feat.m_n[0]-nbase), const int idx[]={ int(feat.m_n[0]-nbase),
@@ -960,13 +984,13 @@ for(int i=0,ni=m_links.size();i<ni;++i)
} }
} }
/* Refine faces */ /* Refine faces */
for(int i=0;i<m_faces.size();++i) for(i=0;i<m_faces.size();++i)
{ {
const Face& feat=m_faces[i]; const Face& feat=m_faces[i];
const int idx[]={ int(feat.m_n[0]-nbase), const int idx[]={ int(feat.m_n[0]-nbase),
int(feat.m_n[1]-nbase), int(feat.m_n[1]-nbase),
int(feat.m_n[2]-nbase)}; int(feat.m_n[2]-nbase)};
for(int j=2,k=0;k<3;j=k++) for(j=2,k=0;k<3;j=k++)
{ {
if((idx[j]<ncount)&&(idx[k]<ncount)) if((idx[j]<ncount)&&(idx[k]<ncount))
{ {
@@ -1012,7 +1036,7 @@ if(cut)
} }
nbase=&m_nodes[0]; nbase=&m_nodes[0];
/* Links */ /* Links */
for(int i=0,ni=m_links.size();i<ni;++i) for(i=0,ni=m_links.size();i<ni;++i)
{ {
const int id[]={ int(m_links[i].m_n[0]-nbase), const int id[]={ int(m_links[i].m_n[0]-nbase),
int(m_links[i].m_n[1]-nbase)}; int(m_links[i].m_n[1]-nbase)};
@@ -1039,7 +1063,7 @@ if(cut)
} }
} }
/* Faces */ /* Faces */
for(int i=0,ni=m_faces.size();i<ni;++i) for(i=0,ni=m_faces.size();i<ni;++i)
{ {
Node** n= m_faces[i].m_n; Node** n= m_faces[i].m_n;
if( (ifn->Eval(n[0]->m_x)<accurary)&& if( (ifn->Eval(n[0]->m_x)<accurary)&&
@@ -1058,15 +1082,15 @@ if(cut)
btAlignedObjectArray<int> ranks; btAlignedObjectArray<int> ranks;
btAlignedObjectArray<int> todelete; btAlignedObjectArray<int> todelete;
ranks.resize(nnodes,0); ranks.resize(nnodes,0);
for(int i=0,ni=m_links.size();i<ni;++i) for(i=0,ni=m_links.size();i<ni;++i)
{ {
for(int j=0;j<2;++j) ranks[int(m_links[i].m_n[j]-nbase)]++; for(int j=0;j<2;++j) ranks[int(m_links[i].m_n[j]-nbase)]++;
} }
for(int i=0,ni=m_faces.size();i<ni;++i) for(i=0,ni=m_faces.size();i<ni;++i)
{ {
for(int j=0;j<3;++j) ranks[int(m_faces[i].m_n[j]-nbase)]++; for(int j=0;j<3;++j) ranks[int(m_faces[i].m_n[j]-nbase)]++;
} }
for(int i=0;i<m_links.size();++i) for(i=0;i<m_links.size();++i)
{ {
const int id[]={ int(m_links[i].m_n[0]-nbase), const int id[]={ int(m_links[i].m_n[0]-nbase),
int(m_links[i].m_n[1]-nbase)}; int(m_links[i].m_n[1]-nbase)};
@@ -1081,7 +1105,7 @@ if(cut)
} }
} }
#if 0 #if 0
for(int i=nnodes-1;i>=0;--i) for(i=nnodes-1;i>=0;--i)
{ {
if(!ranks[i]) todelete.push_back(i); if(!ranks[i]) todelete.push_back(i);
} }
@@ -1117,6 +1141,7 @@ return(cutLink(int(node0-&m_nodes[0]),int(node1-&m_nodes[0]),position));
bool btSoftBody::cutLink(int node0,int node1,btScalar position) bool btSoftBody::cutLink(int node0,int node1,btScalar position)
{ {
bool done=false; bool done=false;
int i,ni;
const btVector3 d=m_nodes[node0].m_x-m_nodes[node1].m_x; const btVector3 d=m_nodes[node0].m_x-m_nodes[node1].m_x;
const btVector3 x=Lerp(m_nodes[node0].m_x,m_nodes[node1].m_x,position); const btVector3 x=Lerp(m_nodes[node0].m_x,m_nodes[node1].m_x,position);
const btVector3 v=Lerp(m_nodes[node0].m_v,m_nodes[node1].m_v,position); const btVector3 v=Lerp(m_nodes[node0].m_v,m_nodes[node1].m_v,position);
@@ -1129,7 +1154,7 @@ Node* pn[2]={ &m_nodes[m_nodes.size()-2],
&m_nodes[m_nodes.size()-1]}; &m_nodes[m_nodes.size()-1]};
pn[0]->m_v=v; pn[0]->m_v=v;
pn[1]->m_v=v; pn[1]->m_v=v;
for(int i=0,ni=m_links.size();i<ni;++i) for(i=0,ni=m_links.size();i<ni;++i)
{ {
const int mtch=MatchEdge(m_links[i].m_n[0],m_links[i].m_n[1],pa,pb); const int mtch=MatchEdge(m_links[i].m_n[0],m_links[i].m_n[1],pa,pb);
if(mtch!=-1) if(mtch!=-1)
@@ -1141,7 +1166,7 @@ for(int i=0,ni=m_links.size();i<ni;++i)
done=true; done=true;
} }
} }
for(int i=0,ni=m_faces.size();i<ni;++i) for(i=0,ni=m_faces.size();i<ni;++i)
{ {
for(int k=2,l=0;l<3;k=l++) for(int k=2,l=0;l<3;k=l++)
{ {
@@ -1210,6 +1235,8 @@ switch(preset)
// //
void btSoftBody::predictMotion(btScalar dt) void btSoftBody::predictMotion(btScalar dt)
{ {
int i,ni;
/* Update */ /* Update */
if(m_bUpdateRtCst) if(m_bUpdateRtCst)
{ {
@@ -1232,7 +1259,7 @@ void btSoftBody::predictMotion(btScalar dt)
addVelocity(m_worldInfo->m_gravity*m_sst.sdt); addVelocity(m_worldInfo->m_gravity*m_sst.sdt);
applyForces(); applyForces();
/* Integrate */ /* Integrate */
for(int i=0,ni=m_nodes.size();i<ni;++i) for(i=0,ni=m_nodes.size();i<ni;++i)
{ {
Node& n=m_nodes[i]; Node& n=m_nodes[i];
n.m_q = n.m_x; n.m_q = n.m_x;
@@ -1245,7 +1272,7 @@ void btSoftBody::predictMotion(btScalar dt)
/* Bounds */ /* Bounds */
updateBounds(); updateBounds();
/* Nodes */ /* Nodes */
for(int i=0,ni=m_nodes.size();i<ni;++i) for(i=0,ni=m_nodes.size();i<ni;++i)
{ {
Node& n=m_nodes[i]; Node& n=m_nodes[i];
m_ndbvt.update( n.m_leaf, m_ndbvt.update( n.m_leaf,
@@ -1299,14 +1326,17 @@ void btSoftBody::solveConstraints()
/* Apply clusters */ /* Apply clusters */
applyClusters(false); applyClusters(false);
/* Prepare links */ /* Prepare links */
for(int i=0,ni=m_links.size();i<ni;++i)
int i,ni;
for(i=0,ni=m_links.size();i<ni;++i)
{ {
Link& l=m_links[i]; Link& l=m_links[i];
l.m_c3 = l.m_n[1]->m_q-l.m_n[0]->m_q; l.m_c3 = l.m_n[1]->m_q-l.m_n[0]->m_q;
l.m_c2 = 1/(l.m_c3.length2()*l.m_c0); l.m_c2 = 1/(l.m_c3.length2()*l.m_c0);
} }
/* Prepare anchors */ /* Prepare anchors */
for(int i=0,ni=m_anchors.size();i<ni;++i) for(i=0,ni=m_anchors.size();i<ni;++i)
{ {
Anchor& a=m_anchors[i]; Anchor& a=m_anchors[i];
const btVector3 ra=a.m_body->getWorldTransform().getBasis()*a.m_local; const btVector3 ra=a.m_body->getWorldTransform().getBasis()*a.m_local;
@@ -1331,7 +1361,7 @@ if(m_cfg.viterations>0)
} }
} }
/* Update */ /* Update */
for(int i=0,ni=m_nodes.size();i<ni;++i) for(i=0,ni=m_nodes.size();i<ni;++i)
{ {
Node& n=m_nodes[i]; Node& n=m_nodes[i];
n.m_x = n.m_q+n.m_v*m_sst.sdt; n.m_x = n.m_q+n.m_v*m_sst.sdt;
@@ -1349,7 +1379,7 @@ if(m_cfg.piterations>0)
} }
} }
const btScalar vc=m_sst.isdt*(1-m_cfg.kDP); const btScalar vc=m_sst.isdt*(1-m_cfg.kDP);
for(int i=0,ni=m_nodes.size();i<ni;++i) for(i=0,ni=m_nodes.size();i<ni;++i)
{ {
Node& n=m_nodes[i]; Node& n=m_nodes[i];
n.m_v = (n.m_x-n.m_q)*vc; n.m_v = (n.m_x-n.m_q)*vc;
@@ -1360,7 +1390,7 @@ if(m_cfg.piterations>0)
if(m_cfg.diterations>0) if(m_cfg.diterations>0)
{ {
const btScalar vcf=m_cfg.kVCF*m_sst.isdt; const btScalar vcf=m_cfg.kVCF*m_sst.isdt;
for(int i=0,ni=m_nodes.size();i<ni;++i) for(i=0,ni=m_nodes.size();i<ni;++i)
{ {
Node& n=m_nodes[i]; Node& n=m_nodes[i];
n.m_q = n.m_x; n.m_q = n.m_x;
@@ -1406,15 +1436,17 @@ void btSoftBody::solveClusters(const btAlignedObjectArray<btSoftBody*>& bodies
{ {
const int nb=bodies.size(); const int nb=bodies.size();
int iterations=0; int iterations=0;
for(int i=0;i<nb;++i) int i;
for(i=0;i<nb;++i)
{ {
iterations=btMax(iterations,bodies[i]->m_cfg.citerations); iterations=btMax(iterations,bodies[i]->m_cfg.citerations);
} }
for(int i=0;i<nb;++i) for(i=0;i<nb;++i)
{ {
bodies[i]->prepareClusters(iterations); bodies[i]->prepareClusters(iterations);
} }
for(int i=0;i<iterations;++i) for(i=0;i<iterations;++i)
{ {
const btScalar sor=1; const btScalar sor=1;
for(int j=0;j<nb;++j) for(int j=0;j<nb;++j)
@@ -1422,7 +1454,7 @@ for(int i=0;i<iterations;++i)
bodies[j]->solveClusters(sor); bodies[j]->solveClusters(sor);
} }
} }
for(int i=0;i<nb;++i) for(i=0;i<nb;++i)
{ {
bodies[i]->cleanupClusters(); bodies[i]->cleanupClusters();
} }
@@ -1494,19 +1526,21 @@ void btSoftBody::pointersToIndices()
{ {
#define PTR2IDX(_p_,_b_) reinterpret_cast<btSoftBody::Node*>((_p_)-(_b_)) #define PTR2IDX(_p_,_b_) reinterpret_cast<btSoftBody::Node*>((_p_)-(_b_))
btSoftBody::Node* base=&m_nodes[0]; btSoftBody::Node* base=&m_nodes[0];
for(int i=0,ni=m_nodes.size();i<ni;++i) int i,ni;
for(i=0,ni=m_nodes.size();i<ni;++i)
{ {
if(m_nodes[i].m_leaf) if(m_nodes[i].m_leaf)
{ {
m_nodes[i].m_leaf->data=*(void**)&i; m_nodes[i].m_leaf->data=*(void**)&i;
} }
} }
for(int i=0,ni=m_links.size();i<ni;++i) for(i=0,ni=m_links.size();i<ni;++i)
{ {
m_links[i].m_n[0]=PTR2IDX(m_links[i].m_n[0],base); m_links[i].m_n[0]=PTR2IDX(m_links[i].m_n[0],base);
m_links[i].m_n[1]=PTR2IDX(m_links[i].m_n[1],base); m_links[i].m_n[1]=PTR2IDX(m_links[i].m_n[1],base);
} }
for(int i=0,ni=m_faces.size();i<ni;++i) for(i=0,ni=m_faces.size();i<ni;++i)
{ {
m_faces[i].m_n[0]=PTR2IDX(m_faces[i].m_n[0],base); m_faces[i].m_n[0]=PTR2IDX(m_faces[i].m_n[0],base);
m_faces[i].m_n[1]=PTR2IDX(m_faces[i].m_n[1],base); m_faces[i].m_n[1]=PTR2IDX(m_faces[i].m_n[1],base);
@@ -1516,11 +1550,11 @@ void btSoftBody::pointersToIndices()
m_faces[i].m_leaf->data=*(void**)&i; m_faces[i].m_leaf->data=*(void**)&i;
} }
} }
for(int i=0,ni=m_anchors.size();i<ni;++i) for(i=0,ni=m_anchors.size();i<ni;++i)
{ {
m_anchors[i].m_node=PTR2IDX(m_anchors[i].m_node,base); m_anchors[i].m_node=PTR2IDX(m_anchors[i].m_node,base);
} }
for(int i=0,ni=m_notes.size();i<ni;++i) for(i=0,ni=m_notes.size();i<ni;++i)
{ {
for(int j=0;j<m_notes[i].m_rank;++j) for(int j=0;j<m_notes[i].m_rank;++j)
{ {
@@ -1536,19 +1570,21 @@ void btSoftBody::indicesToPointers(const int* map)
#define IDX2PTR(_p_,_b_) map?(&(_b_)[map[(((char*)_p_)-(char*)0)]]): \ #define IDX2PTR(_p_,_b_) map?(&(_b_)[map[(((char*)_p_)-(char*)0)]]): \
(&(_b_)[(((char*)_p_)-(char*)0)]) (&(_b_)[(((char*)_p_)-(char*)0)])
btSoftBody::Node* base=&m_nodes[0]; btSoftBody::Node* base=&m_nodes[0];
for(int i=0,ni=m_nodes.size();i<ni;++i) int i,ni;
for(i=0,ni=m_nodes.size();i<ni;++i)
{ {
if(m_nodes[i].m_leaf) if(m_nodes[i].m_leaf)
{ {
m_nodes[i].m_leaf->data=&m_nodes[i]; m_nodes[i].m_leaf->data=&m_nodes[i];
} }
} }
for(int i=0,ni=m_links.size();i<ni;++i) for(i=0,ni=m_links.size();i<ni;++i)
{ {
m_links[i].m_n[0]=IDX2PTR(m_links[i].m_n[0],base); m_links[i].m_n[0]=IDX2PTR(m_links[i].m_n[0],base);
m_links[i].m_n[1]=IDX2PTR(m_links[i].m_n[1],base); m_links[i].m_n[1]=IDX2PTR(m_links[i].m_n[1],base);
} }
for(int i=0,ni=m_faces.size();i<ni;++i) for(i=0,ni=m_faces.size();i<ni;++i)
{ {
m_faces[i].m_n[0]=IDX2PTR(m_faces[i].m_n[0],base); m_faces[i].m_n[0]=IDX2PTR(m_faces[i].m_n[0],base);
m_faces[i].m_n[1]=IDX2PTR(m_faces[i].m_n[1],base); m_faces[i].m_n[1]=IDX2PTR(m_faces[i].m_n[1],base);
@@ -1558,11 +1594,11 @@ void btSoftBody::indicesToPointers(const int* map)
m_faces[i].m_leaf->data=&m_faces[i]; m_faces[i].m_leaf->data=&m_faces[i];
} }
} }
for(int i=0,ni=m_anchors.size();i<ni;++i) for(i=0,ni=m_anchors.size();i<ni;++i)
{ {
m_anchors[i].m_node=IDX2PTR(m_anchors[i].m_node,base); m_anchors[i].m_node=IDX2PTR(m_anchors[i].m_node,base);
} }
for(int i=0,ni=m_notes.size();i<ni;++i) for(i=0,ni=m_notes.size();i<ni;++i)
{ {
for(int j=0;j<m_notes[i].m_rank;++j) for(int j=0;j<m_notes[i].m_rank;++j)
{ {
@@ -1667,11 +1703,13 @@ bool btSoftBody::checkContact( btRigidBody* prb,
void btSoftBody::updateNormals() void btSoftBody::updateNormals()
{ {
const btVector3 zv(0,0,0); const btVector3 zv(0,0,0);
for(int i=0,ni=m_nodes.size();i<ni;++i) int i,ni;
for(i=0,ni=m_nodes.size();i<ni;++i)
{ {
m_nodes[i].m_n=zv; m_nodes[i].m_n=zv;
} }
for(int i=0,ni=m_faces.size();i<ni;++i) for(i=0,ni=m_faces.size();i<ni;++i)
{ {
btSoftBody::Face& f=m_faces[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=cross(f.m_n[1]->m_x-f.m_n[0]->m_x,
@@ -1681,7 +1719,7 @@ void btSoftBody::updateNormals()
f.m_n[1]->m_n+=n; f.m_n[1]->m_n+=n;
f.m_n[2]->m_n+=n; f.m_n[2]->m_n+=n;
} }
for(int i=0,ni=m_nodes.size();i<ni;++i) for(i=0,ni=m_nodes.size();i<ni;++i)
{ {
m_nodes[i].m_n.normalize(); m_nodes[i].m_n.normalize();
} }
@@ -1755,8 +1793,10 @@ void btSoftBody::updatePose()
// //
void btSoftBody::updateConstants() void btSoftBody::updateConstants()
{ {
int i,ni;
/* Links */ /* Links */
for(int i=0,ni=m_links.size();i<ni;++i) for(i=0,ni=m_links.size();i<ni;++i)
{ {
Link& l=m_links[i]; Link& l=m_links[i];
Material& m=*l.m_material; Material& m=*l.m_material;
@@ -1765,7 +1805,7 @@ void btSoftBody::updateConstants()
l.m_c1 = l.m_rl*l.m_rl; l.m_c1 = l.m_rl*l.m_rl;
} }
/* Faces */ /* Faces */
for(int i=0,ni=m_faces.size();i<ni;++i) for(i=0,ni=m_faces.size();i<ni;++i)
{ {
Face& f=m_faces[i]; Face& f=m_faces[i];
f.m_ra = AreaOf(f.m_n[0]->m_x,f.m_n[1]->m_x,f.m_n[2]->m_x); f.m_ra = AreaOf(f.m_n[0]->m_x,f.m_n[1]->m_x,f.m_n[2]->m_x);
@@ -1773,11 +1813,11 @@ void btSoftBody::updateConstants()
/* Area's */ /* Area's */
btAlignedObjectArray<int> counts; btAlignedObjectArray<int> counts;
counts.resize(m_nodes.size(),0); counts.resize(m_nodes.size(),0);
for(int i=0,ni=m_nodes.size();i<ni;++i) for(i=0,ni=m_nodes.size();i<ni;++i)
{ {
m_nodes[i].m_area = 0; m_nodes[i].m_area = 0;
} }
for(int i=0,ni=m_faces.size();i<ni;++i) for(i=0,ni=m_faces.size();i<ni;++i)
{ {
btSoftBody::Face& f=m_faces[i]; btSoftBody::Face& f=m_faces[i];
for(int j=0;j<3;++j) for(int j=0;j<3;++j)
@@ -1787,7 +1827,7 @@ void btSoftBody::updateConstants()
f.m_n[j]->m_area+=btFabs(f.m_ra); f.m_n[j]->m_area+=btFabs(f.m_ra);
} }
} }
for(int i=0,ni=m_nodes.size();i<ni;++i) for(i=0,ni=m_nodes.size();i<ni;++i)
{ {
if(counts[i]>0) if(counts[i]>0)
m_nodes[i].m_area/=(btScalar)counts[i]; m_nodes[i].m_area/=(btScalar)counts[i];
@@ -1799,7 +1839,9 @@ void btSoftBody::updateConstants()
// //
void btSoftBody::initializeClusters() void btSoftBody::initializeClusters()
{ {
for(int i=0;i<m_clusters.size();++i) int i;
for( i=0;i<m_clusters.size();++i)
{ {
Cluster& c=*m_clusters[i]; Cluster& c=*m_clusters[i];
c.m_imass=0; c.m_imass=0;
@@ -1817,18 +1859,22 @@ for(int i=0;i<m_clusters.size();++i)
/* Inertia */ /* Inertia */
btMatrix3x3& ii=c.m_locii; btMatrix3x3& ii=c.m_locii;
ii[0]=ii[1]=ii[2]=btVector3(0,0,0); ii[0]=ii[1]=ii[2]=btVector3(0,0,0);
for(int i=0,ni=c.m_nodes.size();i<ni;++i) {
int i,ni;
for(i=0,ni=c.m_nodes.size();i<ni;++i)
{ {
const btVector3 k=c.m_nodes[i]->m_x-c.m_com; const btVector3 k=c.m_nodes[i]->m_x-c.m_com;
const btVector3 q=k*k; const btVector3 q=k*k;
const btScalar m=c.m_masses[i]; const btScalar m=c.m_masses[i];
ii[0][0] += m*(q[1]+q[2]); ii[0][0] += m*(q[1]+q[2]);
ii[1][1] += m*(q[0]+q[2]); ii[1][1] += m*(q[0]+q[2]);
ii[2][2] += m*(q[0]+q[1]); ii[2][2] += m*(q[0]+q[1]);
ii[0][1] -= m*k[0]*k[1]; ii[0][1] -= m*k[0]*k[1];
ii[0][2] -= m*k[0]*k[2]; ii[0][2] -= m*k[0]*k[2];
ii[1][2] -= m*k[1]*k[2]; ii[1][2] -= m*k[1]*k[2];
} }
}
ii[1][0]=ii[0][1]; ii[1][0]=ii[0][1];
ii[2][0]=ii[0][2]; ii[2][0]=ii[0][2];
ii[2][1]=ii[1][2]; ii[2][1]=ii[1][2];
@@ -1837,7 +1883,7 @@ for(int i=0;i<m_clusters.size();++i)
c.m_framexform.setIdentity(); c.m_framexform.setIdentity();
c.m_framexform.setOrigin(c.m_com); c.m_framexform.setOrigin(c.m_com);
c.m_framerefs.resize(c.m_nodes.size()); c.m_framerefs.resize(c.m_nodes.size());
for(int i=0;i<c.m_framerefs.size();++i) for(i=0;i<c.m_framerefs.size();++i)
{ {
c.m_framerefs[i]=c.m_nodes[i]->m_x-c.m_com; c.m_framerefs[i]=c.m_nodes[i]->m_x-c.m_com;
} }
@@ -1848,7 +1894,9 @@ for(int i=0;i<m_clusters.size();++i)
void btSoftBody::updateClusters() void btSoftBody::updateClusters()
{ {
BT_PROFILE("UpdateClusters"); BT_PROFILE("UpdateClusters");
for(int i=0;i<m_clusters.size();++i) int i;
for(i=0;i<m_clusters.size();++i)
{ {
btSoftBody::Cluster& c=*m_clusters[i]; btSoftBody::Cluster& c=*m_clusters[i];
const int n=c.m_nodes.size(); const int n=c.m_nodes.size();
@@ -1903,12 +1951,16 @@ for(int i=0;i<m_clusters.size();++i)
/* Velocities */ /* Velocities */
c.m_lv=btVector3(0,0,0); c.m_lv=btVector3(0,0,0);
c.m_av=btVector3(0,0,0); c.m_av=btVector3(0,0,0);
for(int i=0;i<n;++i) {
int i;
for(i=0;i<n;++i)
{ {
const btVector3 v=c.m_nodes[i]->m_v*c.m_masses[i]; const btVector3 v=c.m_nodes[i]->m_v*c.m_masses[i];
c.m_lv += v; c.m_lv += v;
c.m_av += cross(c.m_nodes[i]->m_x-c.m_com,v); c.m_av += cross(c.m_nodes[i]->m_x-c.m_com,v);
} }
}
c.m_lv=c.m_imass*c.m_lv*(1-c.m_ldamping); c.m_lv=c.m_imass*c.m_lv*(1-c.m_ldamping);
c.m_av=c.m_invwi*c.m_av*(1-c.m_adamping); c.m_av=c.m_invwi*c.m_av*(1-c.m_adamping);
c.m_vimpulses[0] = c.m_vimpulses[0] =
@@ -1990,9 +2042,11 @@ btAlignedObjectArray<btVector3> deltas;
btAlignedObjectArray<btScalar> weights; btAlignedObjectArray<btScalar> weights;
deltas.resize(m_nodes.size(),btVector3(0,0,0)); deltas.resize(m_nodes.size(),btVector3(0,0,0));
weights.resize(m_nodes.size(),0); weights.resize(m_nodes.size(),0);
int i;
if(drift) if(drift)
{ {
for(int i=0;i<m_clusters.size();++i) for(i=0;i<m_clusters.size();++i)
{ {
Cluster& c=*m_clusters[i]; Cluster& c=*m_clusters[i];
if(c.m_ndimpulses) if(c.m_ndimpulses)
@@ -2002,7 +2056,7 @@ if(drift)
} }
} }
} }
for(int i=0;i<m_clusters.size();++i) for(i=0;i<m_clusters.size();++i)
{ {
Cluster& c=*m_clusters[i]; Cluster& c=*m_clusters[i];
if(0<(drift?c.m_ndimpulses:c.m_nvimpulses)) if(0<(drift?c.m_ndimpulses:c.m_nvimpulses))
@@ -2019,16 +2073,18 @@ for(int i=0;i<m_clusters.size();++i)
} }
} }
} }
for(int i=0;i<deltas.size();++i) for(i=0;i<deltas.size();++i)
{ {
if(weights[i]>0) m_nodes[i].m_x+=deltas[i]/weights[i]; if(weights[i]>0) m_nodes[i].m_x+=deltas[i]/weights[i];
} }
} }
// //
void btSoftBody::dampClusters() void btSoftBody::dampClusters()
{ {
for(int i=0;i<m_clusters.size();++i) int i;
for(i=0;i<m_clusters.size();++i)
{ {
Cluster& c=*m_clusters[i]; Cluster& c=*m_clusters[i];
if(c.m_ndamping>0) if(c.m_ndamping>0)
@@ -2227,7 +2283,9 @@ void btSoftBody::applyForces()
dvolumetv = (m_pose.m_volume-volume)*kVC; dvolumetv = (m_pose.m_volume-volume)*kVC;
} }
/* Per vertex forces */ /* Per vertex forces */
for(int i=0,ni=m_nodes.size();i<ni;++i) int i,ni;
for(i=0,ni=m_nodes.size();i<ni;++i)
{ {
btSoftBody::Node& n=m_nodes[i]; btSoftBody::Node& n=m_nodes[i];
if(n.m_im>0) if(n.m_im>0)
@@ -2278,7 +2336,7 @@ void btSoftBody::applyForces()
} }
} }
/* Per face forces */ /* Per face forces */
for(int i=0,ni=m_faces.size();i<ni;++i) for(i=0,ni=m_faces.size();i<ni;++i)
{ {
btSoftBody::Face& f=m_faces[i]; btSoftBody::Face& f=m_faces[i];
if(as_faero) if(as_faero)

View File

@@ -219,7 +219,7 @@ public:
/* RContact */ /* RContact */
struct RContact struct RContact
{ {
btSoftBody::sCti m_cti; // Contact infos sCti m_cti; // Contact infos
Node* m_node; // Owner node Node* m_node; // Owner node
btMatrix3x3 m_c0; // Impulse matrix btMatrix3x3 m_c0; // Impulse matrix
btVector3 m_c1; // Relative anchor btVector3 m_c1; // Relative anchor
@@ -322,10 +322,10 @@ public:
/* Body */ /* Body */
struct Body struct Body
{ {
btSoftBody::Cluster* m_soft; Cluster* m_soft;
btRigidBody* m_rigid; btRigidBody* m_rigid;
Body() : m_soft(0),m_rigid(0) {} Body() : m_soft(0),m_rigid(0) {}
Body(btSoftBody::Cluster* p) : m_soft(p),m_rigid(0) {} Body(Cluster* p) : m_soft(p),m_rigid(0) {}
Body(btRigidBody* p) : m_soft(0),m_rigid(p) {} Body(btRigidBody* p) : m_soft(0),m_rigid(p) {}
void activate() const void activate() const
{ {
@@ -536,7 +536,7 @@ public:
btVector3 o; btVector3 o;
btVector3 d; btVector3 d;
btScalar mint; btScalar mint;
btSoftBody::Face* face; Face* face;
int tests; int tests;
RayCaster(const btVector3& org,const btVector3& dir,btScalar mxt); RayCaster(const btVector3& org,const btVector3& dir,btScalar mxt);
void Process(const btDbvtNode* leaf); void Process(const btDbvtNode* leaf);
@@ -598,7 +598,7 @@ public:
// //
/* ctor */ /* ctor */
btSoftBody( btSoftBody::btSoftBodyWorldInfo* worldInfo,int node_count, btSoftBody( btSoftBodyWorldInfo* worldInfo,int node_count,
const btVector3* x, const btVector3* x,
const btScalar* m); const btScalar* m);
/* dtor */ /* dtor */

View File

@@ -163,10 +163,12 @@ void btSoftBodyHelpers::Draw( btSoftBody* psb,
const btVector3 lcolor=btVector3(0,0,0); const btVector3 lcolor=btVector3(0,0,0);
const btVector3 ncolor=btVector3(1,1,1); const btVector3 ncolor=btVector3(1,1,1);
const btVector3 ccolor=btVector3(1,0,0); const btVector3 ccolor=btVector3(1,0,0);
int i,j,nj;
/* Nodes */ /* Nodes */
if(0!=(drawflags&fDrawFlags::Nodes)) if(0!=(drawflags&fDrawFlags::Nodes))
{ {
for(int i=0;i<psb->m_nodes.size();++i) for(i=0;i<psb->m_nodes.size();++i)
{ {
const btSoftBody::Node& n=psb->m_nodes[i]; const btSoftBody::Node& n=psb->m_nodes[i];
if(0==(n.m_material->m_flags&btSoftBody::fMaterial::DebugDraw)) continue; if(0==(n.m_material->m_flags&btSoftBody::fMaterial::DebugDraw)) continue;
@@ -178,7 +180,7 @@ void btSoftBodyHelpers::Draw( btSoftBody* psb,
/* Links */ /* Links */
if(0!=(drawflags&fDrawFlags::Links)) if(0!=(drawflags&fDrawFlags::Links))
{ {
for(int i=0;i<psb->m_links.size();++i) for(i=0;i<psb->m_links.size();++i)
{ {
const btSoftBody::Link& l=psb->m_links[i]; const btSoftBody::Link& l=psb->m_links[i];
if(0==(l.m_material->m_flags&btSoftBody::fMaterial::DebugDraw)) continue; if(0==(l.m_material->m_flags&btSoftBody::fMaterial::DebugDraw)) continue;
@@ -188,7 +190,7 @@ void btSoftBodyHelpers::Draw( btSoftBody* psb,
/* Normals */ /* Normals */
if(0!=(drawflags&fDrawFlags::Normals)) if(0!=(drawflags&fDrawFlags::Normals))
{ {
for(int i=0;i<psb->m_nodes.size();++i) for(i=0;i<psb->m_nodes.size();++i)
{ {
const btSoftBody::Node& n=psb->m_nodes[i]; const btSoftBody::Node& n=psb->m_nodes[i];
if(0==(n.m_material->m_flags&btSoftBody::fMaterial::DebugDraw)) continue; if(0==(n.m_material->m_flags&btSoftBody::fMaterial::DebugDraw)) continue;
@@ -203,7 +205,7 @@ void btSoftBodyHelpers::Draw( btSoftBody* psb,
static const btVector3 axis[]={btVector3(1,0,0), static const btVector3 axis[]={btVector3(1,0,0),
btVector3(0,1,0), btVector3(0,1,0),
btVector3(0,0,1)}; btVector3(0,0,1)};
for(int i=0;i<psb->m_rcontacts.size();++i) for(i=0;i<psb->m_rcontacts.size();++i)
{ {
const btSoftBody::RContact& c=psb->m_rcontacts[i]; const btSoftBody::RContact& c=psb->m_rcontacts[i];
const btVector3 o= c.m_node->m_x-c.m_cti.m_normal* const btVector3 o= c.m_node->m_x-c.m_cti.m_normal*
@@ -218,7 +220,7 @@ void btSoftBodyHelpers::Draw( btSoftBody* psb,
/* Anchors */ /* Anchors */
if(0!=(drawflags&fDrawFlags::Anchors)) if(0!=(drawflags&fDrawFlags::Anchors))
{ {
for(int i=0;i<psb->m_anchors.size();++i) for(i=0;i<psb->m_anchors.size();++i)
{ {
const btSoftBody::Anchor& a=psb->m_anchors[i]; const btSoftBody::Anchor& a=psb->m_anchors[i];
const btVector3 q=a.m_body->getWorldTransform()*a.m_local; const btVector3 q=a.m_body->getWorldTransform()*a.m_local;
@@ -226,7 +228,7 @@ void btSoftBodyHelpers::Draw( btSoftBody* psb,
drawVertex(idraw,q,0.25,btVector3(0,1,0)); drawVertex(idraw,q,0.25,btVector3(0,1,0));
idraw->drawLine(a.m_node->m_x,q,btVector3(1,1,1)); idraw->drawLine(a.m_node->m_x,q,btVector3(1,1,1));
} }
for(int i=0;i<psb->m_nodes.size();++i) for(i=0;i<psb->m_nodes.size();++i)
{ {
const btSoftBody::Node& n=psb->m_nodes[i]; const btSoftBody::Node& n=psb->m_nodes[i];
if(0==(n.m_material->m_flags&btSoftBody::fMaterial::DebugDraw)) continue; if(0==(n.m_material->m_flags&btSoftBody::fMaterial::DebugDraw)) continue;
@@ -242,7 +244,7 @@ void btSoftBodyHelpers::Draw( btSoftBody* psb,
const btScalar scl=(btScalar)0.8; const btScalar scl=(btScalar)0.8;
const btScalar alp=(btScalar)1; const btScalar alp=(btScalar)1;
const btVector3 col(0,(btScalar)0.7,0); const btVector3 col(0,(btScalar)0.7,0);
for(int i=0;i<psb->m_faces.size();++i) for(i=0;i<psb->m_faces.size();++i)
{ {
const btSoftBody::Face& f=psb->m_faces[i]; const btSoftBody::Face& f=psb->m_faces[i];
if(0==(f.m_material->m_flags&btSoftBody::fMaterial::DebugDraw)) continue; if(0==(f.m_material->m_flags&btSoftBody::fMaterial::DebugDraw)) continue;
@@ -258,7 +260,7 @@ void btSoftBodyHelpers::Draw( btSoftBody* psb,
if(0!=(drawflags&fDrawFlags::Clusters)) if(0!=(drawflags&fDrawFlags::Clusters))
{ {
srand(1806); srand(1806);
for(int i=0;i<psb->m_clusters.size();++i) for(i=0;i<psb->m_clusters.size();++i)
{ {
if(psb->m_clusters[i]->m_collide) if(psb->m_clusters[i]->m_collide)
{ {
@@ -268,7 +270,7 @@ void btSoftBodyHelpers::Draw( btSoftBody* psb,
color=color.normalized()*0.75; color=color.normalized()*0.75;
btAlignedObjectArray<btVector3> vertices; btAlignedObjectArray<btVector3> vertices;
vertices.resize(psb->m_clusters[i]->m_nodes.size()); vertices.resize(psb->m_clusters[i]->m_nodes.size());
for(int j=0,nj=vertices.size();j<nj;++j) for(j=0,nj=vertices.size();j<nj;++j)
{ {
vertices[j]=psb->m_clusters[i]->m_nodes[j]->m_x; vertices[j]=psb->m_clusters[i]->m_nodes[j]->m_x;
} }
@@ -281,7 +283,7 @@ void btSoftBodyHelpers::Draw( btSoftBody* psb,
add(hres.m_OutputVertices,-center); add(hres.m_OutputVertices,-center);
mul(hres.m_OutputVertices,(btScalar)1); mul(hres.m_OutputVertices,(btScalar)1);
add(hres.m_OutputVertices,center); add(hres.m_OutputVertices,center);
for(int j=0;j<(int)hres.mNumFaces;++j) for(j=0;j<(int)hres.mNumFaces;++j)
{ {
const int idx[]={hres.m_Indices[j*3+0],hres.m_Indices[j*3+1],hres.m_Indices[j*3+2]}; const int idx[]={hres.m_Indices[j*3+0],hres.m_Indices[j*3+1],hres.m_Indices[j*3+2]};
idraw->drawTriangle(hres.m_OutputVertices[idx[0]], idraw->drawTriangle(hres.m_OutputVertices[idx[0]],
@@ -311,7 +313,7 @@ void btSoftBodyHelpers::Draw( btSoftBody* psb,
/* Notes */ /* Notes */
if(0!=(drawflags&fDrawFlags::Notes)) if(0!=(drawflags&fDrawFlags::Notes))
{ {
for(int i=0;i<psb->m_notes.size();++i) for(i=0;i<psb->m_notes.size();++i)
{ {
const btSoftBody::Note& n=psb->m_notes[i]; const btSoftBody::Note& n=psb->m_notes[i];
btVector3 p=n.m_offset; btVector3 p=n.m_offset;
@@ -331,7 +333,7 @@ void btSoftBodyHelpers::Draw( btSoftBody* psb,
/* Joints */ /* Joints */
if(0!=(drawflags&fDrawFlags::Joints)) if(0!=(drawflags&fDrawFlags::Joints))
{ {
for(int i=0;i<psb->m_joints.size();++i) for(i=0;i<psb->m_joints.size();++i)
{ {
const btSoftBody::Joint* pj=psb->m_joints[i]; const btSoftBody::Joint* pj=psb->m_joints[i];
switch(pj->Type()) switch(pj->Type())
@@ -451,7 +453,9 @@ btSoftBody* btSoftBodyHelpers::CreateRope( btSoftBody::btSoftBodyWorldInfo& wor
const int r=res+2; const int r=res+2;
btVector3* x=new btVector3[r]; btVector3* x=new btVector3[r];
btScalar* m=new btScalar[r]; btScalar* m=new btScalar[r];
for(int i=0;i<r;++i) int i;
for(i=0;i<r;++i)
{ {
const btScalar t=i/(btScalar)(r-1); const btScalar t=i/(btScalar)(r-1);
x[i]=lerp(from,to,t); x[i]=lerp(from,to,t);
@@ -463,7 +467,7 @@ btSoftBody* btSoftBodyHelpers::CreateRope( btSoftBody::btSoftBodyWorldInfo& wor
delete[] x; delete[] x;
delete[] m; delete[] m;
/* Create links */ /* Create links */
for(int i=1;i<r;++i) for(i=1;i<r;++i)
{ {
psb->appendLink(i-1,i); psb->appendLink(i-1,i);
} }
@@ -489,7 +493,9 @@ btSoftBody* btSoftBodyHelpers::CreatePatch(btSoftBody::btSoftBodyWorldInfo& wor
const int tot=rx*ry; const int tot=rx*ry;
btVector3* x=new btVector3[tot]; btVector3* x=new btVector3[tot];
btScalar* m=new btScalar[tot]; btScalar* m=new btScalar[tot];
for(int iy=0;iy<ry;++iy) int iy;
for(iy=0;iy<ry;++iy)
{ {
const btScalar ty=iy/(btScalar)(ry-1); const btScalar ty=iy/(btScalar)(ry-1);
const btVector3 py0=lerp(corner00,corner01,ty); const btVector3 py0=lerp(corner00,corner01,ty);
@@ -509,7 +515,7 @@ btSoftBody* btSoftBodyHelpers::CreatePatch(btSoftBody::btSoftBodyWorldInfo& wor
delete[] x; delete[] x;
delete[] m; delete[] m;
/* Create links and faces */ /* Create links and faces */
for(int iy=0;iy<ry;++iy) for(iy=0;iy<ry;++iy)
{ {
for(int ix=0;ix<rx;++ix) for(int ix=0;ix<rx;++ix)
{ {
@@ -584,7 +590,9 @@ btSoftBody* btSoftBodyHelpers::CreateFromTriMesh(btSoftBody::btSoftBodyWorldInf
int ntriangles) int ntriangles)
{ {
int maxidx=0; int maxidx=0;
for(int i=0,ni=ntriangles*3;i<ni;++i) int i,j,ni;
for(i=0,ni=ntriangles*3;i<ni;++i)
{ {
maxidx=btMax(triangles[i],maxidx); maxidx=btMax(triangles[i],maxidx);
} }
@@ -593,12 +601,12 @@ btSoftBody* btSoftBodyHelpers::CreateFromTriMesh(btSoftBody::btSoftBodyWorldInf
btAlignedObjectArray<btVector3> vtx; btAlignedObjectArray<btVector3> vtx;
chks.resize(maxidx*maxidx,false); chks.resize(maxidx*maxidx,false);
vtx.resize(maxidx); vtx.resize(maxidx);
for(int i=0,j=0,ni=maxidx*3;i<ni;++j,i+=3) for(i=0,j=0,ni=maxidx*3;i<ni;++j,i+=3)
{ {
vtx[j]=btVector3(vertices[i],vertices[i+1],vertices[i+2]); vtx[j]=btVector3(vertices[i],vertices[i+1],vertices[i+2]);
} }
btSoftBody* psb=new btSoftBody(&worldInfo,vtx.size(),&vtx[0],0); btSoftBody* psb=new btSoftBody(&worldInfo,vtx.size(),&vtx[0],0);
for(int i=0,ni=ntriangles*3;i<ni;i+=3) for( i=0,ni=ntriangles*3;i<ni;i+=3)
{ {
const int idx[]={triangles[i],triangles[i+1],triangles[i+2]}; const int idx[]={triangles[i],triangles[i+1],triangles[i+2]};
#define IDX(_x_,_y_) ((_y_)*maxidx+(_x_)) #define IDX(_x_,_y_) ((_y_)*maxidx+(_x_))

View File

@@ -595,15 +595,19 @@ static inline void mulTPQ(btMatrix3x3& a,btScalar c,btScalar s,int p,int q)
{ {
const btScalar m[2][3]={ {a[p][0],a[p][1],a[p][2]}, const btScalar m[2][3]={ {a[p][0],a[p][1],a[p][2]},
{a[q][0],a[q][1],a[q][2]}}; {a[q][0],a[q][1],a[q][2]}};
for(int i=0;i<3;++i) a[p][i]=c*m[0][i]-s*m[1][i]; int i;
for(int i=0;i<3;++i) a[q][i]=c*m[1][i]+s*m[0][i];
for(i=0;i<3;++i) a[p][i]=c*m[0][i]-s*m[1][i];
for(i=0;i<3;++i) a[q][i]=c*m[1][i]+s*m[0][i];
} }
static inline void mulPQ(btMatrix3x3& a,btScalar c,btScalar s,int p,int q) static inline void mulPQ(btMatrix3x3& a,btScalar c,btScalar s,int p,int q)
{ {
const btScalar m[2][3]={ {a[0][p],a[1][p],a[2][p]}, const btScalar m[2][3]={ {a[0][p],a[1][p],a[2][p]},
{a[0][q],a[1][q],a[2][q]}}; {a[0][q],a[1][q],a[2][q]}};
for(int i=0;i<3;++i) a[i][p]=c*m[0][i]-s*m[1][i]; int i;
for(int i=0;i<3;++i) a[i][q]=c*m[1][i]+s*m[0][i];
for(i=0;i<3;++i) a[i][p]=c*m[0][i]-s*m[1][i];
for(i=0;i<3;++i) a[i][q]=c*m[1][i]+s*m[0][i];
} }
}; };