25 :m_softBodySolver(0),m_worldInfo(worldInfo)
40 for(
int i=0,ni=node_count;i<ni;++i)
56 :m_worldInfo(worldInfo)
139 const Node* n[]={node0,node1};
143 if( (l.
m_n[0]==n[0]&&l.
m_n[1]==n[1])||
144 (l.
m_n[0]==n[1]&&l.
m_n[1]==n[0]))
164 if( (f.
m_n[j]==n[0])||
166 (f.
m_n[j]==n[2])) c|=1<<j;
else break;
168 if(c==7)
return(
true);
285 if((!bcheckexist)||(!
checkLink(node0,node1)))
364 appendAnchor(node,body,local,disableCollisionBetweenLinkedBodies,influence);
370 if (disableCollisionBetweenLinkedBodies)
465 const bool as_lift = kLF>0;
466 const bool as_drag = kDG>0;
467 const bool as_aero = as_lift || as_drag;
499 btScalar tri_area = 0.5f * n.m_area;
501 fDrag = 0.5f * kDG * medium.
m_density * rel_v2 * tri_area * n_dot_v * (-rel_v_nrm);
505 if ( 0 < n_dot_v && n_dot_v < 0.98480f)
506 fLift = 0.5f * kLF * medium.
m_density * rel_v_len * tri_area *
btSqrt(1.0f-n_dot_v*n_dot_v) * (nrm.
cross(rel_v_nrm).
cross(rel_v_nrm));
510 btScalar del_v_by_fDrag_len2 = del_v_by_fDrag.length2();
513 if (del_v_by_fDrag_len2 >= v_len2 && del_v_by_fDrag_len2 > 0)
515 btScalar del_v_by_fDrag_len = del_v_by_fDrag.length();
517 fDrag *=
btScalar(0.8)*(v_len / del_v_by_fDrag_len);
533 const btScalar c0 = n.m_area * dvn * rel_v2/2;
535 force += nrm*(-c1*kLF);
552 const bool as_lift = kLF>0;
553 const bool as_drag = kDG>0;
554 const bool as_aero = as_lift || as_drag;
587 fDrag = 0.5f * kDG * medium.
m_density * rel_v2 * tri_area * n_dot_v * (-rel_v_nrm);
591 if ( 0 < n_dot_v && n_dot_v < 0.98480f)
592 fLift = 0.5f * kLF * medium.
m_density * rel_v_len * tri_area *
btSqrt(1.0f-n_dot_v*n_dot_v) * (nrm.
cross(rel_v_nrm).
cross(rel_v_nrm));
606 if (del_v_by_fDrag_len2 >= v_len2 && del_v_by_fDrag_len2 > 0)
610 fDrag *=
btScalar(0.8)*(v_len / del_v_by_fDrag_len);
630 force += nrm*(-c1*kLF);
674 m_nodes[node].m_im=mass>0?1/mass:0;
878 if(
m_nodes[i].m_im<=0) tmass+=kmass;
954 for(
int i=0,ni=cluster->
m_nodes.size();i<ni;++i)
1046 const unsigned inf=(~(unsigned)0)>>1;
1047 unsigned* adj=
new unsigned[n*n];
1050 #define IDX(_x_,_y_) ((_y_)*n+(_x_))
1057 adj[
IDX(i,j)]=adj[
IDX(j,i)]=inf;
1061 adj[
IDX(i,j)]=adj[
IDX(j,i)]=0;
1094 for (
int ii=0;ii<nodeLinks.
size();ii++)
1098 for (
int jj=0;jj<nodeLinks[ii].m_links.
size();jj++)
1100 int k = nodeLinks[ii].m_links[jj];
1101 for (
int kk=0;kk<nodeLinks[k].m_links.
size();kk++)
1103 int j = nodeLinks[k].m_links[kk];
1106 const unsigned sum=adj[
IDX(i,k)]+adj[
IDX(k,j)];
1108 if(adj[
IDX(i,j)]>sum)
1120 for(
int k=0;k<n;++k)
1126 const unsigned sum=adj[
IDX(i,k)]+adj[
IDX(k,j)];
1127 if(adj[
IDX(i,j)]>sum)
1143 if(adj[
IDX(i,j)]==(
unsigned)distance)
1160 unsigned long seed=243703;
1161 #define NEXTRAND (seed=(1664525L*seed+1013904223L)&0xffffffff)
1221 const btScalar w=2-btMin<btScalar>(1,iterations/slope);
1236 c = centers[i]+(c-centers[i])*w;
1247 for(
int j=1;j<k;++j)
1258 }
while(changed&&(iterations<maxiterations));
1274 for(
int j=0;j<3;++j)
1276 const int cid=cids[idx[j]];
1277 for(
int q=1;q<3;++q)
1279 const int kid=idx[(j+q)%3];
1321 for (
int j=0;j<4;j++)
1338 for(
int j=0;j<3;++j)
1361 bool connected=
false;
1364 for (
int i=0;!connected&&i<cla->
m_nodes.size();i++)
1366 for (
int j=0;j<clb->
m_nodes.size();j++)
1410 edges(
int(l.
m_n[0]-nbase),
int(l.
m_n[1]-nbase))=-1;
1415 edges(
int(f.
m_n[0]-nbase),
int(f.
m_n[1]-nbase))=-1;
1416 edges(
int(f.
m_n[1]-nbase),
int(f.
m_n[2]-nbase))=-1;
1417 edges(
int(f.
m_n[2]-nbase),
int(f.
m_n[0]-nbase))=-1;
1420 for(i=0;i<ncount;++i)
1422 for(j=i+1;j<ncount;++j)
1441 const btScalar f=(ma+mb)/(ma+mb+mc);
1469 const int idx[]={ int(feat.
m_n[0]-nbase),
1470 int(feat.
m_n[1]-nbase)};
1471 if((idx[0]<ncount)&&(idx[1]<ncount))
1473 const int ni=edges(idx[0],idx[1]);
1490 const int idx[]={ int(feat.
m_n[0]-nbase),
1491 int(feat.
m_n[1]-nbase),
1492 int(feat.
m_n[2]-nbase)};
1493 for(j=2,k=0;k<3;j=k++)
1495 if((idx[j]<ncount)&&(idx[k]<ncount))
1497 const int ni=edges(idx[j],idx[k]);
1501 const int l=(k+1)%3;
1520 const int pcount=ncount;
1525 for(i=0;i<ncount;++i)
1528 if((i>=pcount)||(
btFabs(ifn->
Eval(x))<accurary))
1532 if(m>0) { m*=0.5f;
m_nodes[i].m_im/=0.5f; }
1542 const int id[]={ int(
m_links[i].m_n[0]-nbase),
1543 int(
m_links[i].m_n[1]-nbase)};
1545 if(cnodes[
id[0]]&&cnodes[
id[1]])
1559 for(
int j=0;j<2;++j)
1561 int cn=cnodes[int(l.
m_n[j]-nbase)];
1570 if( (ifn->
Eval(n[0]->
m_x)<accurary)&&
1571 (ifn->
Eval(n[1]->
m_x)<accurary)&&
1572 (ifn->
Eval(n[2]->
m_x)<accurary))
1574 for(
int j=0;j<3;++j)
1576 int cn=cnodes[int(n[j]-nbase)];
1588 for(
int j=0;j<2;++j) ranks[
int(
m_links[i].m_n[j]-nbase)]++;
1592 for(
int j=0;j<3;++j) ranks[
int(
m_faces[i].m_n[j]-nbase)]++;
1596 const int id[]={ int(
m_links[i].m_n[0]-nbase),
1597 int(
m_links[i].m_n[1]-nbase)};
1598 const bool sg[]={ ranks[
id[0]]==1,
1609 for(i=nnodes-1;i>=0;--i)
1616 for(
int i=0;i<nnodes;++i) map[i]=i;
1617 PointersToIndices(
this);
1618 for(
int i=0,ni=todelete.
size();i<ni;++i)
1622 int& b=map[--nnodes];
1627 IndicesToPointers(
this,&map[0]);
1665 pft[0]->
m_n[1]=pn[mtch];
1666 pft[1]->
m_n[0]=pn[1-mtch];
1672 for(
int k=2,l=0;l<3;k=l++)
1679 pft[0]->
m_n[l]=pn[mtch];
1680 pft[1]->
m_n[k]=pn[1-mtch];
1681 appendLink(pn[0],pft[0]->m_n[(l+1)%3],pft[0]->m_material,
true);
1682 appendLink(pn[1],pft[0]->m_n[(l+1)%3],pft[0]->m_material,
true);
1704 results.
body =
this;
1927 for(
int isolve=0;isolve<iterations;++isolve)
1945 const int nb=bodies.
size();
1955 bodies[i]->prepareClusters(iterations);
1957 for(i=0;i<iterations;++i)
1960 for(
int j=0;j<nb;++j)
1962 bodies[j]->solveClusters(sor);
1967 bodies[i]->cleanupClusters();
1993 const btScalar t=rayFromToTriangle( m_rayFrom,m_rayTo,m_rayNormalizedDirection,
1998 if((t>0)&&(t<m_mint))
2008 const btVector3& rayNormalizedDirection,
2024 if((t>teps)&&(t<maxt))
2026 const btVector3 hit=rayFrom+rayNormalizedDirection*t;
2041 #define PTR2IDX(_p_,_b_) reinterpret_cast<btSoftBody::Node*>((_p_)-(_b_))
2049 m_nodes[i].m_leaf->data=*(
void**)&i;
2064 m_faces[i].m_leaf->data=*(
void**)&i;
2073 for(
int j=0;j<
m_notes[i].m_rank;++j)
2084 #define IDX2PTR(_p_,_b_) map?(&(_b_)[map[(((char*)_p_)-(char*)0)]]): \
2085 (&(_b_)[(((char*)_p_)-(char*)0)])
2117 for(
int j=0;j<
m_notes[i].m_rank;++j)
2174 int tetfaces[4][3] = {{0,1,2},{0,1,3},{1,2,3},{0,2,3}};
2175 for (
int f=0;f<4;f++)
2178 int index0=tetfaces[f][0];
2179 int index1=tetfaces[f][1];
2180 int index2=tetfaces[f][2];
2342 Apq[0].setX(eps);Apq[1].setY(eps*2);Apq[2].setZ(eps*3);
2390 for(
int j=0;j<3;++j)
2417 for(
int j=0;j<3;++j)
2425 m_nodes[i].m_area *= 0.3333333f;
2463 for(
int j=0;j<c.
m_nodes.size();++j)
2486 for(i=0,ni=c.
m_nodes.size();i<ni;++i)
2491 ii[0][0] += m*(q[1]+q[2]);
2492 ii[1][1] += m*(q[0]+q[2]);
2493 ii[2][2] += m*(q[0]+q[1]);
2494 ii[0][1] -= m*k[0]*k[1];
2495 ii[0][2] -= m*k[0]*k[2];
2496 ii[1][2] -= m*k[1]*k[2];
2540 for(
int i=0;i<c.
m_nodes.size();++i)
2544 m[0]+=a[0]*b;m[1]+=a[1]*b;m[2]+=a[2]*b;
2560 c.
m_invwi=c.m_xform.getBasis().scaled(iin)*c.m_xform.getBasis().transpose();
2563 for(
int i=0;i<n;++i)
2568 c.
m_invwi[0][0] += m*(q[1]+q[2]);
2569 c.
m_invwi[1][1] += m*(q[0]+q[2]);
2570 c.
m_invwi[2][2] += m*(q[0]+q[1]);
2571 c.
m_invwi[0][1] -= m*k[0]*k[1];
2572 c.
m_invwi[0][2] -= m*k[0]*k[2];
2573 c.
m_invwi[1][2] -= m*k[1]*k[2];
2605 for(
int j=0;j<c.
m_nodes.size();++j)
2617 for(
int j=1;j<n;++j)
2702 for(
int j=0;j<c.
m_nodes.size();++j)
2712 for(i=0;i<deltas.
size();++i)
2716 m_nodes[i].m_x+=deltas[i]/weights[i];
2731 for(
int j=0;j<c.
m_nodes.size();++j)
2750 m_bodies[0].activate();
2751 m_bodies[1].activate();
2759 m_rpos[0] = m_bodies[0].xform()*m_refs[0];
2760 m_rpos[1] = m_bodies[1].xform()*m_refs[1];
2761 m_drift =
Clamp(m_rpos[0]-m_rpos[1],maxdrift)*m_erp/dt;
2762 m_rpos[0] -= m_bodies[0].xform().getOrigin();
2763 m_rpos[1] -= m_bodies[1].xform().getOrigin();
2764 m_massmatrix =
ImpulseMatrix( m_bodies[0].invMass(),m_bodies[0].invWorldInertia(),m_rpos[0],
2765 m_bodies[1].invMass(),m_bodies[1].invWorldInertia(),m_rpos[1]);
2768 m_sdrift = m_massmatrix*(m_drift*m_split);
2769 m_drift *= 1-m_split;
2777 const btVector3 va=m_bodies[0].velocity(m_rpos[0]);
2778 const btVector3 vb=m_bodies[1].velocity(m_rpos[1]);
2782 impulse.
m_velocity = m_massmatrix*(m_drift+vr*m_cfm)*sor;
2783 m_bodies[0].applyImpulse(-impulse,m_rpos[0]);
2784 m_bodies[1].applyImpulse( impulse,m_rpos[1]);
2792 m_bodies[0].applyDImpulse(-m_sdrift,m_rpos[0]);
2793 m_bodies[1].applyDImpulse( m_sdrift,m_rpos[1]);
2801 m_icontrol->Prepare(
this);
2803 m_axis[0] = m_bodies[0].xform().getBasis()*m_refs[0];
2804 m_axis[1] = m_bodies[1].xform().getBasis()*m_refs[1];
2806 m_drift *=
btMin(maxdrift,
btAcos(Clamp<btScalar>(
btDot(m_axis[0],m_axis[1]),-1,+1)));
2807 m_drift *= m_erp/dt;
2808 m_massmatrix=
AngularImpulseMatrix(m_bodies[0].invWorldInertia(),m_bodies[1].invWorldInertia());
2811 m_sdrift = m_massmatrix*(m_drift*m_split);
2812 m_drift *= 1-m_split;
2820 const btVector3 va=m_bodies[0].angularVelocity();
2821 const btVector3 vb=m_bodies[1].angularVelocity();
2824 const btVector3 vc=vr-m_axis[0]*m_icontrol->Speed(
this,sp);
2827 impulse.
m_velocity = m_massmatrix*(m_drift+vc*m_cfm)*sor;
2828 m_bodies[0].applyAImpulse(-impulse);
2829 m_bodies[1].applyAImpulse( impulse);
2837 m_bodies[0].applyDAImpulse(-m_sdrift);
2838 m_bodies[1].applyDAImpulse( m_sdrift);
2846 const bool dodrift=(m_life==0);
2847 m_delete=(++m_life)>m_maxlife;
2850 m_drift=m_drift*m_erp/dt;
2853 m_sdrift = m_massmatrix*(m_drift*m_split);
2854 m_drift *= 1-m_split;
2867 const btVector3 va=m_bodies[0].velocity(m_rpos[0]);
2868 const btVector3 vb=m_bodies[1].velocity(m_rpos[1]);
2882 if (m_bodies[0].m_soft==m_bodies[1].m_soft)
2889 if (impulse.
m_velocity.
length() <m_bodies[0].m_soft->m_maxSelfCollisionImpulse)
2894 m_bodies[0].applyImpulse(-impulse*m_bodies[0].m_soft->m_selfCollisionImpulseFactor,m_rpos[0]);
2895 m_bodies[1].applyImpulse( impulse*m_bodies[0].m_soft->m_selfCollisionImpulseFactor,m_rpos[1]);
2901 m_bodies[0].applyImpulse(-impulse,m_rpos[0]);
2902 m_bodies[1].applyImpulse( impulse,m_rpos[1]);
2911 m_bodies[0].applyDImpulse(-m_sdrift,m_rpos[0]);
2912 m_bodies[1].applyDImpulse( m_sdrift,m_rpos[1]);
2926 const bool as_lift = kLF>0;
2927 const bool as_drag = kDG>0;
2928 const bool as_pressure = kPR!=0;
2929 const bool as_volume = kVC>0;
2930 const bool as_aero = as_lift ||
2936 const bool use_medium = as_aero;
2937 const bool use_volume = as_pressure ||
2946 ivolumetp = 1/
btFabs(volume)*kPR;
3156 volume.Expand(
btVector3(basemargin,basemargin,basemargin));
3157 docollide.
psb =
this;
3161 docollide.
dynmargin = basemargin+timemargin;
3203 docollide.
psb[0]=
this;
3204 docollide.
psb[1]=psb;
3209 docollide.
psb[0]=psb;
3210 docollide.
psb[1]=
this;
3257 if (sbd->m_materials)
3260 int numElem = sbd->m_numMaterials;
3264 for (
int i=0;i<numElem;i++,memPtr++)
3291 int numElem = sbd->m_numNodes;
3294 for (
int i=0;i<numElem;i++,memPtr++)
3315 int numElem = sbd->m_numLinks;
3318 for (
int i=0;i<numElem;i++,memPtr++)
3338 int numElem = sbd->m_numFaces;
3341 for (
int i=0;i<numElem;i++,memPtr++)
3345 for (
int j=0;j<3;j++)
3357 if (sbd->m_tetrahedra)
3360 int numElem = sbd->m_numTetrahedra;
3363 for (
int i=0;i<numElem;i++,memPtr++)
3365 for (
int j=0;j<4;j++)
3383 int numElem = sbd->m_numAnchors;
3386 for (
int i=0;i<numElem;i++,memPtr++)
3401 sbd->m_config.m_dynamicFriction =
m_cfg.
kDF;
3403 sbd->m_config.m_pressure =
m_cfg.
kPR;
3412 sbd->m_config.m_damping =
m_cfg.
kDP;
3413 sbd->m_config.m_poseMatch =
m_cfg.
kMT;
3415 sbd->m_config.m_volume =
m_cfg.
kVC;
3416 sbd->m_config.m_rigidContactHardness =
m_cfg.
kCHR;
3417 sbd->m_config.m_kineticContactHardness =
m_cfg.
kKHR;
3418 sbd->m_config.m_softContactHardness =
m_cfg.
kSHR;
3419 sbd->m_config.m_anchorHardness =
m_cfg.
kAHR;
3423 sbd->m_config.m_softKineticClusterHardness =
m_cfg.
kSKHR_CL;
3450 for (
int i=0;i<numElem;i++,memPtr++)
3466 int sz =
sizeof(float);
3468 float* memPtr = (
float*) chunk->
m_oldPtr;
3469 for (
int i=0;i<numElem;i++,memPtr++)
3483 if (sbd->m_numClusters)
3485 int numElem = sbd->m_numClusters;
3489 for (
int i=0;i<numElem;i++,memPtr++)
3531 for (
int j=0;j<numElem;j++,memPtr++)
3533 m_clusters[i]->m_framerefs[j].serializeFloat(*memPtr);
3542 int sz =
sizeof(float);
3544 float* memPtr = (
float*) chunk->
m_oldPtr;
3545 for (
int j=0;j<numElem;j++,memPtr++)
3556 int sz =
sizeof(int);
3558 int* memPtr = (
int*) chunk->
m_oldPtr;
3559 for (
int j=0;j<numElem;j++,memPtr++)
3563 *memPtr = *indexPtr;
3584 for (
int i=0;i<numElem;i++,memPtr++)
3594 for (
int j=0;j<4;j++)
3601 if (
m_joints[i]->m_bodies[0].m_soft)
3606 if (
m_joints[i]->m_bodies[0].m_collisionObject)
3611 if (
m_joints[i]->m_bodies[0].m_rigid)
3617 if (
m_joints[i]->m_bodies[1].m_soft)
3622 if (
m_joints[i]->m_bodies[1].m_collisionObject)
3627 if (
m_joints[i]->m_bodies[1].m_rigid)