17 #ifndef _BT_SOFT_BODY_INTERNALS_H
18 #define _BT_SOFT_BODY_INTERNALS_H
38 void resize(
int n,
const T& init=T()) {
dim=n;
store.resize((n*(n+1))/2,init); }
85 aabbMin=aabbMax=crns[0];
131 for(
int i=1,ni=m_cluster->m_nodes.size();i<ni;++i)
140 return(localGetSupportingVertex(vec));
156 virtual const char*
getName()
const {
return "SOFTCLUSTER";}
173 template <
typename T>
176 memset(&value,0,
sizeof(T));
179 template <
typename T>
183 template <
typename T>
187 template <
typename T>
189 {
return(a+(b-a)*t); }
191 template <
typename T>
193 {
return((b+a*t-b*t)/(a*b)); }
200 r[0]=
Lerp(a[0],b[0],t);
201 r[1]=
Lerp(a[1],b[1],t);
202 r[2]=
Lerp(a[2],b[2],t);
209 if(sql>(maxlength*maxlength))
210 return((v*maxlength)/
btSqrt(sql));
215 template <
typename T>
216 static inline T
Clamp(
const T& x,
const T& l,
const T& h)
217 {
return(x<l?l:x>h?h:x); }
219 template <
typename T>
220 static inline T
Sq(
const T& x)
223 template <
typename T>
224 static inline T
Cube(
const T& x)
227 template <
typename T>
228 static inline T
Sign(
const T& x)
229 {
return((T)(x<0?-1:+1)); }
231 template <
typename T>
250 m[0]=
btVector3(1-xx+xx*s,xy*s-xy,zx*s-zx);
251 m[1]=
btVector3(xy*s-xy,1-yy+yy*s,yz*s-yz);
252 m[2]=
btVector3(zx*s-zx,yz*s-yz,1-zz+zz*s);
278 for(
int i=0;i<3;++i) r[i]=a[i]+b[i];
286 for(
int i=0;i<3;++i) r[i]=a[i]-b[i];
294 for(
int i=0;i<3;++i) r[i]=a[i]*b;
339 return(a*
btDot(v,a));
403 template <
typename T>
409 return(a*coord.
x()+b*coord.
y()+c*coord.
z());
420 const btScalar isum=1/(w[0]+w[1]+w[2]);
421 return(
btVector3(w[1]*isum,w[2]*isum,w[0]*isum));
429 const int maxiterations=256)
433 if(values[0]>values[1])
436 btSwap(values[0],values[1]);
438 if(values[0]>-accuracy)
return(-1);
439 if(values[1]<+accuracy)
return(-1);
440 for(
int i=0;i<maxiterations;++i)
442 const btScalar t=
Lerp(span[0],span[1],values[0]/(values[0]-values[1]));
444 if((t<=0)||(t>=1))
break;
445 if(
btFabs(v)<accuracy)
return(t);
447 { span[0]=t;values[0]=v; }
449 { span[1]=t;values[1]=v; }
547 if((a==ma)&&(b==mb))
return(0);
548 if((a==mb)&&(b==ma))
return(1);
561 static const int maxiterations=16;
570 if(
btFabs(a[p][q])>accuracy)
572 const btScalar w=(a[q][q]-a[p][p])/(2*a[p][q]);
584 }
while((++iterations)<maxiterations);
587 *values=
btVector3(a[0][0],a[1][1],a[2][2]);
594 const btScalar m[2][3]={ {a[p][0],a[p][1],a[p][2]},
595 {a[q][0],a[q][1],a[q][2]}};
598 for(i=0;i<3;++i) a[p][i]=c*m[0][i]-s*m[1][i];
599 for(i=0;i<3;++i) a[q][i]=c*m[1][i]+s*m[0][i];
603 const btScalar m[2][3]={ {a[0][p],a[1][p],a[2][p]},
604 {a[0][q],a[1][q],a[2][q]}};
607 for(i=0;i<3;++i) a[i][p]=c*m[0][i]-s*m[1][i];
608 for(i=0;i<3;++i) a[i][q]=c*m[1][i]+s*m[0][i];
707 if(m_colObjWrap->getCollisionObject()->isStaticOrKinematicObject() && cluster->
m_containsAnchor)
712 rshape,m_colObjWrap->getWorldTransform(),
716 if(SolveContact(res,cluster,m_colObjWrap->getCollisionObject(),joint))
719 *pj=joint;psb->m_joints.push_back(pj);
720 if(m_colObjWrap->getCollisionObject()->isStaticOrKinematicObject())
722 pj->
m_erp *= psb->m_cfg.kSKHR_CL;
723 pj->
m_split *= psb->m_cfg.kSK_SPLT_CL;
727 pj->
m_erp *= psb->m_cfg.kSRHR_CL;
728 pj->
m_split *= psb->m_cfg.kSR_SPLT_CL;
736 m_colObjWrap = colObWrap;
738 m_margin = m_colObjWrap->getCollisionShape()->getMargin()+psb->getCollisionShape()->getMargin();
740 friction =
btMin(psb->m_cfg.kDF,m_colObjWrap->getCollisionObject()->getFriction());
747 volume.Expand(
btVector3(1,1,1)*m_margin);
763 bool connected=
false;
764 if ((bodies[0]==bodies[1])&&(bodies[0]->m_clusterConnectivity.size()))
766 connected = bodies[0]->m_clusterConnectivity[cla->
m_clusterIndex+bodies[0]->m_clusters.size()*clb->m_clusterIndex];
776 cla->
m_com-clb->m_com,res))
779 if(SolveContact(res,cla,clb,joint))
782 *pj=joint;bodies[0]->m_joints.push_back(pj);
783 pj->
m_erp *=
btMax(bodies[0]->m_cfg.kSSHR_CL,bodies[1]->m_cfg.kSSHR_CL);
784 pj->
m_split *= (bodies[0]->m_cfg.kSS_SPLT_CL+bodies[1]->m_cfg.kSS_SPLT_CL)/2;
822 psb->checkContact(m_colObj1Wrap,n.
m_x,m,c.
m_cti))
825 const btScalar imb= m_rigidBody? m_rigidBody->getInvMass() : 0.f;
829 const btTransform& wtr=m_rigidBody?m_rigidBody->getWorldTransform() : m_colObj1Wrap->getCollisionObject()->getWorldTransform();
830 static const btMatrix3x3 iwiStatic(0,0,0,0,0,0,0,0,0);
831 const btMatrix3x3& iwi=m_rigidBody?m_rigidBody->getInvInertiaTensorWorld() : iwiStatic;
833 const btVector3 va=m_rigidBody ? m_rigidBody->getVelocityInLocalPoint(ra)*psb->m_sst.sdt :
btVector3(0,0,0);
838 const btScalar fc=psb->m_cfg.kDF*m_colObj1Wrap->getCollisionObject()->getFriction();
842 c.
m_c2 = ima*psb->m_sst.sdt;
844 c.
m_c4 = m_colObj1Wrap->getCollisionObject()->isStaticOrKinematicObject()?psb->m_cfg.kKHR:psb->m_cfg.kCHR;
845 psb->m_rcontacts.push_back(c);
847 m_rigidBody->activate();
881 if( (n[0]->m_im<=0)||
897 c.
m_cfm[0] = ma/ms*psb[0]->m_cfg.kSHR;
898 c.
m_cfm[1] = mb/ms*psb[1]->m_cfg.kSHR;
899 psb[0]->m_scontacts.push_back(c);
908 #endif //_BT_SOFT_BODY_INTERNALS_H