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)
{
applyCentralForce(force);
applyTorque(rel_pos.cross(force));
applyTorque(rel_pos.cross(force)*m_angularFactor);
}
void applyCentralImpulse(const btVector3& impulse)

View File

@@ -95,8 +95,12 @@ btSoftBody::~btSoftBody()
{
//for now, delete the internal shape
delete m_collisionShape;
for(int i=0;i<m_materials.size();++i) btAlignedFree(m_materials[i]);
for(int i=0;i<m_joints.size();++i) btAlignedFree(m_joints[i]);
int 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)
{
int i;
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;
}
for(int i=0;i<m_faces.size();++i)
for(i=0;i<m_faces.size();++i)
{
const Face& f=m_faces[i];
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;
}
}
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;
}
}
const btScalar tm=getTotalMass();
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;
}
@@ -509,16 +516,18 @@ void btSoftBody::setPose(bool bvolume,bool bframe)
{
m_pose.m_bvolume = bvolume;
m_pose.m_bframe = bframe;
int i,ni;
/* Weights */
const btScalar omass=getTotalMass();
const btScalar kmass=omass*m_nodes.size()*1000;
btScalar tmass=omass;
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;
}
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];
m_pose.m_wgh[i]= n.m_im>0 ?
@@ -528,7 +537,7 @@ void btSoftBody::setPose(bool bvolume,bool bframe)
/* Pos */
const btVector3 com=evaluateCom();
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;
}
@@ -540,7 +549,7 @@ void btSoftBody::setPose(bool bvolume,bool bframe)
m_pose.m_aqq[0] =
m_pose.m_aqq[1] =
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 mq=m_pose.m_wgh[i]*q;
@@ -558,8 +567,10 @@ btScalar btSoftBody::getVolume() const
btScalar vol=0;
if(m_nodes.size()>0)
{
int i,ni;
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];
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 i,j;
if(distance>1)
{
/* Build graph */
@@ -665,16 +678,16 @@ int btSoftBody::generateBendingConstraints(int distance,Material* mat)
const unsigned inf=(~(unsigned)0)>>1;
unsigned* adj=new unsigned[n*n];
#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;
else
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 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 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)];
if(adj[IDX(i,j)]>sum)
@@ -697,9 +710,9 @@ int btSoftBody::generateBendingConstraints(int distance,Material* mat)
}
/* Build links */
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)
{
@@ -720,11 +733,13 @@ void btSoftBody::randomizeConstraints()
{
unsigned long seed=243703;
#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]);
}
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]);
}
@@ -734,13 +749,18 @@ unsigned long seed=243703;
//
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);
btAlignedFree(m_clusters[i]);
}
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]->m_collide= true;
@@ -766,7 +786,9 @@ if(k>0)
const btScalar w=2-btMin<btScalar>(1,iterations/slope);
changed=false;
iterations++;
for(int i=0;i<k;++i)
int i;
for(i=0;i<k;++i)
{
btVector3 c(0,0,0);
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 = centers[i]+(c-centers[i])*w;
changed |= (c-centers[i]).length2()>SIMD_EPSILON;
changed |= ((c-centers[i]).length2()>SIMD_EPSILON);
centers[i] = c;
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;
int kbest=0;
@@ -802,14 +824,14 @@ if(k>0)
/* Merge */
btAlignedObjectArray<int> cids;
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)
{
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]),
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]);
}
/* 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)
{
@@ -862,12 +884,14 @@ return(0);
//
void btSoftBody::refine(ImplicitFn* ifn,btScalar accurary,bool cut)
{
const Node* nbase(&m_nodes[0]);
int ncount(m_nodes.size());
const Node* nbase = &m_nodes[0];
int ncount = m_nodes.size();
btSymMatrix<int> edges(ncount,-2);
int newnodes=0;
int i,j,k,ni;
/* Filter out */
for(int i=0;i<m_links.size();++i)
for(i=0;i<m_links.size();++i)
{
Link& l=m_links[i];
if(l.m_bbending)
@@ -880,12 +904,12 @@ for(int i=0;i<m_links.size();++i)
}
}
/* Fill edges */
for(int i=0;i<m_links.size();++i)
for(i=0;i<m_links.size();++i)
{
Link& l=m_links[i];
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];
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;
}
/* 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)
{
@@ -939,7 +963,7 @@ for(int i=0;i<ncount;++i)
}
nbase=&m_nodes[0];
/* 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];
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 */
for(int i=0;i<m_faces.size();++i)
for(i=0;i<m_faces.size();++i)
{
const Face& feat=m_faces[i];
const int idx[]={ int(feat.m_n[0]-nbase),
int(feat.m_n[1]-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))
{
@@ -1012,7 +1036,7 @@ if(cut)
}
nbase=&m_nodes[0];
/* 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),
int(m_links[i].m_n[1]-nbase)};
@@ -1039,7 +1063,7 @@ if(cut)
}
}
/* 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;
if( (ifn->Eval(n[0]->m_x)<accurary)&&
@@ -1058,15 +1082,15 @@ if(cut)
btAlignedObjectArray<int> ranks;
btAlignedObjectArray<int> todelete;
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 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 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),
int(m_links[i].m_n[1]-nbase)};
@@ -1081,7 +1105,7 @@ if(cut)
}
}
#if 0
for(int i=nnodes-1;i>=0;--i)
for(i=nnodes-1;i>=0;--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 done=false;
int i,ni;
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 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]};
pn[0]->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);
if(mtch!=-1)
@@ -1141,7 +1166,7 @@ for(int i=0,ni=m_links.size();i<ni;++i)
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++)
{
@@ -1210,6 +1235,8 @@ switch(preset)
//
void btSoftBody::predictMotion(btScalar dt)
{
int i,ni;
/* Update */
if(m_bUpdateRtCst)
{
@@ -1232,7 +1259,7 @@ void btSoftBody::predictMotion(btScalar dt)
addVelocity(m_worldInfo->m_gravity*m_sst.sdt);
applyForces();
/* 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];
n.m_q = n.m_x;
@@ -1245,7 +1272,7 @@ void btSoftBody::predictMotion(btScalar dt)
/* Bounds */
updateBounds();
/* 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];
m_ndbvt.update( n.m_leaf,
@@ -1299,14 +1326,17 @@ void btSoftBody::solveConstraints()
/* Apply clusters */
applyClusters(false);
/* 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];
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);
}
/* 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];
const btVector3 ra=a.m_body->getWorldTransform().getBasis()*a.m_local;
@@ -1331,7 +1361,7 @@ if(m_cfg.viterations>0)
}
}
/* 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];
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);
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];
n.m_v = (n.m_x-n.m_q)*vc;
@@ -1360,7 +1390,7 @@ if(m_cfg.piterations>0)
if(m_cfg.diterations>0)
{
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];
n.m_q = n.m_x;
@@ -1406,15 +1436,17 @@ void btSoftBody::solveClusters(const btAlignedObjectArray<btSoftBody*>& bodies
{
const int nb=bodies.size();
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);
}
for(int i=0;i<nb;++i)
for(i=0;i<nb;++i)
{
bodies[i]->prepareClusters(iterations);
}
for(int i=0;i<iterations;++i)
for(i=0;i<iterations;++i)
{
const btScalar sor=1;
for(int j=0;j<nb;++j)
@@ -1422,7 +1454,7 @@ for(int i=0;i<iterations;++i)
bodies[j]->solveClusters(sor);
}
}
for(int i=0;i<nb;++i)
for(i=0;i<nb;++i)
{
bodies[i]->cleanupClusters();
}
@@ -1494,19 +1526,21 @@ void btSoftBody::pointersToIndices()
{
#define PTR2IDX(_p_,_b_) reinterpret_cast<btSoftBody::Node*>((_p_)-(_b_))
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)
{
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[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[1]=PTR2IDX(m_faces[i].m_n[1],base);
@@ -1516,11 +1550,11 @@ void btSoftBody::pointersToIndices()
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);
}
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)
{
@@ -1536,19 +1570,21 @@ void btSoftBody::indicesToPointers(const int* map)
#define IDX2PTR(_p_,_b_) map?(&(_b_)[map[(((char*)_p_)-(char*)0)]]): \
(&(_b_)[(((char*)_p_)-(char*)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)
{
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[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[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];
}
}
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);
}
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)
{
@@ -1667,11 +1703,13 @@ bool btSoftBody::checkContact( btRigidBody* prb,
void btSoftBody::updateNormals()
{
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;
}
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];
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[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();
}
@@ -1755,8 +1793,10 @@ void btSoftBody::updatePose()
//
void btSoftBody::updateConstants()
{
int i,ni;
/* 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];
Material& m=*l.m_material;
@@ -1765,7 +1805,7 @@ void btSoftBody::updateConstants()
l.m_c1 = l.m_rl*l.m_rl;
}
/* 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];
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 */
btAlignedObjectArray<int> counts;
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;
}
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];
for(int j=0;j<3;++j)
@@ -1787,7 +1827,7 @@ void btSoftBody::updateConstants()
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)
m_nodes[i].m_area/=(btScalar)counts[i];
@@ -1799,7 +1839,9 @@ void btSoftBody::updateConstants()
//
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];
c.m_imass=0;
@@ -1817,7 +1859,10 @@ for(int i=0;i<m_clusters.size();++i)
/* Inertia */
btMatrix3x3& ii=c.m_locii;
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 q=k*k;
@@ -1829,6 +1874,7 @@ for(int i=0;i<m_clusters.size();++i)
ii[0][2] -= m*k[0]*k[2];
ii[1][2] -= m*k[1]*k[2];
}
}
ii[1][0]=ii[0][1];
ii[2][0]=ii[0][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.setOrigin(c.m_com);
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;
}
@@ -1848,7 +1894,9 @@ for(int i=0;i<m_clusters.size();++i)
void btSoftBody::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];
const int n=c.m_nodes.size();
@@ -1903,12 +1951,16 @@ for(int i=0;i<m_clusters.size();++i)
/* Velocities */
c.m_lv=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];
c.m_lv += 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_av=c.m_invwi*c.m_av*(1-c.m_adamping);
c.m_vimpulses[0] =
@@ -1990,9 +2042,11 @@ btAlignedObjectArray<btVector3> deltas;
btAlignedObjectArray<btScalar> weights;
deltas.resize(m_nodes.size(),btVector3(0,0,0));
weights.resize(m_nodes.size(),0);
int i;
if(drift)
{
for(int i=0;i<m_clusters.size();++i)
for(i=0;i<m_clusters.size();++i)
{
Cluster& c=*m_clusters[i];
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];
if(0<(drift?c.m_ndimpulses:c.m_nvimpulses))
@@ -2019,7 +2073,7 @@ 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];
}
@@ -2028,7 +2082,9 @@ for(int i=0;i<deltas.size();++i)
//
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];
if(c.m_ndamping>0)
@@ -2227,7 +2283,9 @@ void btSoftBody::applyForces()
dvolumetv = (m_pose.m_volume-volume)*kVC;
}
/* 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];
if(n.m_im>0)
@@ -2278,7 +2336,7 @@ void btSoftBody::applyForces()
}
}
/* 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];
if(as_faero)

View File

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

View File

@@ -163,10 +163,12 @@ void btSoftBodyHelpers::Draw( btSoftBody* psb,
const btVector3 lcolor=btVector3(0,0,0);
const btVector3 ncolor=btVector3(1,1,1);
const btVector3 ccolor=btVector3(1,0,0);
int i,j,nj;
/* 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];
if(0==(n.m_material->m_flags&btSoftBody::fMaterial::DebugDraw)) continue;
@@ -178,7 +180,7 @@ void btSoftBodyHelpers::Draw( btSoftBody* psb,
/* 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];
if(0==(l.m_material->m_flags&btSoftBody::fMaterial::DebugDraw)) continue;
@@ -188,7 +190,7 @@ void btSoftBodyHelpers::Draw( btSoftBody* psb,
/* 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];
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),
btVector3(0,1,0),
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 btVector3 o= c.m_node->m_x-c.m_cti.m_normal*
@@ -218,7 +220,7 @@ void btSoftBodyHelpers::Draw( btSoftBody* psb,
/* 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 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));
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];
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 alp=(btScalar)1;
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];
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))
{
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)
{
@@ -268,7 +270,7 @@ void btSoftBodyHelpers::Draw( btSoftBody* psb,
color=color.normalized()*0.75;
btAlignedObjectArray<btVector3> vertices;
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;
}
@@ -281,7 +283,7 @@ void btSoftBodyHelpers::Draw( btSoftBody* psb,
add(hres.m_OutputVertices,-center);
mul(hres.m_OutputVertices,(btScalar)1);
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]};
idraw->drawTriangle(hres.m_OutputVertices[idx[0]],
@@ -311,7 +313,7 @@ void btSoftBodyHelpers::Draw( btSoftBody* psb,
/* 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];
btVector3 p=n.m_offset;
@@ -331,7 +333,7 @@ void btSoftBodyHelpers::Draw( btSoftBody* psb,
/* 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];
switch(pj->Type())
@@ -451,7 +453,9 @@ btSoftBody* btSoftBodyHelpers::CreateRope( btSoftBody::btSoftBodyWorldInfo& wor
const int r=res+2;
btVector3* x=new btVector3[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);
x[i]=lerp(from,to,t);
@@ -463,7 +467,7 @@ btSoftBody* btSoftBodyHelpers::CreateRope( btSoftBody::btSoftBodyWorldInfo& wor
delete[] x;
delete[] m;
/* Create links */
for(int i=1;i<r;++i)
for(i=1;i<r;++i)
{
psb->appendLink(i-1,i);
}
@@ -489,7 +493,9 @@ btSoftBody* btSoftBodyHelpers::CreatePatch(btSoftBody::btSoftBodyWorldInfo& wor
const int tot=rx*ry;
btVector3* x=new btVector3[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 btVector3 py0=lerp(corner00,corner01,ty);
@@ -509,7 +515,7 @@ btSoftBody* btSoftBodyHelpers::CreatePatch(btSoftBody::btSoftBodyWorldInfo& wor
delete[] x;
delete[] m;
/* Create links and faces */
for(int iy=0;iy<ry;++iy)
for(iy=0;iy<ry;++iy)
{
for(int ix=0;ix<rx;++ix)
{
@@ -584,7 +590,9 @@ btSoftBody* btSoftBodyHelpers::CreateFromTriMesh(btSoftBody::btSoftBodyWorldInf
int ntriangles)
{
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);
}
@@ -593,12 +601,12 @@ btSoftBody* btSoftBodyHelpers::CreateFromTriMesh(btSoftBody::btSoftBodyWorldInf
btAlignedObjectArray<btVector3> vtx;
chks.resize(maxidx*maxidx,false);
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]);
}
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]};
#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]},
{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];
for(int i=0;i<3;++i) a[q][i]=c*m[1][i]+s*m[0][i];
int 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)
{
const btScalar m[2][3]={ {a[0][p],a[1][p],a[2][p]},
{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];
for(int i=0;i<3;++i) a[i][q]=c*m[1][i]+s*m[0][i];
int 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];
}
};