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:
@@ -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)
|
||||||
|
|||||||
@@ -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;
|
||||||
@@ -766,7 +786,9 @@ if(k>0)
|
|||||||
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)
|
||||||
|
|||||||
@@ -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 */
|
||||||
|
|||||||
@@ -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_))
|
||||||
|
|||||||
@@ -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];
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user