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;
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++)
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;
1774 for (
int c=0;c<3;c++)
1776 if (deltaV[c]>clampDeltaV)
1778 deltaV[c] = clampDeltaV;
1780 if (deltaV[c]<-clampDeltaV)
1782 deltaV[c]=-clampDeltaV;
1943 for(
int isolve=0;isolve<iterations;++isolve)
1961 const int nb=bodies.
size();
1971 bodies[i]->prepareClusters(iterations);
1973 for(i=0;i<iterations;++i)
1976 for(
int j=0;j<nb;++j)
1978 bodies[j]->solveClusters(sor);
1983 bodies[i]->cleanupClusters();
2009 const btScalar t=rayFromToTriangle( m_rayFrom,m_rayTo,m_rayNormalizedDirection,
2014 if((t>0)&&(t<m_mint))
2024 const btVector3& rayNormalizedDirection,
2040 if((t>teps)&&(t<maxt))
2042 const btVector3 hit=rayFrom+rayNormalizedDirection*t;
2057 #define PTR2IDX(_p_,_b_) reinterpret_cast<btSoftBody::Node*>((_p_)-(_b_))
2065 m_nodes[i].m_leaf->data=*(
void**)&i;
2080 m_faces[i].m_leaf->data=*(
void**)&i;
2089 for(
int j=0;j<
m_notes[i].m_rank;++j)
2100 #define IDX2PTR(_p_,_b_) map?(&(_b_)[map[(((char*)_p_)-(char*)0)]]): \
2101 (&(_b_)[(((char*)_p_)-(char*)0)])
2133 for(
int j=0;j<
m_notes[i].m_rank;++j)
2190 int tetfaces[4][3] = {{0,1,2},{0,1,3},{1,2,3},{0,2,3}};
2191 for (
int f=0;f<4;f++)
2194 int index0=tetfaces[f][0];
2195 int index1=tetfaces[f][1];
2196 int index2=tetfaces[f][2];
2358 Apq[0].setX(eps);Apq[1].setY(eps*2);Apq[2].setZ(eps*3);
2406 for(
int j=0;j<3;++j)
2433 for(
int j=0;j<3;++j)
2441 m_nodes[i].m_area *= 0.3333333f;
2507 ii[0][0] += m*(q[1]+q[2]);
2508 ii[1][1] += m*(q[0]+q[2]);
2509 ii[2][2] += m*(q[0]+q[1]);
2510 ii[0][1] -= m*k[0]*k[1];
2511 ii[0][2] -= m*k[0]*k[2];
2512 ii[1][2] -= m*k[1]*k[2];
2560 m[0]+=a[0]*b;m[1]+=a[1]*b;m[2]+=a[2]*b;
2576 c.
m_invwi=c.m_xform.getBasis().scaled(iin)*c.m_xform.getBasis().transpose();
2579 for(
int i=0;i<n;++i)
2584 c.
m_invwi[0][0] += m*(q[1]+q[2]);
2585 c.
m_invwi[1][1] += m*(q[0]+q[2]);
2586 c.
m_invwi[2][2] += m*(q[0]+q[1]);
2587 c.
m_invwi[0][1] -= m*k[0]*k[1];
2588 c.
m_invwi[0][2] -= m*k[0]*k[2];
2589 c.
m_invwi[1][2] -= m*k[1]*k[2];
2633 for(
int j=1;j<n;++j)
2728 for(i=0;i<deltas.
size();++i)
2732 m_nodes[i].m_x+=deltas[i]/weights[i];
2766 m_bodies[0].activate();
2767 m_bodies[1].activate();
2775 m_rpos[0] = m_bodies[0].xform()*m_refs[0];
2776 m_rpos[1] = m_bodies[1].xform()*m_refs[1];
2777 m_drift =
Clamp(m_rpos[0]-m_rpos[1],maxdrift)*m_erp/dt;
2778 m_rpos[0] -= m_bodies[0].xform().getOrigin();
2779 m_rpos[1] -= m_bodies[1].xform().getOrigin();
2780 m_massmatrix =
ImpulseMatrix( m_bodies[0].invMass(),m_bodies[0].invWorldInertia(),m_rpos[0],
2781 m_bodies[1].invMass(),m_bodies[1].invWorldInertia(),m_rpos[1]);
2784 m_sdrift = m_massmatrix*(m_drift*m_split);
2785 m_drift *= 1-m_split;
2793 const btVector3 va=m_bodies[0].velocity(m_rpos[0]);
2794 const btVector3 vb=m_bodies[1].velocity(m_rpos[1]);
2798 impulse.
m_velocity = m_massmatrix*(m_drift+vr*m_cfm)*sor;
2799 m_bodies[0].applyImpulse(-impulse,m_rpos[0]);
2800 m_bodies[1].applyImpulse( impulse,m_rpos[1]);
2808 m_bodies[0].applyDImpulse(-m_sdrift,m_rpos[0]);
2809 m_bodies[1].applyDImpulse( m_sdrift,m_rpos[1]);
2817 m_icontrol->Prepare(
this);
2819 m_axis[0] = m_bodies[0].xform().getBasis()*m_refs[0];
2820 m_axis[1] = m_bodies[1].xform().getBasis()*m_refs[1];
2822 m_drift *=
btMin(maxdrift,
btAcos(Clamp<btScalar>(
btDot(m_axis[0],m_axis[1]),-1,+1)));
2823 m_drift *= m_erp/dt;
2824 m_massmatrix=
AngularImpulseMatrix(m_bodies[0].invWorldInertia(),m_bodies[1].invWorldInertia());
2827 m_sdrift = m_massmatrix*(m_drift*m_split);
2828 m_drift *= 1-m_split;
2836 const btVector3 va=m_bodies[0].angularVelocity();
2837 const btVector3 vb=m_bodies[1].angularVelocity();
2840 const btVector3 vc=vr-m_axis[0]*m_icontrol->Speed(
this,sp);
2843 impulse.
m_velocity = m_massmatrix*(m_drift+vc*m_cfm)*sor;
2844 m_bodies[0].applyAImpulse(-impulse);
2845 m_bodies[1].applyAImpulse( impulse);
2853 m_bodies[0].applyDAImpulse(-m_sdrift);
2854 m_bodies[1].applyDAImpulse( m_sdrift);
2862 const bool dodrift=(m_life==0);
2863 m_delete=(++m_life)>m_maxlife;
2866 m_drift=m_drift*m_erp/dt;
2869 m_sdrift = m_massmatrix*(m_drift*m_split);
2870 m_drift *= 1-m_split;
2883 const btVector3 va=m_bodies[0].velocity(m_rpos[0]);
2884 const btVector3 vb=m_bodies[1].velocity(m_rpos[1]);
2898 if (m_bodies[0].m_soft==m_bodies[1].m_soft)
2905 if (impulse.
m_velocity.
length() <m_bodies[0].m_soft->m_maxSelfCollisionImpulse)
2910 m_bodies[0].applyImpulse(-impulse*m_bodies[0].m_soft->m_selfCollisionImpulseFactor,m_rpos[0]);
2911 m_bodies[1].applyImpulse( impulse*m_bodies[0].m_soft->m_selfCollisionImpulseFactor,m_rpos[1]);
2917 m_bodies[0].applyImpulse(-impulse,m_rpos[0]);
2918 m_bodies[1].applyImpulse( impulse,m_rpos[1]);
2927 m_bodies[0].applyDImpulse(-m_sdrift,m_rpos[0]);
2928 m_bodies[1].applyDImpulse( m_sdrift,m_rpos[1]);
2942 const bool as_lift = kLF>0;
2943 const bool as_drag = kDG>0;
2944 const bool as_pressure = kPR!=0;
2945 const bool as_volume = kVC>0;
2946 const bool as_aero = as_lift ||
2952 const bool use_medium = as_aero;
2953 const bool use_volume = as_pressure ||
2962 ivolumetp = 1/
btFabs(volume)*kPR;
3172 volume.Expand(
btVector3(basemargin,basemargin,basemargin));
3173 docollide.
psb =
this;
3177 docollide.
dynmargin = basemargin+timemargin;
3219 docollide.
psb[0]=
this;
3220 docollide.
psb[1]=psb;
3225 docollide.
psb[0]=psb;
3226 docollide.
psb[1]=
this;
3273 if (sbd->m_materials)
3276 int numElem = sbd->m_numMaterials;
3280 for (
int i=0;i<numElem;i++,memPtr++)
3307 int numElem = sbd->m_numNodes;
3310 for (
int i=0;i<numElem;i++,memPtr++)
3331 int numElem = sbd->m_numLinks;
3334 for (
int i=0;i<numElem;i++,memPtr++)
3354 int numElem = sbd->m_numFaces;
3357 for (
int i=0;i<numElem;i++,memPtr++)
3361 for (
int j=0;j<3;j++)
3373 if (sbd->m_tetrahedra)
3376 int numElem = sbd->m_numTetrahedra;
3379 for (
int i=0;i<numElem;i++,memPtr++)
3381 for (
int j=0;j<4;j++)
3399 int numElem = sbd->m_numAnchors;
3402 for (
int i=0;i<numElem;i++,memPtr++)
3417 sbd->m_config.m_dynamicFriction =
m_cfg.
kDF;
3419 sbd->m_config.m_pressure =
m_cfg.
kPR;
3428 sbd->m_config.m_damping =
m_cfg.
kDP;
3429 sbd->m_config.m_poseMatch =
m_cfg.
kMT;
3431 sbd->m_config.m_volume =
m_cfg.
kVC;
3432 sbd->m_config.m_rigidContactHardness =
m_cfg.
kCHR;
3433 sbd->m_config.m_kineticContactHardness =
m_cfg.
kKHR;
3434 sbd->m_config.m_softContactHardness =
m_cfg.
kSHR;
3435 sbd->m_config.m_anchorHardness =
m_cfg.
kAHR;
3439 sbd->m_config.m_softKineticClusterHardness =
m_cfg.
kSKHR_CL;
3466 for (
int i=0;i<numElem;i++,memPtr++)
3482 int sz =
sizeof(float);
3484 float* memPtr = (
float*) chunk->
m_oldPtr;
3485 for (
int i=0;i<numElem;i++,memPtr++)
3499 if (sbd->m_numClusters)
3501 int numElem = sbd->m_numClusters;
3505 for (
int i=0;i<numElem;i++,memPtr++)
3547 for (
int j=0;j<numElem;j++,memPtr++)
3549 m_clusters[i]->m_framerefs[j].serializeFloat(*memPtr);
3558 int sz =
sizeof(float);
3560 float* memPtr = (
float*) chunk->
m_oldPtr;
3561 for (
int j=0;j<numElem;j++,memPtr++)
3572 int sz =
sizeof(int);
3574 int* memPtr = (
int*) chunk->
m_oldPtr;
3575 for (
int j=0;j<numElem;j++,memPtr++)
3579 *memPtr = *indexPtr;
3600 for (
int i=0;i<numElem;i++,memPtr++)
3610 for (
int j=0;j<4;j++)
3617 if (
m_joints[i]->m_bodies[0].m_soft)
3622 if (
m_joints[i]->m_bodies[0].m_collisionObject)
3627 if (
m_joints[i]->m_bodies[0].m_rigid)
3633 if (
m_joints[i]->m_bodies[1].m_soft)
3638 if (
m_joints[i]->m_bodies[1].m_collisionObject)
3643 if (
m_joints[i]->m_bodies[1].m_rigid)