btSoftBody.cpp 92 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710
  1. /*
  2. Bullet Continuous Collision Detection and Physics Library
  3. Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
  4. This software is provided 'as-is', without any express or implied warranty.
  5. In no event will the authors be held liable for any damages arising from the use of this software.
  6. Permission is granted to anyone to use this software for any purpose,
  7. including commercial applications, and to alter it and redistribute it freely,
  8. subject to the following restrictions:
  9. 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
  10. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
  11. 3. This notice may not be removed or altered from any source distribution.
  12. */
  13. ///btSoftBody implementation by Nathanael Presson
  14. #include "btSoftBodyInternals.h"
  15. #include "BulletSoftBody/btSoftBodySolvers.h"
  16. #include "btSoftBodyData.h"
  17. #include "LinearMath/btSerializer.h"
  18. #include "BulletDynamics/Featherstone/btMultiBodyLinkCollider.h"
  19. #include "BulletDynamics/Featherstone/btMultiBodyConstraint.h"
  20. //
  21. btSoftBody::btSoftBody(btSoftBodyWorldInfo* worldInfo,int node_count, const btVector3* x, const btScalar* m)
  22. :m_softBodySolver(0),m_worldInfo(worldInfo)
  23. {
  24. /* Init */
  25. initDefaults();
  26. /* Default material */
  27. Material* pm=appendMaterial();
  28. pm->m_kLST = 1;
  29. pm->m_kAST = 1;
  30. pm->m_kVST = 1;
  31. pm->m_flags = fMaterial::Default;
  32. /* Nodes */
  33. const btScalar margin=getCollisionShape()->getMargin();
  34. m_nodes.resize(node_count);
  35. for(int i=0,ni=node_count;i<ni;++i)
  36. {
  37. Node& n=m_nodes[i];
  38. ZeroInitialize(n);
  39. n.m_x = x?*x++:btVector3(0,0,0);
  40. n.m_q = n.m_x;
  41. n.m_im = m?*m++:1;
  42. n.m_im = n.m_im>0?1/n.m_im:0;
  43. n.m_leaf = m_ndbvt.insert(btDbvtVolume::FromCR(n.m_x,margin),&n);
  44. n.m_material= pm;
  45. }
  46. updateBounds();
  47. }
  48. btSoftBody::btSoftBody(btSoftBodyWorldInfo* worldInfo)
  49. :m_worldInfo(worldInfo)
  50. {
  51. initDefaults();
  52. }
  53. void btSoftBody::initDefaults()
  54. {
  55. m_internalType = CO_SOFT_BODY;
  56. m_cfg.aeromodel = eAeroModel::V_Point;
  57. m_cfg.kVCF = 1;
  58. m_cfg.kDG = 0;
  59. m_cfg.kLF = 0;
  60. m_cfg.kDP = 0;
  61. m_cfg.kPR = 0;
  62. m_cfg.kVC = 0;
  63. m_cfg.kDF = (btScalar)0.2;
  64. m_cfg.kMT = 0;
  65. m_cfg.kCHR = (btScalar)1.0;
  66. m_cfg.kKHR = (btScalar)0.1;
  67. m_cfg.kSHR = (btScalar)1.0;
  68. m_cfg.kAHR = (btScalar)0.7;
  69. m_cfg.kSRHR_CL = (btScalar)0.1;
  70. m_cfg.kSKHR_CL = (btScalar)1;
  71. m_cfg.kSSHR_CL = (btScalar)0.5;
  72. m_cfg.kSR_SPLT_CL = (btScalar)0.5;
  73. m_cfg.kSK_SPLT_CL = (btScalar)0.5;
  74. m_cfg.kSS_SPLT_CL = (btScalar)0.5;
  75. m_cfg.maxvolume = (btScalar)1;
  76. m_cfg.timescale = 1;
  77. m_cfg.viterations = 0;
  78. m_cfg.piterations = 1;
  79. m_cfg.diterations = 0;
  80. m_cfg.citerations = 4;
  81. m_cfg.collisions = fCollision::Default;
  82. m_pose.m_bvolume = false;
  83. m_pose.m_bframe = false;
  84. m_pose.m_volume = 0;
  85. m_pose.m_com = btVector3(0,0,0);
  86. m_pose.m_rot.setIdentity();
  87. m_pose.m_scl.setIdentity();
  88. m_tag = 0;
  89. m_timeacc = 0;
  90. m_bUpdateRtCst = true;
  91. m_bounds[0] = btVector3(0,0,0);
  92. m_bounds[1] = btVector3(0,0,0);
  93. m_worldTransform.setIdentity();
  94. setSolver(eSolverPresets::Positions);
  95. /* Collision shape */
  96. ///for now, create a collision shape internally
  97. m_collisionShape = new btSoftBodyCollisionShape(this);
  98. m_collisionShape->setMargin(0.25f);
  99. m_initialWorldTransform.setIdentity();
  100. m_windVelocity = btVector3(0,0,0);
  101. m_restLengthScale = btScalar(1.0);
  102. }
  103. //
  104. btSoftBody::~btSoftBody()
  105. {
  106. //for now, delete the internal shape
  107. delete m_collisionShape;
  108. int i;
  109. releaseClusters();
  110. for(i=0;i<m_materials.size();++i)
  111. btAlignedFree(m_materials[i]);
  112. for(i=0;i<m_joints.size();++i)
  113. btAlignedFree(m_joints[i]);
  114. }
  115. //
  116. bool btSoftBody::checkLink(int node0,int node1) const
  117. {
  118. return(checkLink(&m_nodes[node0],&m_nodes[node1]));
  119. }
  120. //
  121. bool btSoftBody::checkLink(const Node* node0,const Node* node1) const
  122. {
  123. const Node* n[]={node0,node1};
  124. for(int i=0,ni=m_links.size();i<ni;++i)
  125. {
  126. const Link& l=m_links[i];
  127. if( (l.m_n[0]==n[0]&&l.m_n[1]==n[1])||
  128. (l.m_n[0]==n[1]&&l.m_n[1]==n[0]))
  129. {
  130. return(true);
  131. }
  132. }
  133. return(false);
  134. }
  135. //
  136. bool btSoftBody::checkFace(int node0,int node1,int node2) const
  137. {
  138. const Node* n[]={ &m_nodes[node0],
  139. &m_nodes[node1],
  140. &m_nodes[node2]};
  141. for(int i=0,ni=m_faces.size();i<ni;++i)
  142. {
  143. const Face& f=m_faces[i];
  144. int c=0;
  145. for(int j=0;j<3;++j)
  146. {
  147. if( (f.m_n[j]==n[0])||
  148. (f.m_n[j]==n[1])||
  149. (f.m_n[j]==n[2])) c|=1<<j; else break;
  150. }
  151. if(c==7) return(true);
  152. }
  153. return(false);
  154. }
  155. //
  156. btSoftBody::Material* btSoftBody::appendMaterial()
  157. {
  158. Material* pm=new(btAlignedAlloc(sizeof(Material),16)) Material();
  159. if(m_materials.size()>0)
  160. *pm=*m_materials[0];
  161. else
  162. ZeroInitialize(*pm);
  163. m_materials.push_back(pm);
  164. return(pm);
  165. }
  166. //
  167. void btSoftBody::appendNote( const char* text,
  168. const btVector3& o,
  169. const btVector4& c,
  170. Node* n0,
  171. Node* n1,
  172. Node* n2,
  173. Node* n3)
  174. {
  175. Note n;
  176. ZeroInitialize(n);
  177. n.m_rank = 0;
  178. n.m_text = text;
  179. n.m_offset = o;
  180. n.m_coords[0] = c.x();
  181. n.m_coords[1] = c.y();
  182. n.m_coords[2] = c.z();
  183. n.m_coords[3] = c.w();
  184. n.m_nodes[0] = n0;n.m_rank+=n0?1:0;
  185. n.m_nodes[1] = n1;n.m_rank+=n1?1:0;
  186. n.m_nodes[2] = n2;n.m_rank+=n2?1:0;
  187. n.m_nodes[3] = n3;n.m_rank+=n3?1:0;
  188. m_notes.push_back(n);
  189. }
  190. //
  191. void btSoftBody::appendNote( const char* text,
  192. const btVector3& o,
  193. Node* feature)
  194. {
  195. appendNote(text,o,btVector4(1,0,0,0),feature);
  196. }
  197. //
  198. void btSoftBody::appendNote( const char* text,
  199. const btVector3& o,
  200. Link* feature)
  201. {
  202. static const btScalar w=1/(btScalar)2;
  203. appendNote(text,o,btVector4(w,w,0,0), feature->m_n[0],
  204. feature->m_n[1]);
  205. }
  206. //
  207. void btSoftBody::appendNote( const char* text,
  208. const btVector3& o,
  209. Face* feature)
  210. {
  211. static const btScalar w=1/(btScalar)3;
  212. appendNote(text,o,btVector4(w,w,w,0), feature->m_n[0],
  213. feature->m_n[1],
  214. feature->m_n[2]);
  215. }
  216. //
  217. void btSoftBody::appendNode( const btVector3& x,btScalar m)
  218. {
  219. if(m_nodes.capacity()==m_nodes.size())
  220. {
  221. pointersToIndices();
  222. m_nodes.reserve(m_nodes.size()*2+1);
  223. indicesToPointers();
  224. }
  225. const btScalar margin=getCollisionShape()->getMargin();
  226. m_nodes.push_back(Node());
  227. Node& n=m_nodes[m_nodes.size()-1];
  228. ZeroInitialize(n);
  229. n.m_x = x;
  230. n.m_q = n.m_x;
  231. n.m_im = m>0?1/m:0;
  232. n.m_material = m_materials[0];
  233. n.m_leaf = m_ndbvt.insert(btDbvtVolume::FromCR(n.m_x,margin),&n);
  234. }
  235. //
  236. void btSoftBody::appendLink(int model,Material* mat)
  237. {
  238. Link l;
  239. if(model>=0)
  240. l=m_links[model];
  241. else
  242. { ZeroInitialize(l);l.m_material=mat?mat:m_materials[0]; }
  243. m_links.push_back(l);
  244. }
  245. //
  246. void btSoftBody::appendLink( int node0,
  247. int node1,
  248. Material* mat,
  249. bool bcheckexist)
  250. {
  251. appendLink(&m_nodes[node0],&m_nodes[node1],mat,bcheckexist);
  252. }
  253. //
  254. void btSoftBody::appendLink( Node* node0,
  255. Node* node1,
  256. Material* mat,
  257. bool bcheckexist)
  258. {
  259. if((!bcheckexist)||(!checkLink(node0,node1)))
  260. {
  261. appendLink(-1,mat);
  262. Link& l=m_links[m_links.size()-1];
  263. l.m_n[0] = node0;
  264. l.m_n[1] = node1;
  265. l.m_rl = (l.m_n[0]->m_x-l.m_n[1]->m_x).length();
  266. m_bUpdateRtCst=true;
  267. }
  268. }
  269. //
  270. void btSoftBody::appendFace(int model,Material* mat)
  271. {
  272. Face f;
  273. if(model>=0)
  274. { f=m_faces[model]; }
  275. else
  276. { ZeroInitialize(f);f.m_material=mat?mat:m_materials[0]; }
  277. m_faces.push_back(f);
  278. }
  279. //
  280. void btSoftBody::appendFace(int node0,int node1,int node2,Material* mat)
  281. {
  282. if (node0==node1)
  283. return;
  284. if (node1==node2)
  285. return;
  286. if (node2==node0)
  287. return;
  288. appendFace(-1,mat);
  289. Face& f=m_faces[m_faces.size()-1];
  290. btAssert(node0!=node1);
  291. btAssert(node1!=node2);
  292. btAssert(node2!=node0);
  293. f.m_n[0] = &m_nodes[node0];
  294. f.m_n[1] = &m_nodes[node1];
  295. f.m_n[2] = &m_nodes[node2];
  296. f.m_ra = AreaOf( f.m_n[0]->m_x,
  297. f.m_n[1]->m_x,
  298. f.m_n[2]->m_x);
  299. m_bUpdateRtCst=true;
  300. }
  301. //
  302. void btSoftBody::appendTetra(int model,Material* mat)
  303. {
  304. Tetra t;
  305. if(model>=0)
  306. t=m_tetras[model];
  307. else
  308. { ZeroInitialize(t);t.m_material=mat?mat:m_materials[0]; }
  309. m_tetras.push_back(t);
  310. }
  311. //
  312. void btSoftBody::appendTetra(int node0,
  313. int node1,
  314. int node2,
  315. int node3,
  316. Material* mat)
  317. {
  318. appendTetra(-1,mat);
  319. Tetra& t=m_tetras[m_tetras.size()-1];
  320. t.m_n[0] = &m_nodes[node0];
  321. t.m_n[1] = &m_nodes[node1];
  322. t.m_n[2] = &m_nodes[node2];
  323. t.m_n[3] = &m_nodes[node3];
  324. t.m_rv = VolumeOf(t.m_n[0]->m_x,t.m_n[1]->m_x,t.m_n[2]->m_x,t.m_n[3]->m_x);
  325. m_bUpdateRtCst=true;
  326. }
  327. //
  328. void btSoftBody::appendAnchor(int node,btRigidBody* body, bool disableCollisionBetweenLinkedBodies,btScalar influence)
  329. {
  330. btVector3 local = body->getWorldTransform().inverse()*m_nodes[node].m_x;
  331. appendAnchor(node,body,local,disableCollisionBetweenLinkedBodies,influence);
  332. }
  333. //
  334. void btSoftBody::appendAnchor(int node,btRigidBody* body, const btVector3& localPivot,bool disableCollisionBetweenLinkedBodies,btScalar influence)
  335. {
  336. if (disableCollisionBetweenLinkedBodies)
  337. {
  338. if (m_collisionDisabledObjects.findLinearSearch(body)==m_collisionDisabledObjects.size())
  339. {
  340. m_collisionDisabledObjects.push_back(body);
  341. }
  342. }
  343. Anchor a;
  344. a.m_node = &m_nodes[node];
  345. a.m_body = body;
  346. a.m_local = localPivot;
  347. a.m_node->m_battach = 1;
  348. a.m_influence = influence;
  349. m_anchors.push_back(a);
  350. }
  351. //
  352. void btSoftBody::appendLinearJoint(const LJoint::Specs& specs,Cluster* body0,Body body1)
  353. {
  354. LJoint* pj = new(btAlignedAlloc(sizeof(LJoint),16)) LJoint();
  355. pj->m_bodies[0] = body0;
  356. pj->m_bodies[1] = body1;
  357. pj->m_refs[0] = pj->m_bodies[0].xform().inverse()*specs.position;
  358. pj->m_refs[1] = pj->m_bodies[1].xform().inverse()*specs.position;
  359. pj->m_cfm = specs.cfm;
  360. pj->m_erp = specs.erp;
  361. pj->m_split = specs.split;
  362. m_joints.push_back(pj);
  363. }
  364. //
  365. void btSoftBody::appendLinearJoint(const LJoint::Specs& specs,Body body)
  366. {
  367. appendLinearJoint(specs,m_clusters[0],body);
  368. }
  369. //
  370. void btSoftBody::appendLinearJoint(const LJoint::Specs& specs,btSoftBody* body)
  371. {
  372. appendLinearJoint(specs,m_clusters[0],body->m_clusters[0]);
  373. }
  374. //
  375. void btSoftBody::appendAngularJoint(const AJoint::Specs& specs,Cluster* body0,Body body1)
  376. {
  377. AJoint* pj = new(btAlignedAlloc(sizeof(AJoint),16)) AJoint();
  378. pj->m_bodies[0] = body0;
  379. pj->m_bodies[1] = body1;
  380. pj->m_refs[0] = pj->m_bodies[0].xform().inverse().getBasis()*specs.axis;
  381. pj->m_refs[1] = pj->m_bodies[1].xform().inverse().getBasis()*specs.axis;
  382. pj->m_cfm = specs.cfm;
  383. pj->m_erp = specs.erp;
  384. pj->m_split = specs.split;
  385. pj->m_icontrol = specs.icontrol;
  386. m_joints.push_back(pj);
  387. }
  388. //
  389. void btSoftBody::appendAngularJoint(const AJoint::Specs& specs,Body body)
  390. {
  391. appendAngularJoint(specs,m_clusters[0],body);
  392. }
  393. //
  394. void btSoftBody::appendAngularJoint(const AJoint::Specs& specs,btSoftBody* body)
  395. {
  396. appendAngularJoint(specs,m_clusters[0],body->m_clusters[0]);
  397. }
  398. //
  399. void btSoftBody::addForce(const btVector3& force)
  400. {
  401. for(int i=0,ni=m_nodes.size();i<ni;++i) addForce(force,i);
  402. }
  403. //
  404. void btSoftBody::addForce(const btVector3& force,int node)
  405. {
  406. Node& n=m_nodes[node];
  407. if(n.m_im>0)
  408. {
  409. n.m_f += force;
  410. }
  411. }
  412. void btSoftBody::addAeroForceToNode(const btVector3& windVelocity,int nodeIndex)
  413. {
  414. btAssert(nodeIndex >= 0 && nodeIndex < m_nodes.size());
  415. const btScalar dt = m_sst.sdt;
  416. const btScalar kLF = m_cfg.kLF;
  417. const btScalar kDG = m_cfg.kDG;
  418. //const btScalar kPR = m_cfg.kPR;
  419. //const btScalar kVC = m_cfg.kVC;
  420. const bool as_lift = kLF>0;
  421. const bool as_drag = kDG>0;
  422. const bool as_aero = as_lift || as_drag;
  423. const bool as_vaero = as_aero && (m_cfg.aeromodel < btSoftBody::eAeroModel::F_TwoSided);
  424. Node& n = m_nodes[nodeIndex];
  425. if( n.m_im>0 )
  426. {
  427. btSoftBody::sMedium medium;
  428. EvaluateMedium(m_worldInfo, n.m_x, medium);
  429. medium.m_velocity = windVelocity;
  430. medium.m_density = m_worldInfo->air_density;
  431. /* Aerodynamics */
  432. if(as_vaero)
  433. {
  434. const btVector3 rel_v = n.m_v - medium.m_velocity;
  435. const btScalar rel_v_len = rel_v.length();
  436. const btScalar rel_v2 = rel_v.length2();
  437. if(rel_v2>SIMD_EPSILON)
  438. {
  439. const btVector3 rel_v_nrm = rel_v.normalized();
  440. btVector3 nrm = n.m_n;
  441. if (m_cfg.aeromodel == btSoftBody::eAeroModel::V_TwoSidedLiftDrag)
  442. {
  443. nrm *= (btScalar)( (btDot(nrm,rel_v) < 0) ? -1 : +1);
  444. btVector3 fDrag(0, 0, 0);
  445. btVector3 fLift(0, 0, 0);
  446. btScalar n_dot_v = nrm.dot(rel_v_nrm);
  447. btScalar tri_area = 0.5f * n.m_area;
  448. fDrag = 0.5f * kDG * medium.m_density * rel_v2 * tri_area * n_dot_v * (-rel_v_nrm);
  449. // Check angle of attack
  450. // cos(10º) = 0.98480
  451. if ( 0 < n_dot_v && n_dot_v < 0.98480f)
  452. 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));
  453. // Check if the velocity change resulted by aero drag force exceeds the current velocity of the node.
  454. btVector3 del_v_by_fDrag = fDrag*n.m_im*m_sst.sdt;
  455. btScalar del_v_by_fDrag_len2 = del_v_by_fDrag.length2();
  456. btScalar v_len2 = n.m_v.length2();
  457. if (del_v_by_fDrag_len2 >= v_len2 && del_v_by_fDrag_len2 > 0)
  458. {
  459. btScalar del_v_by_fDrag_len = del_v_by_fDrag.length();
  460. btScalar v_len = n.m_v.length();
  461. fDrag *= btScalar(0.8)*(v_len / del_v_by_fDrag_len);
  462. }
  463. n.m_f += fDrag;
  464. n.m_f += fLift;
  465. }
  466. else if (m_cfg.aeromodel == btSoftBody::eAeroModel::V_Point || m_cfg.aeromodel == btSoftBody::eAeroModel::V_OneSided || m_cfg.aeromodel == btSoftBody::eAeroModel::V_TwoSided)
  467. {
  468. if (m_cfg.aeromodel == btSoftBody::eAeroModel::V_TwoSided)
  469. nrm *= (btScalar)( (btDot(nrm,rel_v) < 0) ? -1 : +1);
  470. const btScalar dvn = btDot(rel_v,nrm);
  471. /* Compute forces */
  472. if(dvn>0)
  473. {
  474. btVector3 force(0,0,0);
  475. const btScalar c0 = n.m_area * dvn * rel_v2/2;
  476. const btScalar c1 = c0 * medium.m_density;
  477. force += nrm*(-c1*kLF);
  478. force += rel_v.normalized() * (-c1 * kDG);
  479. ApplyClampedForce(n, force, dt);
  480. }
  481. }
  482. }
  483. }
  484. }
  485. }
  486. void btSoftBody::addAeroForceToFace(const btVector3& windVelocity,int faceIndex)
  487. {
  488. const btScalar dt = m_sst.sdt;
  489. const btScalar kLF = m_cfg.kLF;
  490. const btScalar kDG = m_cfg.kDG;
  491. // const btScalar kPR = m_cfg.kPR;
  492. // const btScalar kVC = m_cfg.kVC;
  493. const bool as_lift = kLF>0;
  494. const bool as_drag = kDG>0;
  495. const bool as_aero = as_lift || as_drag;
  496. const bool as_faero = as_aero && (m_cfg.aeromodel >= btSoftBody::eAeroModel::F_TwoSided);
  497. if(as_faero)
  498. {
  499. btSoftBody::Face& f=m_faces[faceIndex];
  500. btSoftBody::sMedium medium;
  501. const btVector3 v=(f.m_n[0]->m_v+f.m_n[1]->m_v+f.m_n[2]->m_v)/3;
  502. const btVector3 x=(f.m_n[0]->m_x+f.m_n[1]->m_x+f.m_n[2]->m_x)/3;
  503. EvaluateMedium(m_worldInfo,x,medium);
  504. medium.m_velocity = windVelocity;
  505. medium.m_density = m_worldInfo->air_density;
  506. const btVector3 rel_v=v-medium.m_velocity;
  507. const btScalar rel_v_len = rel_v.length();
  508. const btScalar rel_v2=rel_v.length2();
  509. if(rel_v2>SIMD_EPSILON)
  510. {
  511. const btVector3 rel_v_nrm = rel_v.normalized();
  512. btVector3 nrm = f.m_normal;
  513. if (m_cfg.aeromodel == btSoftBody::eAeroModel::F_TwoSidedLiftDrag)
  514. {
  515. nrm *= (btScalar)( (btDot(nrm,rel_v) < 0) ? -1 : +1);
  516. btVector3 fDrag(0, 0, 0);
  517. btVector3 fLift(0, 0, 0);
  518. btScalar n_dot_v = nrm.dot(rel_v_nrm);
  519. btScalar tri_area = 0.5f * f.m_ra;
  520. fDrag = 0.5f * kDG * medium.m_density * rel_v2 * tri_area * n_dot_v * (-rel_v_nrm);
  521. // Check angle of attack
  522. // cos(10º) = 0.98480
  523. if ( 0 < n_dot_v && n_dot_v < 0.98480f)
  524. 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));
  525. fDrag /= 3;
  526. fLift /= 3;
  527. for(int j=0;j<3;++j)
  528. {
  529. if (f.m_n[j]->m_im>0)
  530. {
  531. // Check if the velocity change resulted by aero drag force exceeds the current velocity of the node.
  532. btVector3 del_v_by_fDrag = fDrag*f.m_n[j]->m_im*m_sst.sdt;
  533. btScalar del_v_by_fDrag_len2 = del_v_by_fDrag.length2();
  534. btScalar v_len2 = f.m_n[j]->m_v.length2();
  535. if (del_v_by_fDrag_len2 >= v_len2 && del_v_by_fDrag_len2 > 0)
  536. {
  537. btScalar del_v_by_fDrag_len = del_v_by_fDrag.length();
  538. btScalar v_len = f.m_n[j]->m_v.length();
  539. fDrag *= btScalar(0.8)*(v_len / del_v_by_fDrag_len);
  540. }
  541. f.m_n[j]->m_f += fDrag;
  542. f.m_n[j]->m_f += fLift;
  543. }
  544. }
  545. }
  546. else if (m_cfg.aeromodel == btSoftBody::eAeroModel::F_OneSided || m_cfg.aeromodel == btSoftBody::eAeroModel::F_TwoSided)
  547. {
  548. if (m_cfg.aeromodel == btSoftBody::eAeroModel::F_TwoSided)
  549. nrm *= (btScalar)( (btDot(nrm,rel_v) < 0) ? -1 : +1);
  550. const btScalar dvn=btDot(rel_v,nrm);
  551. /* Compute forces */
  552. if(dvn>0)
  553. {
  554. btVector3 force(0,0,0);
  555. const btScalar c0 = f.m_ra*dvn*rel_v2;
  556. const btScalar c1 = c0*medium.m_density;
  557. force += nrm*(-c1*kLF);
  558. force += rel_v.normalized()*(-c1*kDG);
  559. force /= 3;
  560. for(int j=0;j<3;++j) ApplyClampedForce(*f.m_n[j],force,dt);
  561. }
  562. }
  563. }
  564. }
  565. }
  566. //
  567. void btSoftBody::addVelocity(const btVector3& velocity)
  568. {
  569. for(int i=0,ni=m_nodes.size();i<ni;++i) addVelocity(velocity,i);
  570. }
  571. /* Set velocity for the entire body */
  572. void btSoftBody::setVelocity( const btVector3& velocity)
  573. {
  574. for(int i=0,ni=m_nodes.size();i<ni;++i)
  575. {
  576. Node& n=m_nodes[i];
  577. if(n.m_im>0)
  578. {
  579. n.m_v = velocity;
  580. }
  581. }
  582. }
  583. //
  584. void btSoftBody::addVelocity(const btVector3& velocity,int node)
  585. {
  586. Node& n=m_nodes[node];
  587. if(n.m_im>0)
  588. {
  589. n.m_v += velocity;
  590. }
  591. }
  592. //
  593. void btSoftBody::setMass(int node,btScalar mass)
  594. {
  595. m_nodes[node].m_im=mass>0?1/mass:0;
  596. m_bUpdateRtCst=true;
  597. }
  598. //
  599. btScalar btSoftBody::getMass(int node) const
  600. {
  601. return(m_nodes[node].m_im>0?1/m_nodes[node].m_im:0);
  602. }
  603. //
  604. btScalar btSoftBody::getTotalMass() const
  605. {
  606. btScalar mass=0;
  607. for(int i=0;i<m_nodes.size();++i)
  608. {
  609. mass+=getMass(i);
  610. }
  611. return(mass);
  612. }
  613. //
  614. void btSoftBody::setTotalMass(btScalar mass,bool fromfaces)
  615. {
  616. int i;
  617. if(fromfaces)
  618. {
  619. for(i=0;i<m_nodes.size();++i)
  620. {
  621. m_nodes[i].m_im=0;
  622. }
  623. for(i=0;i<m_faces.size();++i)
  624. {
  625. const Face& f=m_faces[i];
  626. const btScalar twicearea=AreaOf( f.m_n[0]->m_x,
  627. f.m_n[1]->m_x,
  628. f.m_n[2]->m_x);
  629. for(int j=0;j<3;++j)
  630. {
  631. f.m_n[j]->m_im+=twicearea;
  632. }
  633. }
  634. for( i=0;i<m_nodes.size();++i)
  635. {
  636. m_nodes[i].m_im=1/m_nodes[i].m_im;
  637. }
  638. }
  639. const btScalar tm=getTotalMass();
  640. const btScalar itm=1/tm;
  641. for( i=0;i<m_nodes.size();++i)
  642. {
  643. m_nodes[i].m_im/=itm*mass;
  644. }
  645. m_bUpdateRtCst=true;
  646. }
  647. //
  648. void btSoftBody::setTotalDensity(btScalar density)
  649. {
  650. setTotalMass(getVolume()*density,true);
  651. }
  652. //
  653. void btSoftBody::setVolumeMass(btScalar mass)
  654. {
  655. btAlignedObjectArray<btScalar> ranks;
  656. ranks.resize(m_nodes.size(),0);
  657. int i;
  658. for(i=0;i<m_nodes.size();++i)
  659. {
  660. m_nodes[i].m_im=0;
  661. }
  662. for(i=0;i<m_tetras.size();++i)
  663. {
  664. const Tetra& t=m_tetras[i];
  665. for(int j=0;j<4;++j)
  666. {
  667. t.m_n[j]->m_im+=btFabs(t.m_rv);
  668. ranks[int(t.m_n[j]-&m_nodes[0])]+=1;
  669. }
  670. }
  671. for( i=0;i<m_nodes.size();++i)
  672. {
  673. if(m_nodes[i].m_im>0)
  674. {
  675. m_nodes[i].m_im=ranks[i]/m_nodes[i].m_im;
  676. }
  677. }
  678. setTotalMass(mass,false);
  679. }
  680. //
  681. void btSoftBody::setVolumeDensity(btScalar density)
  682. {
  683. btScalar volume=0;
  684. for(int i=0;i<m_tetras.size();++i)
  685. {
  686. const Tetra& t=m_tetras[i];
  687. for(int j=0;j<4;++j)
  688. {
  689. volume+=btFabs(t.m_rv);
  690. }
  691. }
  692. setVolumeMass(volume*density/6);
  693. }
  694. //
  695. void btSoftBody::transform(const btTransform& trs)
  696. {
  697. const btScalar margin=getCollisionShape()->getMargin();
  698. ATTRIBUTE_ALIGNED16(btDbvtVolume) vol;
  699. for(int i=0,ni=m_nodes.size();i<ni;++i)
  700. {
  701. Node& n=m_nodes[i];
  702. n.m_x=trs*n.m_x;
  703. n.m_q=trs*n.m_q;
  704. n.m_n=trs.getBasis()*n.m_n;
  705. vol = btDbvtVolume::FromCR(n.m_x,margin);
  706. m_ndbvt.update(n.m_leaf,vol);
  707. }
  708. updateNormals();
  709. updateBounds();
  710. updateConstants();
  711. m_initialWorldTransform = trs;
  712. }
  713. //
  714. void btSoftBody::translate(const btVector3& trs)
  715. {
  716. btTransform t;
  717. t.setIdentity();
  718. t.setOrigin(trs);
  719. transform(t);
  720. }
  721. //
  722. void btSoftBody::rotate( const btQuaternion& rot)
  723. {
  724. btTransform t;
  725. t.setIdentity();
  726. t.setRotation(rot);
  727. transform(t);
  728. }
  729. //
  730. void btSoftBody::scale(const btVector3& scl)
  731. {
  732. const btScalar margin=getCollisionShape()->getMargin();
  733. ATTRIBUTE_ALIGNED16(btDbvtVolume) vol;
  734. for(int i=0,ni=m_nodes.size();i<ni;++i)
  735. {
  736. Node& n=m_nodes[i];
  737. n.m_x*=scl;
  738. n.m_q*=scl;
  739. vol = btDbvtVolume::FromCR(n.m_x,margin);
  740. m_ndbvt.update(n.m_leaf,vol);
  741. }
  742. updateNormals();
  743. updateBounds();
  744. updateConstants();
  745. }
  746. //
  747. btScalar btSoftBody::getRestLengthScale()
  748. {
  749. return m_restLengthScale;
  750. }
  751. //
  752. void btSoftBody::setRestLengthScale(btScalar restLengthScale)
  753. {
  754. for(int i=0, ni=m_links.size(); i<ni; ++i)
  755. {
  756. Link& l=m_links[i];
  757. l.m_rl = l.m_rl / m_restLengthScale * restLengthScale;
  758. l.m_c1 = l.m_rl*l.m_rl;
  759. }
  760. m_restLengthScale = restLengthScale;
  761. if (getActivationState() == ISLAND_SLEEPING)
  762. activate();
  763. }
  764. //
  765. void btSoftBody::setPose(bool bvolume,bool bframe)
  766. {
  767. m_pose.m_bvolume = bvolume;
  768. m_pose.m_bframe = bframe;
  769. int i,ni;
  770. /* Weights */
  771. const btScalar omass=getTotalMass();
  772. const btScalar kmass=omass*m_nodes.size()*1000;
  773. btScalar tmass=omass;
  774. m_pose.m_wgh.resize(m_nodes.size());
  775. for(i=0,ni=m_nodes.size();i<ni;++i)
  776. {
  777. if(m_nodes[i].m_im<=0) tmass+=kmass;
  778. }
  779. for( i=0,ni=m_nodes.size();i<ni;++i)
  780. {
  781. Node& n=m_nodes[i];
  782. m_pose.m_wgh[i]= n.m_im>0 ?
  783. 1/(m_nodes[i].m_im*tmass) :
  784. kmass/tmass;
  785. }
  786. /* Pos */
  787. const btVector3 com=evaluateCom();
  788. m_pose.m_pos.resize(m_nodes.size());
  789. for( i=0,ni=m_nodes.size();i<ni;++i)
  790. {
  791. m_pose.m_pos[i]=m_nodes[i].m_x-com;
  792. }
  793. m_pose.m_volume = bvolume?getVolume():0;
  794. m_pose.m_com = com;
  795. m_pose.m_rot.setIdentity();
  796. m_pose.m_scl.setIdentity();
  797. /* Aqq */
  798. m_pose.m_aqq[0] =
  799. m_pose.m_aqq[1] =
  800. m_pose.m_aqq[2] = btVector3(0,0,0);
  801. for( i=0,ni=m_nodes.size();i<ni;++i)
  802. {
  803. const btVector3& q=m_pose.m_pos[i];
  804. const btVector3 mq=m_pose.m_wgh[i]*q;
  805. m_pose.m_aqq[0]+=mq.x()*q;
  806. m_pose.m_aqq[1]+=mq.y()*q;
  807. m_pose.m_aqq[2]+=mq.z()*q;
  808. }
  809. m_pose.m_aqq=m_pose.m_aqq.inverse();
  810. updateConstants();
  811. }
  812. void btSoftBody::resetLinkRestLengths()
  813. {
  814. for(int i=0, ni=m_links.size();i<ni;++i)
  815. {
  816. Link& l = m_links[i];
  817. l.m_rl = (l.m_n[0]->m_x-l.m_n[1]->m_x).length();
  818. l.m_c1 = l.m_rl*l.m_rl;
  819. }
  820. }
  821. //
  822. btScalar btSoftBody::getVolume() const
  823. {
  824. btScalar vol=0;
  825. if(m_nodes.size()>0)
  826. {
  827. int i,ni;
  828. const btVector3 org=m_nodes[0].m_x;
  829. for(i=0,ni=m_faces.size();i<ni;++i)
  830. {
  831. const Face& f=m_faces[i];
  832. vol+=btDot(f.m_n[0]->m_x-org,btCross(f.m_n[1]->m_x-org,f.m_n[2]->m_x-org));
  833. }
  834. vol/=(btScalar)6;
  835. }
  836. return(vol);
  837. }
  838. //
  839. int btSoftBody::clusterCount() const
  840. {
  841. return(m_clusters.size());
  842. }
  843. //
  844. btVector3 btSoftBody::clusterCom(const Cluster* cluster)
  845. {
  846. btVector3 com(0,0,0);
  847. for(int i=0,ni=cluster->m_nodes.size();i<ni;++i)
  848. {
  849. com+=cluster->m_nodes[i]->m_x*cluster->m_masses[i];
  850. }
  851. return(com*cluster->m_imass);
  852. }
  853. //
  854. btVector3 btSoftBody::clusterCom(int cluster) const
  855. {
  856. return(clusterCom(m_clusters[cluster]));
  857. }
  858. //
  859. btVector3 btSoftBody::clusterVelocity(const Cluster* cluster,const btVector3& rpos)
  860. {
  861. return(cluster->m_lv+btCross(cluster->m_av,rpos));
  862. }
  863. //
  864. void btSoftBody::clusterVImpulse(Cluster* cluster,const btVector3& rpos,const btVector3& impulse)
  865. {
  866. const btVector3 li=cluster->m_imass*impulse;
  867. const btVector3 ai=cluster->m_invwi*btCross(rpos,impulse);
  868. cluster->m_vimpulses[0]+=li;cluster->m_lv+=li;
  869. cluster->m_vimpulses[1]+=ai;cluster->m_av+=ai;
  870. cluster->m_nvimpulses++;
  871. }
  872. //
  873. void btSoftBody::clusterDImpulse(Cluster* cluster,const btVector3& rpos,const btVector3& impulse)
  874. {
  875. const btVector3 li=cluster->m_imass*impulse;
  876. const btVector3 ai=cluster->m_invwi*btCross(rpos,impulse);
  877. cluster->m_dimpulses[0]+=li;
  878. cluster->m_dimpulses[1]+=ai;
  879. cluster->m_ndimpulses++;
  880. }
  881. //
  882. void btSoftBody::clusterImpulse(Cluster* cluster,const btVector3& rpos,const Impulse& impulse)
  883. {
  884. if(impulse.m_asVelocity) clusterVImpulse(cluster,rpos,impulse.m_velocity);
  885. if(impulse.m_asDrift) clusterDImpulse(cluster,rpos,impulse.m_drift);
  886. }
  887. //
  888. void btSoftBody::clusterVAImpulse(Cluster* cluster,const btVector3& impulse)
  889. {
  890. const btVector3 ai=cluster->m_invwi*impulse;
  891. cluster->m_vimpulses[1]+=ai;cluster->m_av+=ai;
  892. cluster->m_nvimpulses++;
  893. }
  894. //
  895. void btSoftBody::clusterDAImpulse(Cluster* cluster,const btVector3& impulse)
  896. {
  897. const btVector3 ai=cluster->m_invwi*impulse;
  898. cluster->m_dimpulses[1]+=ai;
  899. cluster->m_ndimpulses++;
  900. }
  901. //
  902. void btSoftBody::clusterAImpulse(Cluster* cluster,const Impulse& impulse)
  903. {
  904. if(impulse.m_asVelocity) clusterVAImpulse(cluster,impulse.m_velocity);
  905. if(impulse.m_asDrift) clusterDAImpulse(cluster,impulse.m_drift);
  906. }
  907. //
  908. void btSoftBody::clusterDCImpulse(Cluster* cluster,const btVector3& impulse)
  909. {
  910. cluster->m_dimpulses[0]+=impulse*cluster->m_imass;
  911. cluster->m_ndimpulses++;
  912. }
  913. struct NodeLinks
  914. {
  915. btAlignedObjectArray<int> m_links;
  916. };
  917. //
  918. int btSoftBody::generateBendingConstraints(int distance,Material* mat)
  919. {
  920. int i,j;
  921. if(distance>1)
  922. {
  923. /* Build graph */
  924. const int n=m_nodes.size();
  925. const unsigned inf=(~(unsigned)0)>>1;
  926. unsigned* adj=new unsigned[n*n];
  927. #define IDX(_x_,_y_) ((_y_)*n+(_x_))
  928. for(j=0;j<n;++j)
  929. {
  930. for(i=0;i<n;++i)
  931. {
  932. if(i!=j)
  933. {
  934. adj[IDX(i,j)]=adj[IDX(j,i)]=inf;
  935. }
  936. else
  937. {
  938. adj[IDX(i,j)]=adj[IDX(j,i)]=0;
  939. }
  940. }
  941. }
  942. for( i=0;i<m_links.size();++i)
  943. {
  944. const int ia=(int)(m_links[i].m_n[0]-&m_nodes[0]);
  945. const int ib=(int)(m_links[i].m_n[1]-&m_nodes[0]);
  946. adj[IDX(ia,ib)]=1;
  947. adj[IDX(ib,ia)]=1;
  948. }
  949. //special optimized case for distance == 2
  950. if (distance == 2)
  951. {
  952. btAlignedObjectArray<NodeLinks> nodeLinks;
  953. /* Build node links */
  954. nodeLinks.resize(m_nodes.size());
  955. for( i=0;i<m_links.size();++i)
  956. {
  957. const int ia=(int)(m_links[i].m_n[0]-&m_nodes[0]);
  958. const int ib=(int)(m_links[i].m_n[1]-&m_nodes[0]);
  959. if (nodeLinks[ia].m_links.findLinearSearch(ib)==nodeLinks[ia].m_links.size())
  960. nodeLinks[ia].m_links.push_back(ib);
  961. if (nodeLinks[ib].m_links.findLinearSearch(ia)==nodeLinks[ib].m_links.size())
  962. nodeLinks[ib].m_links.push_back(ia);
  963. }
  964. for (int ii=0;ii<nodeLinks.size();ii++)
  965. {
  966. int i=ii;
  967. for (int jj=0;jj<nodeLinks[ii].m_links.size();jj++)
  968. {
  969. int k = nodeLinks[ii].m_links[jj];
  970. for (int kk=0;kk<nodeLinks[k].m_links.size();kk++)
  971. {
  972. int j = nodeLinks[k].m_links[kk];
  973. if (i!=j)
  974. {
  975. const unsigned sum=adj[IDX(i,k)]+adj[IDX(k,j)];
  976. btAssert(sum==2);
  977. if(adj[IDX(i,j)]>sum)
  978. {
  979. adj[IDX(i,j)]=adj[IDX(j,i)]=sum;
  980. }
  981. }
  982. }
  983. }
  984. }
  985. } else
  986. {
  987. ///generic Floyd's algorithm
  988. for(int k=0;k<n;++k)
  989. {
  990. for(j=0;j<n;++j)
  991. {
  992. for(i=j+1;i<n;++i)
  993. {
  994. const unsigned sum=adj[IDX(i,k)]+adj[IDX(k,j)];
  995. if(adj[IDX(i,j)]>sum)
  996. {
  997. adj[IDX(i,j)]=adj[IDX(j,i)]=sum;
  998. }
  999. }
  1000. }
  1001. }
  1002. }
  1003. /* Build links */
  1004. int nlinks=0;
  1005. for(j=0;j<n;++j)
  1006. {
  1007. for(i=j+1;i<n;++i)
  1008. {
  1009. if(adj[IDX(i,j)]==(unsigned)distance)
  1010. {
  1011. appendLink(i,j,mat);
  1012. m_links[m_links.size()-1].m_bbending=1;
  1013. ++nlinks;
  1014. }
  1015. }
  1016. }
  1017. delete[] adj;
  1018. return(nlinks);
  1019. }
  1020. return(0);
  1021. }
  1022. //
  1023. void btSoftBody::randomizeConstraints()
  1024. {
  1025. unsigned long seed=243703;
  1026. #define NEXTRAND (seed=(1664525L*seed+1013904223L)&0xffffffff)
  1027. int i,ni;
  1028. for(i=0,ni=m_links.size();i<ni;++i)
  1029. {
  1030. btSwap(m_links[i],m_links[NEXTRAND%ni]);
  1031. }
  1032. for(i=0,ni=m_faces.size();i<ni;++i)
  1033. {
  1034. btSwap(m_faces[i],m_faces[NEXTRAND%ni]);
  1035. }
  1036. #undef NEXTRAND
  1037. }
  1038. //
  1039. void btSoftBody::releaseCluster(int index)
  1040. {
  1041. Cluster* c=m_clusters[index];
  1042. if(c->m_leaf) m_cdbvt.remove(c->m_leaf);
  1043. c->~Cluster();
  1044. btAlignedFree(c);
  1045. m_clusters.remove(c);
  1046. }
  1047. //
  1048. void btSoftBody::releaseClusters()
  1049. {
  1050. while(m_clusters.size()>0) releaseCluster(0);
  1051. }
  1052. //
  1053. int btSoftBody::generateClusters(int k,int maxiterations)
  1054. {
  1055. int i;
  1056. releaseClusters();
  1057. m_clusters.resize(btMin(k,m_nodes.size()));
  1058. for(i=0;i<m_clusters.size();++i)
  1059. {
  1060. m_clusters[i] = new(btAlignedAlloc(sizeof(Cluster),16)) Cluster();
  1061. m_clusters[i]->m_collide= true;
  1062. }
  1063. k=m_clusters.size();
  1064. if(k>0)
  1065. {
  1066. /* Initialize */
  1067. btAlignedObjectArray<btVector3> centers;
  1068. btVector3 cog(0,0,0);
  1069. int i;
  1070. for(i=0;i<m_nodes.size();++i)
  1071. {
  1072. cog+=m_nodes[i].m_x;
  1073. m_clusters[(i*29873)%m_clusters.size()]->m_nodes.push_back(&m_nodes[i]);
  1074. }
  1075. cog/=(btScalar)m_nodes.size();
  1076. centers.resize(k,cog);
  1077. /* Iterate */
  1078. const btScalar slope=16;
  1079. bool changed;
  1080. int iterations=0;
  1081. do {
  1082. const btScalar w=2-btMin<btScalar>(1,iterations/slope);
  1083. changed=false;
  1084. iterations++;
  1085. int i;
  1086. for(i=0;i<k;++i)
  1087. {
  1088. btVector3 c(0,0,0);
  1089. for(int j=0;j<m_clusters[i]->m_nodes.size();++j)
  1090. {
  1091. c+=m_clusters[i]->m_nodes[j]->m_x;
  1092. }
  1093. if(m_clusters[i]->m_nodes.size())
  1094. {
  1095. c /= (btScalar)m_clusters[i]->m_nodes.size();
  1096. c = centers[i]+(c-centers[i])*w;
  1097. changed |= ((c-centers[i]).length2()>SIMD_EPSILON);
  1098. centers[i] = c;
  1099. m_clusters[i]->m_nodes.resize(0);
  1100. }
  1101. }
  1102. for(i=0;i<m_nodes.size();++i)
  1103. {
  1104. const btVector3 nx=m_nodes[i].m_x;
  1105. int kbest=0;
  1106. btScalar kdist=ClusterMetric(centers[0],nx);
  1107. for(int j=1;j<k;++j)
  1108. {
  1109. const btScalar d=ClusterMetric(centers[j],nx);
  1110. if(d<kdist)
  1111. {
  1112. kbest=j;
  1113. kdist=d;
  1114. }
  1115. }
  1116. m_clusters[kbest]->m_nodes.push_back(&m_nodes[i]);
  1117. }
  1118. } while(changed&&(iterations<maxiterations));
  1119. /* Merge */
  1120. btAlignedObjectArray<int> cids;
  1121. cids.resize(m_nodes.size(),-1);
  1122. for(i=0;i<m_clusters.size();++i)
  1123. {
  1124. for(int j=0;j<m_clusters[i]->m_nodes.size();++j)
  1125. {
  1126. cids[int(m_clusters[i]->m_nodes[j]-&m_nodes[0])]=i;
  1127. }
  1128. }
  1129. for(i=0;i<m_faces.size();++i)
  1130. {
  1131. const int idx[]={ int(m_faces[i].m_n[0]-&m_nodes[0]),
  1132. int(m_faces[i].m_n[1]-&m_nodes[0]),
  1133. int(m_faces[i].m_n[2]-&m_nodes[0])};
  1134. for(int j=0;j<3;++j)
  1135. {
  1136. const int cid=cids[idx[j]];
  1137. for(int q=1;q<3;++q)
  1138. {
  1139. const int kid=idx[(j+q)%3];
  1140. if(cids[kid]!=cid)
  1141. {
  1142. if(m_clusters[cid]->m_nodes.findLinearSearch(&m_nodes[kid])==m_clusters[cid]->m_nodes.size())
  1143. {
  1144. m_clusters[cid]->m_nodes.push_back(&m_nodes[kid]);
  1145. }
  1146. }
  1147. }
  1148. }
  1149. }
  1150. /* Master */
  1151. if(m_clusters.size()>1)
  1152. {
  1153. Cluster* pmaster=new(btAlignedAlloc(sizeof(Cluster),16)) Cluster();
  1154. pmaster->m_collide = false;
  1155. pmaster->m_nodes.reserve(m_nodes.size());
  1156. for(int i=0;i<m_nodes.size();++i) pmaster->m_nodes.push_back(&m_nodes[i]);
  1157. m_clusters.push_back(pmaster);
  1158. btSwap(m_clusters[0],m_clusters[m_clusters.size()-1]);
  1159. }
  1160. /* Terminate */
  1161. for(i=0;i<m_clusters.size();++i)
  1162. {
  1163. if(m_clusters[i]->m_nodes.size()==0)
  1164. {
  1165. releaseCluster(i--);
  1166. }
  1167. }
  1168. } else
  1169. {
  1170. //create a cluster for each tetrahedron (if tetrahedra exist) or each face
  1171. if (m_tetras.size())
  1172. {
  1173. m_clusters.resize(m_tetras.size());
  1174. for(i=0;i<m_clusters.size();++i)
  1175. {
  1176. m_clusters[i] = new(btAlignedAlloc(sizeof(Cluster),16)) Cluster();
  1177. m_clusters[i]->m_collide= true;
  1178. }
  1179. for (i=0;i<m_tetras.size();i++)
  1180. {
  1181. for (int j=0;j<4;j++)
  1182. {
  1183. m_clusters[i]->m_nodes.push_back(m_tetras[i].m_n[j]);
  1184. }
  1185. }
  1186. } else
  1187. {
  1188. m_clusters.resize(m_faces.size());
  1189. for(i=0;i<m_clusters.size();++i)
  1190. {
  1191. m_clusters[i] = new(btAlignedAlloc(sizeof(Cluster),16)) Cluster();
  1192. m_clusters[i]->m_collide= true;
  1193. }
  1194. for(i=0;i<m_faces.size();++i)
  1195. {
  1196. for(int j=0;j<3;++j)
  1197. {
  1198. m_clusters[i]->m_nodes.push_back(m_faces[i].m_n[j]);
  1199. }
  1200. }
  1201. }
  1202. }
  1203. if (m_clusters.size())
  1204. {
  1205. initializeClusters();
  1206. updateClusters();
  1207. //for self-collision
  1208. m_clusterConnectivity.resize(m_clusters.size()*m_clusters.size());
  1209. {
  1210. for (int c0=0;c0<m_clusters.size();c0++)
  1211. {
  1212. m_clusters[c0]->m_clusterIndex=c0;
  1213. for (int c1=0;c1<m_clusters.size();c1++)
  1214. {
  1215. bool connected=false;
  1216. Cluster* cla = m_clusters[c0];
  1217. Cluster* clb = m_clusters[c1];
  1218. for (int i=0;!connected&&i<cla->m_nodes.size();i++)
  1219. {
  1220. for (int j=0;j<clb->m_nodes.size();j++)
  1221. {
  1222. if (cla->m_nodes[i] == clb->m_nodes[j])
  1223. {
  1224. connected=true;
  1225. break;
  1226. }
  1227. }
  1228. }
  1229. m_clusterConnectivity[c0+c1*m_clusters.size()]=connected;
  1230. }
  1231. }
  1232. }
  1233. }
  1234. return(m_clusters.size());
  1235. }
  1236. //
  1237. void btSoftBody::refine(ImplicitFn* ifn,btScalar accurary,bool cut)
  1238. {
  1239. const Node* nbase = &m_nodes[0];
  1240. int ncount = m_nodes.size();
  1241. btSymMatrix<int> edges(ncount,-2);
  1242. int newnodes=0;
  1243. int i,j,k,ni;
  1244. /* Filter out */
  1245. for(i=0;i<m_links.size();++i)
  1246. {
  1247. Link& l=m_links[i];
  1248. if(l.m_bbending)
  1249. {
  1250. if(!SameSign(ifn->Eval(l.m_n[0]->m_x),ifn->Eval(l.m_n[1]->m_x)))
  1251. {
  1252. btSwap(m_links[i],m_links[m_links.size()-1]);
  1253. m_links.pop_back();--i;
  1254. }
  1255. }
  1256. }
  1257. /* Fill edges */
  1258. for(i=0;i<m_links.size();++i)
  1259. {
  1260. Link& l=m_links[i];
  1261. edges(int(l.m_n[0]-nbase),int(l.m_n[1]-nbase))=-1;
  1262. }
  1263. for(i=0;i<m_faces.size();++i)
  1264. {
  1265. Face& f=m_faces[i];
  1266. edges(int(f.m_n[0]-nbase),int(f.m_n[1]-nbase))=-1;
  1267. edges(int(f.m_n[1]-nbase),int(f.m_n[2]-nbase))=-1;
  1268. edges(int(f.m_n[2]-nbase),int(f.m_n[0]-nbase))=-1;
  1269. }
  1270. /* Intersect */
  1271. for(i=0;i<ncount;++i)
  1272. {
  1273. for(j=i+1;j<ncount;++j)
  1274. {
  1275. if(edges(i,j)==-1)
  1276. {
  1277. Node& a=m_nodes[i];
  1278. Node& b=m_nodes[j];
  1279. const btScalar t=ImplicitSolve(ifn,a.m_x,b.m_x,accurary);
  1280. if(t>0)
  1281. {
  1282. const btVector3 x=Lerp(a.m_x,b.m_x,t);
  1283. const btVector3 v=Lerp(a.m_v,b.m_v,t);
  1284. btScalar m=0;
  1285. if(a.m_im>0)
  1286. {
  1287. if(b.m_im>0)
  1288. {
  1289. const btScalar ma=1/a.m_im;
  1290. const btScalar mb=1/b.m_im;
  1291. const btScalar mc=Lerp(ma,mb,t);
  1292. const btScalar f=(ma+mb)/(ma+mb+mc);
  1293. a.m_im=1/(ma*f);
  1294. b.m_im=1/(mb*f);
  1295. m=mc*f;
  1296. }
  1297. else
  1298. { a.m_im/=0.5f;m=1/a.m_im; }
  1299. }
  1300. else
  1301. {
  1302. if(b.m_im>0)
  1303. { b.m_im/=0.5f;m=1/b.m_im; }
  1304. else
  1305. m=0;
  1306. }
  1307. appendNode(x,m);
  1308. edges(i,j)=m_nodes.size()-1;
  1309. m_nodes[edges(i,j)].m_v=v;
  1310. ++newnodes;
  1311. }
  1312. }
  1313. }
  1314. }
  1315. nbase=&m_nodes[0];
  1316. /* Refine links */
  1317. for(i=0,ni=m_links.size();i<ni;++i)
  1318. {
  1319. Link& feat=m_links[i];
  1320. const int idx[]={ int(feat.m_n[0]-nbase),
  1321. int(feat.m_n[1]-nbase)};
  1322. if((idx[0]<ncount)&&(idx[1]<ncount))
  1323. {
  1324. const int ni=edges(idx[0],idx[1]);
  1325. if(ni>0)
  1326. {
  1327. appendLink(i);
  1328. Link* pft[]={ &m_links[i],
  1329. &m_links[m_links.size()-1]};
  1330. pft[0]->m_n[0]=&m_nodes[idx[0]];
  1331. pft[0]->m_n[1]=&m_nodes[ni];
  1332. pft[1]->m_n[0]=&m_nodes[ni];
  1333. pft[1]->m_n[1]=&m_nodes[idx[1]];
  1334. }
  1335. }
  1336. }
  1337. /* Refine faces */
  1338. for(i=0;i<m_faces.size();++i)
  1339. {
  1340. const Face& feat=m_faces[i];
  1341. const int idx[]={ int(feat.m_n[0]-nbase),
  1342. int(feat.m_n[1]-nbase),
  1343. int(feat.m_n[2]-nbase)};
  1344. for(j=2,k=0;k<3;j=k++)
  1345. {
  1346. if((idx[j]<ncount)&&(idx[k]<ncount))
  1347. {
  1348. const int ni=edges(idx[j],idx[k]);
  1349. if(ni>0)
  1350. {
  1351. appendFace(i);
  1352. const int l=(k+1)%3;
  1353. Face* pft[]={ &m_faces[i],
  1354. &m_faces[m_faces.size()-1]};
  1355. pft[0]->m_n[0]=&m_nodes[idx[l]];
  1356. pft[0]->m_n[1]=&m_nodes[idx[j]];
  1357. pft[0]->m_n[2]=&m_nodes[ni];
  1358. pft[1]->m_n[0]=&m_nodes[ni];
  1359. pft[1]->m_n[1]=&m_nodes[idx[k]];
  1360. pft[1]->m_n[2]=&m_nodes[idx[l]];
  1361. appendLink(ni,idx[l],pft[0]->m_material);
  1362. --i;break;
  1363. }
  1364. }
  1365. }
  1366. }
  1367. /* Cut */
  1368. if(cut)
  1369. {
  1370. btAlignedObjectArray<int> cnodes;
  1371. const int pcount=ncount;
  1372. int i;
  1373. ncount=m_nodes.size();
  1374. cnodes.resize(ncount,0);
  1375. /* Nodes */
  1376. for(i=0;i<ncount;++i)
  1377. {
  1378. const btVector3 x=m_nodes[i].m_x;
  1379. if((i>=pcount)||(btFabs(ifn->Eval(x))<accurary))
  1380. {
  1381. const btVector3 v=m_nodes[i].m_v;
  1382. btScalar m=getMass(i);
  1383. if(m>0) { m*=0.5f;m_nodes[i].m_im/=0.5f; }
  1384. appendNode(x,m);
  1385. cnodes[i]=m_nodes.size()-1;
  1386. m_nodes[cnodes[i]].m_v=v;
  1387. }
  1388. }
  1389. nbase=&m_nodes[0];
  1390. /* Links */
  1391. for(i=0,ni=m_links.size();i<ni;++i)
  1392. {
  1393. const int id[]={ int(m_links[i].m_n[0]-nbase),
  1394. int(m_links[i].m_n[1]-nbase)};
  1395. int todetach=0;
  1396. if(cnodes[id[0]]&&cnodes[id[1]])
  1397. {
  1398. appendLink(i);
  1399. todetach=m_links.size()-1;
  1400. }
  1401. else
  1402. {
  1403. if(( (ifn->Eval(m_nodes[id[0]].m_x)<accurary)&&
  1404. (ifn->Eval(m_nodes[id[1]].m_x)<accurary)))
  1405. todetach=i;
  1406. }
  1407. if(todetach)
  1408. {
  1409. Link& l=m_links[todetach];
  1410. for(int j=0;j<2;++j)
  1411. {
  1412. int cn=cnodes[int(l.m_n[j]-nbase)];
  1413. if(cn) l.m_n[j]=&m_nodes[cn];
  1414. }
  1415. }
  1416. }
  1417. /* Faces */
  1418. for(i=0,ni=m_faces.size();i<ni;++i)
  1419. {
  1420. Node** n= m_faces[i].m_n;
  1421. if( (ifn->Eval(n[0]->m_x)<accurary)&&
  1422. (ifn->Eval(n[1]->m_x)<accurary)&&
  1423. (ifn->Eval(n[2]->m_x)<accurary))
  1424. {
  1425. for(int j=0;j<3;++j)
  1426. {
  1427. int cn=cnodes[int(n[j]-nbase)];
  1428. if(cn) n[j]=&m_nodes[cn];
  1429. }
  1430. }
  1431. }
  1432. /* Clean orphans */
  1433. int nnodes=m_nodes.size();
  1434. btAlignedObjectArray<int> ranks;
  1435. btAlignedObjectArray<int> todelete;
  1436. ranks.resize(nnodes,0);
  1437. for(i=0,ni=m_links.size();i<ni;++i)
  1438. {
  1439. for(int j=0;j<2;++j) ranks[int(m_links[i].m_n[j]-nbase)]++;
  1440. }
  1441. for(i=0,ni=m_faces.size();i<ni;++i)
  1442. {
  1443. for(int j=0;j<3;++j) ranks[int(m_faces[i].m_n[j]-nbase)]++;
  1444. }
  1445. for(i=0;i<m_links.size();++i)
  1446. {
  1447. const int id[]={ int(m_links[i].m_n[0]-nbase),
  1448. int(m_links[i].m_n[1]-nbase)};
  1449. const bool sg[]={ ranks[id[0]]==1,
  1450. ranks[id[1]]==1};
  1451. if(sg[0]||sg[1])
  1452. {
  1453. --ranks[id[0]];
  1454. --ranks[id[1]];
  1455. btSwap(m_links[i],m_links[m_links.size()-1]);
  1456. m_links.pop_back();--i;
  1457. }
  1458. }
  1459. #if 0
  1460. for(i=nnodes-1;i>=0;--i)
  1461. {
  1462. if(!ranks[i]) todelete.push_back(i);
  1463. }
  1464. if(todelete.size())
  1465. {
  1466. btAlignedObjectArray<int>& map=ranks;
  1467. for(int i=0;i<nnodes;++i) map[i]=i;
  1468. PointersToIndices(this);
  1469. for(int i=0,ni=todelete.size();i<ni;++i)
  1470. {
  1471. int j=todelete[i];
  1472. int& a=map[j];
  1473. int& b=map[--nnodes];
  1474. m_ndbvt.remove(m_nodes[a].m_leaf);m_nodes[a].m_leaf=0;
  1475. btSwap(m_nodes[a],m_nodes[b]);
  1476. j=a;a=b;b=j;
  1477. }
  1478. IndicesToPointers(this,&map[0]);
  1479. m_nodes.resize(nnodes);
  1480. }
  1481. #endif
  1482. }
  1483. m_bUpdateRtCst=true;
  1484. }
  1485. //
  1486. bool btSoftBody::cutLink(const Node* node0,const Node* node1,btScalar position)
  1487. {
  1488. return(cutLink(int(node0-&m_nodes[0]),int(node1-&m_nodes[0]),position));
  1489. }
  1490. //
  1491. bool btSoftBody::cutLink(int node0,int node1,btScalar position)
  1492. {
  1493. bool done=false;
  1494. int i,ni;
  1495. // const btVector3 d=m_nodes[node0].m_x-m_nodes[node1].m_x;
  1496. const btVector3 x=Lerp(m_nodes[node0].m_x,m_nodes[node1].m_x,position);
  1497. const btVector3 v=Lerp(m_nodes[node0].m_v,m_nodes[node1].m_v,position);
  1498. const btScalar m=1;
  1499. appendNode(x,m);
  1500. appendNode(x,m);
  1501. Node* pa=&m_nodes[node0];
  1502. Node* pb=&m_nodes[node1];
  1503. Node* pn[2]={ &m_nodes[m_nodes.size()-2],
  1504. &m_nodes[m_nodes.size()-1]};
  1505. pn[0]->m_v=v;
  1506. pn[1]->m_v=v;
  1507. for(i=0,ni=m_links.size();i<ni;++i)
  1508. {
  1509. const int mtch=MatchEdge(m_links[i].m_n[0],m_links[i].m_n[1],pa,pb);
  1510. if(mtch!=-1)
  1511. {
  1512. appendLink(i);
  1513. Link* pft[]={&m_links[i],&m_links[m_links.size()-1]};
  1514. pft[0]->m_n[1]=pn[mtch];
  1515. pft[1]->m_n[0]=pn[1-mtch];
  1516. done=true;
  1517. }
  1518. }
  1519. for(i=0,ni=m_faces.size();i<ni;++i)
  1520. {
  1521. for(int k=2,l=0;l<3;k=l++)
  1522. {
  1523. const int mtch=MatchEdge(m_faces[i].m_n[k],m_faces[i].m_n[l],pa,pb);
  1524. if(mtch!=-1)
  1525. {
  1526. appendFace(i);
  1527. Face* pft[]={&m_faces[i],&m_faces[m_faces.size()-1]};
  1528. pft[0]->m_n[l]=pn[mtch];
  1529. pft[1]->m_n[k]=pn[1-mtch];
  1530. appendLink(pn[0],pft[0]->m_n[(l+1)%3],pft[0]->m_material,true);
  1531. appendLink(pn[1],pft[0]->m_n[(l+1)%3],pft[0]->m_material,true);
  1532. }
  1533. }
  1534. }
  1535. if(!done)
  1536. {
  1537. m_ndbvt.remove(pn[0]->m_leaf);
  1538. m_ndbvt.remove(pn[1]->m_leaf);
  1539. m_nodes.pop_back();
  1540. m_nodes.pop_back();
  1541. }
  1542. return(done);
  1543. }
  1544. //
  1545. bool btSoftBody::rayTest(const btVector3& rayFrom,
  1546. const btVector3& rayTo,
  1547. sRayCast& results)
  1548. {
  1549. if(m_faces.size()&&m_fdbvt.empty())
  1550. initializeFaceTree();
  1551. results.body = this;
  1552. results.fraction = 1.f;
  1553. results.feature = eFeature::None;
  1554. results.index = -1;
  1555. return(rayTest(rayFrom,rayTo,results.fraction,results.feature,results.index,false)!=0);
  1556. }
  1557. //
  1558. void btSoftBody::setSolver(eSolverPresets::_ preset)
  1559. {
  1560. m_cfg.m_vsequence.clear();
  1561. m_cfg.m_psequence.clear();
  1562. m_cfg.m_dsequence.clear();
  1563. switch(preset)
  1564. {
  1565. case eSolverPresets::Positions:
  1566. m_cfg.m_psequence.push_back(ePSolver::Anchors);
  1567. m_cfg.m_psequence.push_back(ePSolver::RContacts);
  1568. m_cfg.m_psequence.push_back(ePSolver::SContacts);
  1569. m_cfg.m_psequence.push_back(ePSolver::Linear);
  1570. break;
  1571. case eSolverPresets::Velocities:
  1572. m_cfg.m_vsequence.push_back(eVSolver::Linear);
  1573. m_cfg.m_psequence.push_back(ePSolver::Anchors);
  1574. m_cfg.m_psequence.push_back(ePSolver::RContacts);
  1575. m_cfg.m_psequence.push_back(ePSolver::SContacts);
  1576. m_cfg.m_dsequence.push_back(ePSolver::Linear);
  1577. break;
  1578. }
  1579. }
  1580. //
  1581. void btSoftBody::predictMotion(btScalar dt)
  1582. {
  1583. int i,ni;
  1584. /* Update */
  1585. if(m_bUpdateRtCst)
  1586. {
  1587. m_bUpdateRtCst=false;
  1588. updateConstants();
  1589. m_fdbvt.clear();
  1590. if(m_cfg.collisions&fCollision::VF_SS)
  1591. {
  1592. initializeFaceTree();
  1593. }
  1594. }
  1595. /* Prepare */
  1596. m_sst.sdt = dt*m_cfg.timescale;
  1597. m_sst.isdt = 1/m_sst.sdt;
  1598. m_sst.velmrg = m_sst.sdt*3;
  1599. m_sst.radmrg = getCollisionShape()->getMargin();
  1600. m_sst.updmrg = m_sst.radmrg*(btScalar)0.25;
  1601. /* Forces */
  1602. addVelocity(m_worldInfo->m_gravity*m_sst.sdt);
  1603. applyForces();
  1604. /* Integrate */
  1605. for(i=0,ni=m_nodes.size();i<ni;++i)
  1606. {
  1607. Node& n=m_nodes[i];
  1608. n.m_q = n.m_x;
  1609. btVector3 deltaV = n.m_f*n.m_im*m_sst.sdt;
  1610. {
  1611. btScalar maxDisplacement = m_worldInfo->m_maxDisplacement;
  1612. btScalar clampDeltaV = maxDisplacement/m_sst.sdt;
  1613. for (int c=0;c<3;c++)
  1614. {
  1615. if (deltaV[c]>clampDeltaV)
  1616. {
  1617. deltaV[c] = clampDeltaV;
  1618. }
  1619. if (deltaV[c]<-clampDeltaV)
  1620. {
  1621. deltaV[c]=-clampDeltaV;
  1622. }
  1623. }
  1624. }
  1625. n.m_v += deltaV;
  1626. n.m_x += n.m_v*m_sst.sdt;
  1627. n.m_f = btVector3(0,0,0);
  1628. }
  1629. /* Clusters */
  1630. updateClusters();
  1631. /* Bounds */
  1632. updateBounds();
  1633. /* Nodes */
  1634. ATTRIBUTE_ALIGNED16(btDbvtVolume) vol;
  1635. for(i=0,ni=m_nodes.size();i<ni;++i)
  1636. {
  1637. Node& n=m_nodes[i];
  1638. vol = btDbvtVolume::FromCR(n.m_x,m_sst.radmrg);
  1639. m_ndbvt.update( n.m_leaf,
  1640. vol,
  1641. n.m_v*m_sst.velmrg,
  1642. m_sst.updmrg);
  1643. }
  1644. /* Faces */
  1645. if(!m_fdbvt.empty())
  1646. {
  1647. for(int i=0;i<m_faces.size();++i)
  1648. {
  1649. Face& f=m_faces[i];
  1650. const btVector3 v=( f.m_n[0]->m_v+
  1651. f.m_n[1]->m_v+
  1652. f.m_n[2]->m_v)/3;
  1653. vol = VolumeOf(f,m_sst.radmrg);
  1654. m_fdbvt.update( f.m_leaf,
  1655. vol,
  1656. v*m_sst.velmrg,
  1657. m_sst.updmrg);
  1658. }
  1659. }
  1660. /* Pose */
  1661. updatePose();
  1662. /* Match */
  1663. if(m_pose.m_bframe&&(m_cfg.kMT>0))
  1664. {
  1665. const btMatrix3x3 posetrs=m_pose.m_rot;
  1666. for(int i=0,ni=m_nodes.size();i<ni;++i)
  1667. {
  1668. Node& n=m_nodes[i];
  1669. if(n.m_im>0)
  1670. {
  1671. const btVector3 x=posetrs*m_pose.m_pos[i]+m_pose.m_com;
  1672. n.m_x=Lerp(n.m_x,x,m_cfg.kMT);
  1673. }
  1674. }
  1675. }
  1676. /* Clear contacts */
  1677. m_rcontacts.resize(0);
  1678. m_scontacts.resize(0);
  1679. /* Optimize dbvt's */
  1680. m_ndbvt.optimizeIncremental(1);
  1681. m_fdbvt.optimizeIncremental(1);
  1682. m_cdbvt.optimizeIncremental(1);
  1683. }
  1684. //
  1685. void btSoftBody::solveConstraints()
  1686. {
  1687. /* Apply clusters */
  1688. applyClusters(false);
  1689. /* Prepare links */
  1690. int i,ni;
  1691. for(i=0,ni=m_links.size();i<ni;++i)
  1692. {
  1693. Link& l=m_links[i];
  1694. l.m_c3 = l.m_n[1]->m_q-l.m_n[0]->m_q;
  1695. l.m_c2 = 1/(l.m_c3.length2()*l.m_c0);
  1696. }
  1697. /* Prepare anchors */
  1698. for(i=0,ni=m_anchors.size();i<ni;++i)
  1699. {
  1700. Anchor& a=m_anchors[i];
  1701. const btVector3 ra=a.m_body->getWorldTransform().getBasis()*a.m_local;
  1702. a.m_c0 = ImpulseMatrix( m_sst.sdt,
  1703. a.m_node->m_im,
  1704. a.m_body->getInvMass(),
  1705. a.m_body->getInvInertiaTensorWorld(),
  1706. ra);
  1707. a.m_c1 = ra;
  1708. a.m_c2 = m_sst.sdt*a.m_node->m_im;
  1709. a.m_body->activate();
  1710. }
  1711. /* Solve velocities */
  1712. if(m_cfg.viterations>0)
  1713. {
  1714. /* Solve */
  1715. for(int isolve=0;isolve<m_cfg.viterations;++isolve)
  1716. {
  1717. for(int iseq=0;iseq<m_cfg.m_vsequence.size();++iseq)
  1718. {
  1719. getSolver(m_cfg.m_vsequence[iseq])(this,1);
  1720. }
  1721. }
  1722. /* Update */
  1723. for(i=0,ni=m_nodes.size();i<ni;++i)
  1724. {
  1725. Node& n=m_nodes[i];
  1726. n.m_x = n.m_q+n.m_v*m_sst.sdt;
  1727. }
  1728. }
  1729. /* Solve positions */
  1730. if(m_cfg.piterations>0)
  1731. {
  1732. for(int isolve=0;isolve<m_cfg.piterations;++isolve)
  1733. {
  1734. const btScalar ti=isolve/(btScalar)m_cfg.piterations;
  1735. for(int iseq=0;iseq<m_cfg.m_psequence.size();++iseq)
  1736. {
  1737. getSolver(m_cfg.m_psequence[iseq])(this,1,ti);
  1738. }
  1739. }
  1740. const btScalar vc=m_sst.isdt*(1-m_cfg.kDP);
  1741. for(i=0,ni=m_nodes.size();i<ni;++i)
  1742. {
  1743. Node& n=m_nodes[i];
  1744. n.m_v = (n.m_x-n.m_q)*vc;
  1745. n.m_f = btVector3(0,0,0);
  1746. }
  1747. }
  1748. /* Solve drift */
  1749. if(m_cfg.diterations>0)
  1750. {
  1751. const btScalar vcf=m_cfg.kVCF*m_sst.isdt;
  1752. for(i=0,ni=m_nodes.size();i<ni;++i)
  1753. {
  1754. Node& n=m_nodes[i];
  1755. n.m_q = n.m_x;
  1756. }
  1757. for(int idrift=0;idrift<m_cfg.diterations;++idrift)
  1758. {
  1759. for(int iseq=0;iseq<m_cfg.m_dsequence.size();++iseq)
  1760. {
  1761. getSolver(m_cfg.m_dsequence[iseq])(this,1,0);
  1762. }
  1763. }
  1764. for(int i=0,ni=m_nodes.size();i<ni;++i)
  1765. {
  1766. Node& n=m_nodes[i];
  1767. n.m_v += (n.m_x-n.m_q)*vcf;
  1768. }
  1769. }
  1770. /* Apply clusters */
  1771. dampClusters();
  1772. applyClusters(true);
  1773. }
  1774. //
  1775. void btSoftBody::staticSolve(int iterations)
  1776. {
  1777. for(int isolve=0;isolve<iterations;++isolve)
  1778. {
  1779. for(int iseq=0;iseq<m_cfg.m_psequence.size();++iseq)
  1780. {
  1781. getSolver(m_cfg.m_psequence[iseq])(this,1,0);
  1782. }
  1783. }
  1784. }
  1785. //
  1786. void btSoftBody::solveCommonConstraints(btSoftBody** /*bodies*/,int /*count*/,int /*iterations*/)
  1787. {
  1788. /// placeholder
  1789. }
  1790. //
  1791. void btSoftBody::solveClusters(const btAlignedObjectArray<btSoftBody*>& bodies)
  1792. {
  1793. const int nb=bodies.size();
  1794. int iterations=0;
  1795. int i;
  1796. for(i=0;i<nb;++i)
  1797. {
  1798. iterations=btMax(iterations,bodies[i]->m_cfg.citerations);
  1799. }
  1800. for(i=0;i<nb;++i)
  1801. {
  1802. bodies[i]->prepareClusters(iterations);
  1803. }
  1804. for(i=0;i<iterations;++i)
  1805. {
  1806. const btScalar sor=1;
  1807. for(int j=0;j<nb;++j)
  1808. {
  1809. bodies[j]->solveClusters(sor);
  1810. }
  1811. }
  1812. for(i=0;i<nb;++i)
  1813. {
  1814. bodies[i]->cleanupClusters();
  1815. }
  1816. }
  1817. //
  1818. void btSoftBody::integrateMotion()
  1819. {
  1820. /* Update */
  1821. updateNormals();
  1822. }
  1823. //
  1824. btSoftBody::RayFromToCaster::RayFromToCaster(const btVector3& rayFrom,const btVector3& rayTo,btScalar mxt)
  1825. {
  1826. m_rayFrom = rayFrom;
  1827. m_rayNormalizedDirection = (rayTo-rayFrom);
  1828. m_rayTo = rayTo;
  1829. m_mint = mxt;
  1830. m_face = 0;
  1831. m_tests = 0;
  1832. }
  1833. //
  1834. void btSoftBody::RayFromToCaster::Process(const btDbvtNode* leaf)
  1835. {
  1836. btSoftBody::Face& f=*(btSoftBody::Face*)leaf->data;
  1837. const btScalar t=rayFromToTriangle( m_rayFrom,m_rayTo,m_rayNormalizedDirection,
  1838. f.m_n[0]->m_x,
  1839. f.m_n[1]->m_x,
  1840. f.m_n[2]->m_x,
  1841. m_mint);
  1842. if((t>0)&&(t<m_mint))
  1843. {
  1844. m_mint=t;m_face=&f;
  1845. }
  1846. ++m_tests;
  1847. }
  1848. //
  1849. btScalar btSoftBody::RayFromToCaster::rayFromToTriangle( const btVector3& rayFrom,
  1850. const btVector3& rayTo,
  1851. const btVector3& rayNormalizedDirection,
  1852. const btVector3& a,
  1853. const btVector3& b,
  1854. const btVector3& c,
  1855. btScalar maxt)
  1856. {
  1857. static const btScalar ceps=-SIMD_EPSILON*10;
  1858. static const btScalar teps=SIMD_EPSILON*10;
  1859. const btVector3 n=btCross(b-a,c-a);
  1860. const btScalar d=btDot(a,n);
  1861. const btScalar den=btDot(rayNormalizedDirection,n);
  1862. if(!btFuzzyZero(den))
  1863. {
  1864. const btScalar num=btDot(rayFrom,n)-d;
  1865. const btScalar t=-num/den;
  1866. if((t>teps)&&(t<maxt))
  1867. {
  1868. const btVector3 hit=rayFrom+rayNormalizedDirection*t;
  1869. if( (btDot(n,btCross(a-hit,b-hit))>ceps) &&
  1870. (btDot(n,btCross(b-hit,c-hit))>ceps) &&
  1871. (btDot(n,btCross(c-hit,a-hit))>ceps))
  1872. {
  1873. return(t);
  1874. }
  1875. }
  1876. }
  1877. return(-1);
  1878. }
  1879. //
  1880. void btSoftBody::pointersToIndices()
  1881. {
  1882. #define PTR2IDX(_p_,_b_) reinterpret_cast<btSoftBody::Node*>((_p_)-(_b_))
  1883. btSoftBody::Node* base=m_nodes.size() ? &m_nodes[0] : 0;
  1884. int i,ni;
  1885. for(i=0,ni=m_nodes.size();i<ni;++i)
  1886. {
  1887. if(m_nodes[i].m_leaf)
  1888. {
  1889. m_nodes[i].m_leaf->data=*(void**)&i;
  1890. }
  1891. }
  1892. for(i=0,ni=m_links.size();i<ni;++i)
  1893. {
  1894. m_links[i].m_n[0]=PTR2IDX(m_links[i].m_n[0],base);
  1895. m_links[i].m_n[1]=PTR2IDX(m_links[i].m_n[1],base);
  1896. }
  1897. for(i=0,ni=m_faces.size();i<ni;++i)
  1898. {
  1899. m_faces[i].m_n[0]=PTR2IDX(m_faces[i].m_n[0],base);
  1900. m_faces[i].m_n[1]=PTR2IDX(m_faces[i].m_n[1],base);
  1901. m_faces[i].m_n[2]=PTR2IDX(m_faces[i].m_n[2],base);
  1902. if(m_faces[i].m_leaf)
  1903. {
  1904. m_faces[i].m_leaf->data=*(void**)&i;
  1905. }
  1906. }
  1907. for(i=0,ni=m_anchors.size();i<ni;++i)
  1908. {
  1909. m_anchors[i].m_node=PTR2IDX(m_anchors[i].m_node,base);
  1910. }
  1911. for(i=0,ni=m_notes.size();i<ni;++i)
  1912. {
  1913. for(int j=0;j<m_notes[i].m_rank;++j)
  1914. {
  1915. m_notes[i].m_nodes[j]=PTR2IDX(m_notes[i].m_nodes[j],base);
  1916. }
  1917. }
  1918. #undef PTR2IDX
  1919. }
  1920. //
  1921. void btSoftBody::indicesToPointers(const int* map)
  1922. {
  1923. #define IDX2PTR(_p_,_b_) map?(&(_b_)[map[(((char*)_p_)-(char*)0)]]): \
  1924. (&(_b_)[(((char*)_p_)-(char*)0)])
  1925. btSoftBody::Node* base=m_nodes.size() ? &m_nodes[0]:0;
  1926. int i,ni;
  1927. for(i=0,ni=m_nodes.size();i<ni;++i)
  1928. {
  1929. if(m_nodes[i].m_leaf)
  1930. {
  1931. m_nodes[i].m_leaf->data=&m_nodes[i];
  1932. }
  1933. }
  1934. for(i=0,ni=m_links.size();i<ni;++i)
  1935. {
  1936. m_links[i].m_n[0]=IDX2PTR(m_links[i].m_n[0],base);
  1937. m_links[i].m_n[1]=IDX2PTR(m_links[i].m_n[1],base);
  1938. }
  1939. for(i=0,ni=m_faces.size();i<ni;++i)
  1940. {
  1941. m_faces[i].m_n[0]=IDX2PTR(m_faces[i].m_n[0],base);
  1942. m_faces[i].m_n[1]=IDX2PTR(m_faces[i].m_n[1],base);
  1943. m_faces[i].m_n[2]=IDX2PTR(m_faces[i].m_n[2],base);
  1944. if(m_faces[i].m_leaf)
  1945. {
  1946. m_faces[i].m_leaf->data=&m_faces[i];
  1947. }
  1948. }
  1949. for(i=0,ni=m_anchors.size();i<ni;++i)
  1950. {
  1951. m_anchors[i].m_node=IDX2PTR(m_anchors[i].m_node,base);
  1952. }
  1953. for(i=0,ni=m_notes.size();i<ni;++i)
  1954. {
  1955. for(int j=0;j<m_notes[i].m_rank;++j)
  1956. {
  1957. m_notes[i].m_nodes[j]=IDX2PTR(m_notes[i].m_nodes[j],base);
  1958. }
  1959. }
  1960. #undef IDX2PTR
  1961. }
  1962. //
  1963. int btSoftBody::rayTest(const btVector3& rayFrom,const btVector3& rayTo,
  1964. btScalar& mint,eFeature::_& feature,int& index,bool bcountonly) const
  1965. {
  1966. int cnt=0;
  1967. btVector3 dir = rayTo-rayFrom;
  1968. if(bcountonly||m_fdbvt.empty())
  1969. {/* Full search */
  1970. for(int i=0,ni=m_faces.size();i<ni;++i)
  1971. {
  1972. const btSoftBody::Face& f=m_faces[i];
  1973. const btScalar t=RayFromToCaster::rayFromToTriangle( rayFrom,rayTo,dir,
  1974. f.m_n[0]->m_x,
  1975. f.m_n[1]->m_x,
  1976. f.m_n[2]->m_x,
  1977. mint);
  1978. if(t>0)
  1979. {
  1980. ++cnt;
  1981. if(!bcountonly)
  1982. {
  1983. feature=btSoftBody::eFeature::Face;
  1984. index=i;
  1985. mint=t;
  1986. }
  1987. }
  1988. }
  1989. }
  1990. else
  1991. {/* Use dbvt */
  1992. RayFromToCaster collider(rayFrom,rayTo,mint);
  1993. btDbvt::rayTest(m_fdbvt.m_root,rayFrom,rayTo,collider);
  1994. if(collider.m_face)
  1995. {
  1996. mint=collider.m_mint;
  1997. feature=btSoftBody::eFeature::Face;
  1998. index=(int)(collider.m_face-&m_faces[0]);
  1999. cnt=1;
  2000. }
  2001. }
  2002. for (int i=0;i<m_tetras.size();i++)
  2003. {
  2004. const btSoftBody::Tetra& tet = m_tetras[i];
  2005. int tetfaces[4][3] = {{0,1,2},{0,1,3},{1,2,3},{0,2,3}};
  2006. for (int f=0;f<4;f++)
  2007. {
  2008. int index0=tetfaces[f][0];
  2009. int index1=tetfaces[f][1];
  2010. int index2=tetfaces[f][2];
  2011. btVector3 v0=tet.m_n[index0]->m_x;
  2012. btVector3 v1=tet.m_n[index1]->m_x;
  2013. btVector3 v2=tet.m_n[index2]->m_x;
  2014. const btScalar t=RayFromToCaster::rayFromToTriangle( rayFrom,rayTo,dir,
  2015. v0,v1,v2,
  2016. mint);
  2017. if(t>0)
  2018. {
  2019. ++cnt;
  2020. if(!bcountonly)
  2021. {
  2022. feature=btSoftBody::eFeature::Tetra;
  2023. index=i;
  2024. mint=t;
  2025. }
  2026. }
  2027. }
  2028. }
  2029. return(cnt);
  2030. }
  2031. //
  2032. void btSoftBody::initializeFaceTree()
  2033. {
  2034. m_fdbvt.clear();
  2035. for(int i=0;i<m_faces.size();++i)
  2036. {
  2037. Face& f=m_faces[i];
  2038. f.m_leaf=m_fdbvt.insert(VolumeOf(f,0),&f);
  2039. }
  2040. }
  2041. //
  2042. btVector3 btSoftBody::evaluateCom() const
  2043. {
  2044. btVector3 com(0,0,0);
  2045. if(m_pose.m_bframe)
  2046. {
  2047. for(int i=0,ni=m_nodes.size();i<ni;++i)
  2048. {
  2049. com+=m_nodes[i].m_x*m_pose.m_wgh[i];
  2050. }
  2051. }
  2052. return(com);
  2053. }
  2054. //
  2055. bool btSoftBody::checkContact( const btCollisionObjectWrapper* colObjWrap,
  2056. const btVector3& x,
  2057. btScalar margin,
  2058. btSoftBody::sCti& cti) const
  2059. {
  2060. btVector3 nrm;
  2061. const btCollisionShape *shp = colObjWrap->getCollisionShape();
  2062. // const btRigidBody *tmpRigid = btRigidBody::upcast(colObjWrap->getCollisionObject());
  2063. //const btTransform &wtr = tmpRigid ? tmpRigid->getWorldTransform() : colObjWrap->getWorldTransform();
  2064. const btTransform &wtr = colObjWrap->getWorldTransform();
  2065. //todo: check which transform is needed here
  2066. btScalar dst =
  2067. m_worldInfo->m_sparsesdf.Evaluate(
  2068. wtr.invXform(x),
  2069. shp,
  2070. nrm,
  2071. margin);
  2072. if(dst<0)
  2073. {
  2074. cti.m_colObj = colObjWrap->getCollisionObject();
  2075. cti.m_normal = wtr.getBasis()*nrm;
  2076. cti.m_offset = -btDot( cti.m_normal, x - cti.m_normal * dst );
  2077. return(true);
  2078. }
  2079. return(false);
  2080. }
  2081. //
  2082. void btSoftBody::updateNormals()
  2083. {
  2084. const btVector3 zv(0,0,0);
  2085. int i,ni;
  2086. for(i=0,ni=m_nodes.size();i<ni;++i)
  2087. {
  2088. m_nodes[i].m_n=zv;
  2089. }
  2090. for(i=0,ni=m_faces.size();i<ni;++i)
  2091. {
  2092. btSoftBody::Face& f=m_faces[i];
  2093. const btVector3 n=btCross(f.m_n[1]->m_x-f.m_n[0]->m_x,
  2094. f.m_n[2]->m_x-f.m_n[0]->m_x);
  2095. f.m_normal=n.normalized();
  2096. f.m_n[0]->m_n+=n;
  2097. f.m_n[1]->m_n+=n;
  2098. f.m_n[2]->m_n+=n;
  2099. }
  2100. for(i=0,ni=m_nodes.size();i<ni;++i)
  2101. {
  2102. btScalar len = m_nodes[i].m_n.length();
  2103. if (len>SIMD_EPSILON)
  2104. m_nodes[i].m_n /= len;
  2105. }
  2106. }
  2107. //
  2108. void btSoftBody::updateBounds()
  2109. {
  2110. /*if( m_acceleratedSoftBody )
  2111. {
  2112. // If we have an accelerated softbody we need to obtain the bounds correctly
  2113. // For now (slightly hackily) just have a very large AABB
  2114. // TODO: Write get bounds kernel
  2115. // If that is updating in place, atomic collisions might be low (when the cloth isn't perfectly aligned to an axis) and we could
  2116. // probably do a test and exchange reasonably efficiently.
  2117. m_bounds[0] = btVector3(-1000, -1000, -1000);
  2118. m_bounds[1] = btVector3(1000, 1000, 1000);
  2119. } else {*/
  2120. if(m_ndbvt.m_root)
  2121. {
  2122. const btVector3& mins=m_ndbvt.m_root->volume.Mins();
  2123. const btVector3& maxs=m_ndbvt.m_root->volume.Maxs();
  2124. const btScalar csm=getCollisionShape()->getMargin();
  2125. const btVector3 mrg=btVector3( csm,
  2126. csm,
  2127. csm)*1; // ??? to investigate...
  2128. m_bounds[0]=mins-mrg;
  2129. m_bounds[1]=maxs+mrg;
  2130. if(0!=getBroadphaseHandle())
  2131. {
  2132. m_worldInfo->m_broadphase->setAabb( getBroadphaseHandle(),
  2133. m_bounds[0],
  2134. m_bounds[1],
  2135. m_worldInfo->m_dispatcher);
  2136. }
  2137. }
  2138. else
  2139. {
  2140. m_bounds[0]=
  2141. m_bounds[1]=btVector3(0,0,0);
  2142. }
  2143. //}
  2144. }
  2145. //
  2146. void btSoftBody::updatePose()
  2147. {
  2148. if(m_pose.m_bframe)
  2149. {
  2150. btSoftBody::Pose& pose=m_pose;
  2151. const btVector3 com=evaluateCom();
  2152. /* Com */
  2153. pose.m_com = com;
  2154. /* Rotation */
  2155. btMatrix3x3 Apq;
  2156. const btScalar eps=SIMD_EPSILON;
  2157. Apq[0]=Apq[1]=Apq[2]=btVector3(0,0,0);
  2158. Apq[0].setX(eps);Apq[1].setY(eps*2);Apq[2].setZ(eps*3);
  2159. for(int i=0,ni=m_nodes.size();i<ni;++i)
  2160. {
  2161. const btVector3 a=pose.m_wgh[i]*(m_nodes[i].m_x-com);
  2162. const btVector3& b=pose.m_pos[i];
  2163. Apq[0]+=a.x()*b;
  2164. Apq[1]+=a.y()*b;
  2165. Apq[2]+=a.z()*b;
  2166. }
  2167. btMatrix3x3 r,s;
  2168. PolarDecompose(Apq,r,s);
  2169. pose.m_rot=r;
  2170. pose.m_scl=pose.m_aqq*r.transpose()*Apq;
  2171. if(m_cfg.maxvolume>1)
  2172. {
  2173. const btScalar idet=Clamp<btScalar>( 1/pose.m_scl.determinant(),
  2174. 1,m_cfg.maxvolume);
  2175. pose.m_scl=Mul(pose.m_scl,idet);
  2176. }
  2177. }
  2178. }
  2179. //
  2180. void btSoftBody::updateArea(bool averageArea)
  2181. {
  2182. int i,ni;
  2183. /* Face area */
  2184. for(i=0,ni=m_faces.size();i<ni;++i)
  2185. {
  2186. Face& f=m_faces[i];
  2187. f.m_ra = AreaOf(f.m_n[0]->m_x,f.m_n[1]->m_x,f.m_n[2]->m_x);
  2188. }
  2189. /* Node area */
  2190. if (averageArea)
  2191. {
  2192. btAlignedObjectArray<int> counts;
  2193. counts.resize(m_nodes.size(),0);
  2194. for(i=0,ni=m_nodes.size();i<ni;++i)
  2195. {
  2196. m_nodes[i].m_area = 0;
  2197. }
  2198. for(i=0,ni=m_faces.size();i<ni;++i)
  2199. {
  2200. btSoftBody::Face& f=m_faces[i];
  2201. for(int j=0;j<3;++j)
  2202. {
  2203. const int index=(int)(f.m_n[j]-&m_nodes[0]);
  2204. counts[index]++;
  2205. f.m_n[j]->m_area+=btFabs(f.m_ra);
  2206. }
  2207. }
  2208. for(i=0,ni=m_nodes.size();i<ni;++i)
  2209. {
  2210. if(counts[i]>0)
  2211. m_nodes[i].m_area/=(btScalar)counts[i];
  2212. else
  2213. m_nodes[i].m_area=0;
  2214. }
  2215. }
  2216. else
  2217. {
  2218. // initialize node area as zero
  2219. for(i=0,ni=m_nodes.size();i<ni;++i)
  2220. {
  2221. m_nodes[i].m_area=0;
  2222. }
  2223. for(i=0,ni=m_faces.size();i<ni;++i)
  2224. {
  2225. btSoftBody::Face& f=m_faces[i];
  2226. for(int j=0;j<3;++j)
  2227. {
  2228. f.m_n[j]->m_area += f.m_ra;
  2229. }
  2230. }
  2231. for(i=0,ni=m_nodes.size();i<ni;++i)
  2232. {
  2233. m_nodes[i].m_area *= 0.3333333f;
  2234. }
  2235. }
  2236. }
  2237. void btSoftBody::updateLinkConstants()
  2238. {
  2239. int i,ni;
  2240. /* Links */
  2241. for(i=0,ni=m_links.size();i<ni;++i)
  2242. {
  2243. Link& l=m_links[i];
  2244. Material& m=*l.m_material;
  2245. l.m_c0 = (l.m_n[0]->m_im+l.m_n[1]->m_im)/m.m_kLST;
  2246. }
  2247. }
  2248. void btSoftBody::updateConstants()
  2249. {
  2250. resetLinkRestLengths();
  2251. updateLinkConstants();
  2252. updateArea();
  2253. }
  2254. //
  2255. void btSoftBody::initializeClusters()
  2256. {
  2257. int i;
  2258. for( i=0;i<m_clusters.size();++i)
  2259. {
  2260. Cluster& c=*m_clusters[i];
  2261. c.m_imass=0;
  2262. c.m_masses.resize(c.m_nodes.size());
  2263. for(int j=0;j<c.m_nodes.size();++j)
  2264. {
  2265. if (c.m_nodes[j]->m_im==0)
  2266. {
  2267. c.m_containsAnchor = true;
  2268. c.m_masses[j] = BT_LARGE_FLOAT;
  2269. } else
  2270. {
  2271. c.m_masses[j] = btScalar(1.)/c.m_nodes[j]->m_im;
  2272. }
  2273. c.m_imass += c.m_masses[j];
  2274. }
  2275. c.m_imass = btScalar(1.)/c.m_imass;
  2276. c.m_com = btSoftBody::clusterCom(&c);
  2277. c.m_lv = btVector3(0,0,0);
  2278. c.m_av = btVector3(0,0,0);
  2279. c.m_leaf = 0;
  2280. /* Inertia */
  2281. btMatrix3x3& ii=c.m_locii;
  2282. ii[0]=ii[1]=ii[2]=btVector3(0,0,0);
  2283. {
  2284. int i,ni;
  2285. for(i=0,ni=c.m_nodes.size();i<ni;++i)
  2286. {
  2287. const btVector3 k=c.m_nodes[i]->m_x-c.m_com;
  2288. const btVector3 q=k*k;
  2289. const btScalar m=c.m_masses[i];
  2290. ii[0][0] += m*(q[1]+q[2]);
  2291. ii[1][1] += m*(q[0]+q[2]);
  2292. ii[2][2] += m*(q[0]+q[1]);
  2293. ii[0][1] -= m*k[0]*k[1];
  2294. ii[0][2] -= m*k[0]*k[2];
  2295. ii[1][2] -= m*k[1]*k[2];
  2296. }
  2297. }
  2298. ii[1][0]=ii[0][1];
  2299. ii[2][0]=ii[0][2];
  2300. ii[2][1]=ii[1][2];
  2301. ii = ii.inverse();
  2302. /* Frame */
  2303. c.m_framexform.setIdentity();
  2304. c.m_framexform.setOrigin(c.m_com);
  2305. c.m_framerefs.resize(c.m_nodes.size());
  2306. {
  2307. int i;
  2308. for(i=0;i<c.m_framerefs.size();++i)
  2309. {
  2310. c.m_framerefs[i]=c.m_nodes[i]->m_x-c.m_com;
  2311. }
  2312. }
  2313. }
  2314. }
  2315. //
  2316. void btSoftBody::updateClusters()
  2317. {
  2318. BT_PROFILE("UpdateClusters");
  2319. int i;
  2320. for(i=0;i<m_clusters.size();++i)
  2321. {
  2322. btSoftBody::Cluster& c=*m_clusters[i];
  2323. const int n=c.m_nodes.size();
  2324. //const btScalar invn=1/(btScalar)n;
  2325. if(n)
  2326. {
  2327. /* Frame */
  2328. const btScalar eps=btScalar(0.0001);
  2329. btMatrix3x3 m,r,s;
  2330. m[0]=m[1]=m[2]=btVector3(0,0,0);
  2331. m[0][0]=eps*1;
  2332. m[1][1]=eps*2;
  2333. m[2][2]=eps*3;
  2334. c.m_com=clusterCom(&c);
  2335. for(int i=0;i<c.m_nodes.size();++i)
  2336. {
  2337. const btVector3 a=c.m_nodes[i]->m_x-c.m_com;
  2338. const btVector3& b=c.m_framerefs[i];
  2339. m[0]+=a[0]*b;m[1]+=a[1]*b;m[2]+=a[2]*b;
  2340. }
  2341. PolarDecompose(m,r,s);
  2342. c.m_framexform.setOrigin(c.m_com);
  2343. c.m_framexform.setBasis(r);
  2344. /* Inertia */
  2345. #if 1/* Constant */
  2346. c.m_invwi=c.m_framexform.getBasis()*c.m_locii*c.m_framexform.getBasis().transpose();
  2347. #else
  2348. #if 0/* Sphere */
  2349. const btScalar rk=(2*c.m_extents.length2())/(5*c.m_imass);
  2350. const btVector3 inertia(rk,rk,rk);
  2351. const btVector3 iin(btFabs(inertia[0])>SIMD_EPSILON?1/inertia[0]:0,
  2352. btFabs(inertia[1])>SIMD_EPSILON?1/inertia[1]:0,
  2353. btFabs(inertia[2])>SIMD_EPSILON?1/inertia[2]:0);
  2354. c.m_invwi=c.m_xform.getBasis().scaled(iin)*c.m_xform.getBasis().transpose();
  2355. #else/* Actual */
  2356. c.m_invwi[0]=c.m_invwi[1]=c.m_invwi[2]=btVector3(0,0,0);
  2357. for(int i=0;i<n;++i)
  2358. {
  2359. const btVector3 k=c.m_nodes[i]->m_x-c.m_com;
  2360. const btVector3 q=k*k;
  2361. const btScalar m=1/c.m_nodes[i]->m_im;
  2362. c.m_invwi[0][0] += m*(q[1]+q[2]);
  2363. c.m_invwi[1][1] += m*(q[0]+q[2]);
  2364. c.m_invwi[2][2] += m*(q[0]+q[1]);
  2365. c.m_invwi[0][1] -= m*k[0]*k[1];
  2366. c.m_invwi[0][2] -= m*k[0]*k[2];
  2367. c.m_invwi[1][2] -= m*k[1]*k[2];
  2368. }
  2369. c.m_invwi[1][0]=c.m_invwi[0][1];
  2370. c.m_invwi[2][0]=c.m_invwi[0][2];
  2371. c.m_invwi[2][1]=c.m_invwi[1][2];
  2372. c.m_invwi=c.m_invwi.inverse();
  2373. #endif
  2374. #endif
  2375. /* Velocities */
  2376. c.m_lv=btVector3(0,0,0);
  2377. c.m_av=btVector3(0,0,0);
  2378. {
  2379. int i;
  2380. for(i=0;i<n;++i)
  2381. {
  2382. const btVector3 v=c.m_nodes[i]->m_v*c.m_masses[i];
  2383. c.m_lv += v;
  2384. c.m_av += btCross(c.m_nodes[i]->m_x-c.m_com,v);
  2385. }
  2386. }
  2387. c.m_lv=c.m_imass*c.m_lv*(1-c.m_ldamping);
  2388. c.m_av=c.m_invwi*c.m_av*(1-c.m_adamping);
  2389. c.m_vimpulses[0] =
  2390. c.m_vimpulses[1] = btVector3(0,0,0);
  2391. c.m_dimpulses[0] =
  2392. c.m_dimpulses[1] = btVector3(0,0,0);
  2393. c.m_nvimpulses = 0;
  2394. c.m_ndimpulses = 0;
  2395. /* Matching */
  2396. if(c.m_matching>0)
  2397. {
  2398. for(int j=0;j<c.m_nodes.size();++j)
  2399. {
  2400. Node& n=*c.m_nodes[j];
  2401. const btVector3 x=c.m_framexform*c.m_framerefs[j];
  2402. n.m_x=Lerp(n.m_x,x,c.m_matching);
  2403. }
  2404. }
  2405. /* Dbvt */
  2406. if(c.m_collide)
  2407. {
  2408. btVector3 mi=c.m_nodes[0]->m_x;
  2409. btVector3 mx=mi;
  2410. for(int j=1;j<n;++j)
  2411. {
  2412. mi.setMin(c.m_nodes[j]->m_x);
  2413. mx.setMax(c.m_nodes[j]->m_x);
  2414. }
  2415. ATTRIBUTE_ALIGNED16(btDbvtVolume) bounds=btDbvtVolume::FromMM(mi,mx);
  2416. if(c.m_leaf)
  2417. m_cdbvt.update(c.m_leaf,bounds,c.m_lv*m_sst.sdt*3,m_sst.radmrg);
  2418. else
  2419. c.m_leaf=m_cdbvt.insert(bounds,&c);
  2420. }
  2421. }
  2422. }
  2423. }
  2424. //
  2425. void btSoftBody::cleanupClusters()
  2426. {
  2427. for(int i=0;i<m_joints.size();++i)
  2428. {
  2429. m_joints[i]->Terminate(m_sst.sdt);
  2430. if(m_joints[i]->m_delete)
  2431. {
  2432. btAlignedFree(m_joints[i]);
  2433. m_joints.remove(m_joints[i--]);
  2434. }
  2435. }
  2436. }
  2437. //
  2438. void btSoftBody::prepareClusters(int iterations)
  2439. {
  2440. for(int i=0;i<m_joints.size();++i)
  2441. {
  2442. m_joints[i]->Prepare(m_sst.sdt,iterations);
  2443. }
  2444. }
  2445. //
  2446. void btSoftBody::solveClusters(btScalar sor)
  2447. {
  2448. for(int i=0,ni=m_joints.size();i<ni;++i)
  2449. {
  2450. m_joints[i]->Solve(m_sst.sdt,sor);
  2451. }
  2452. }
  2453. //
  2454. void btSoftBody::applyClusters(bool drift)
  2455. {
  2456. BT_PROFILE("ApplyClusters");
  2457. // const btScalar f0=m_sst.sdt;
  2458. //const btScalar f1=f0/2;
  2459. btAlignedObjectArray<btVector3> deltas;
  2460. btAlignedObjectArray<btScalar> weights;
  2461. deltas.resize(m_nodes.size(),btVector3(0,0,0));
  2462. weights.resize(m_nodes.size(),0);
  2463. int i;
  2464. if(drift)
  2465. {
  2466. for(i=0;i<m_clusters.size();++i)
  2467. {
  2468. Cluster& c=*m_clusters[i];
  2469. if(c.m_ndimpulses)
  2470. {
  2471. c.m_dimpulses[0]/=(btScalar)c.m_ndimpulses;
  2472. c.m_dimpulses[1]/=(btScalar)c.m_ndimpulses;
  2473. }
  2474. }
  2475. }
  2476. for(i=0;i<m_clusters.size();++i)
  2477. {
  2478. Cluster& c=*m_clusters[i];
  2479. if(0<(drift?c.m_ndimpulses:c.m_nvimpulses))
  2480. {
  2481. const btVector3 v=(drift?c.m_dimpulses[0]:c.m_vimpulses[0])*m_sst.sdt;
  2482. const btVector3 w=(drift?c.m_dimpulses[1]:c.m_vimpulses[1])*m_sst.sdt;
  2483. for(int j=0;j<c.m_nodes.size();++j)
  2484. {
  2485. const int idx=int(c.m_nodes[j]-&m_nodes[0]);
  2486. const btVector3& x=c.m_nodes[j]->m_x;
  2487. const btScalar q=c.m_masses[j];
  2488. deltas[idx] += (v+btCross(w,x-c.m_com))*q;
  2489. weights[idx] += q;
  2490. }
  2491. }
  2492. }
  2493. for(i=0;i<deltas.size();++i)
  2494. {
  2495. if(weights[i]>0)
  2496. {
  2497. m_nodes[i].m_x+=deltas[i]/weights[i];
  2498. }
  2499. }
  2500. }
  2501. //
  2502. void btSoftBody::dampClusters()
  2503. {
  2504. int i;
  2505. for(i=0;i<m_clusters.size();++i)
  2506. {
  2507. Cluster& c=*m_clusters[i];
  2508. if(c.m_ndamping>0)
  2509. {
  2510. for(int j=0;j<c.m_nodes.size();++j)
  2511. {
  2512. Node& n=*c.m_nodes[j];
  2513. if(n.m_im>0)
  2514. {
  2515. const btVector3 vx=c.m_lv+btCross(c.m_av,c.m_nodes[j]->m_q-c.m_com);
  2516. if(vx.length2()<=n.m_v.length2())
  2517. {
  2518. n.m_v += c.m_ndamping*(vx-n.m_v);
  2519. }
  2520. }
  2521. }
  2522. }
  2523. }
  2524. }
  2525. //
  2526. void btSoftBody::Joint::Prepare(btScalar dt,int)
  2527. {
  2528. m_bodies[0].activate();
  2529. m_bodies[1].activate();
  2530. }
  2531. //
  2532. void btSoftBody::LJoint::Prepare(btScalar dt,int iterations)
  2533. {
  2534. static const btScalar maxdrift=4;
  2535. Joint::Prepare(dt,iterations);
  2536. m_rpos[0] = m_bodies[0].xform()*m_refs[0];
  2537. m_rpos[1] = m_bodies[1].xform()*m_refs[1];
  2538. m_drift = Clamp(m_rpos[0]-m_rpos[1],maxdrift)*m_erp/dt;
  2539. m_rpos[0] -= m_bodies[0].xform().getOrigin();
  2540. m_rpos[1] -= m_bodies[1].xform().getOrigin();
  2541. m_massmatrix = ImpulseMatrix( m_bodies[0].invMass(),m_bodies[0].invWorldInertia(),m_rpos[0],
  2542. m_bodies[1].invMass(),m_bodies[1].invWorldInertia(),m_rpos[1]);
  2543. if(m_split>0)
  2544. {
  2545. m_sdrift = m_massmatrix*(m_drift*m_split);
  2546. m_drift *= 1-m_split;
  2547. }
  2548. m_drift /=(btScalar)iterations;
  2549. }
  2550. //
  2551. void btSoftBody::LJoint::Solve(btScalar dt,btScalar sor)
  2552. {
  2553. const btVector3 va=m_bodies[0].velocity(m_rpos[0]);
  2554. const btVector3 vb=m_bodies[1].velocity(m_rpos[1]);
  2555. const btVector3 vr=va-vb;
  2556. btSoftBody::Impulse impulse;
  2557. impulse.m_asVelocity = 1;
  2558. impulse.m_velocity = m_massmatrix*(m_drift+vr*m_cfm)*sor;
  2559. m_bodies[0].applyImpulse(-impulse,m_rpos[0]);
  2560. m_bodies[1].applyImpulse( impulse,m_rpos[1]);
  2561. }
  2562. //
  2563. void btSoftBody::LJoint::Terminate(btScalar dt)
  2564. {
  2565. if(m_split>0)
  2566. {
  2567. m_bodies[0].applyDImpulse(-m_sdrift,m_rpos[0]);
  2568. m_bodies[1].applyDImpulse( m_sdrift,m_rpos[1]);
  2569. }
  2570. }
  2571. //
  2572. void btSoftBody::AJoint::Prepare(btScalar dt,int iterations)
  2573. {
  2574. static const btScalar maxdrift=SIMD_PI/16;
  2575. m_icontrol->Prepare(this);
  2576. Joint::Prepare(dt,iterations);
  2577. m_axis[0] = m_bodies[0].xform().getBasis()*m_refs[0];
  2578. m_axis[1] = m_bodies[1].xform().getBasis()*m_refs[1];
  2579. m_drift = NormalizeAny(btCross(m_axis[1],m_axis[0]));
  2580. m_drift *= btMin(maxdrift,btAcos(Clamp<btScalar>(btDot(m_axis[0],m_axis[1]),-1,+1)));
  2581. m_drift *= m_erp/dt;
  2582. m_massmatrix= AngularImpulseMatrix(m_bodies[0].invWorldInertia(),m_bodies[1].invWorldInertia());
  2583. if(m_split>0)
  2584. {
  2585. m_sdrift = m_massmatrix*(m_drift*m_split);
  2586. m_drift *= 1-m_split;
  2587. }
  2588. m_drift /=(btScalar)iterations;
  2589. }
  2590. //
  2591. void btSoftBody::AJoint::Solve(btScalar dt,btScalar sor)
  2592. {
  2593. const btVector3 va=m_bodies[0].angularVelocity();
  2594. const btVector3 vb=m_bodies[1].angularVelocity();
  2595. const btVector3 vr=va-vb;
  2596. const btScalar sp=btDot(vr,m_axis[0]);
  2597. const btVector3 vc=vr-m_axis[0]*m_icontrol->Speed(this,sp);
  2598. btSoftBody::Impulse impulse;
  2599. impulse.m_asVelocity = 1;
  2600. impulse.m_velocity = m_massmatrix*(m_drift+vc*m_cfm)*sor;
  2601. m_bodies[0].applyAImpulse(-impulse);
  2602. m_bodies[1].applyAImpulse( impulse);
  2603. }
  2604. //
  2605. void btSoftBody::AJoint::Terminate(btScalar dt)
  2606. {
  2607. if(m_split>0)
  2608. {
  2609. m_bodies[0].applyDAImpulse(-m_sdrift);
  2610. m_bodies[1].applyDAImpulse( m_sdrift);
  2611. }
  2612. }
  2613. //
  2614. void btSoftBody::CJoint::Prepare(btScalar dt,int iterations)
  2615. {
  2616. Joint::Prepare(dt,iterations);
  2617. const bool dodrift=(m_life==0);
  2618. m_delete=(++m_life)>m_maxlife;
  2619. if(dodrift)
  2620. {
  2621. m_drift=m_drift*m_erp/dt;
  2622. if(m_split>0)
  2623. {
  2624. m_sdrift = m_massmatrix*(m_drift*m_split);
  2625. m_drift *= 1-m_split;
  2626. }
  2627. m_drift/=(btScalar)iterations;
  2628. }
  2629. else
  2630. {
  2631. m_drift=m_sdrift=btVector3(0,0,0);
  2632. }
  2633. }
  2634. //
  2635. void btSoftBody::CJoint::Solve(btScalar dt,btScalar sor)
  2636. {
  2637. const btVector3 va=m_bodies[0].velocity(m_rpos[0]);
  2638. const btVector3 vb=m_bodies[1].velocity(m_rpos[1]);
  2639. const btVector3 vrel=va-vb;
  2640. const btScalar rvac=btDot(vrel,m_normal);
  2641. btSoftBody::Impulse impulse;
  2642. impulse.m_asVelocity = 1;
  2643. impulse.m_velocity = m_drift;
  2644. if(rvac<0)
  2645. {
  2646. const btVector3 iv=m_normal*rvac;
  2647. const btVector3 fv=vrel-iv;
  2648. impulse.m_velocity += iv+fv*m_friction;
  2649. }
  2650. impulse.m_velocity=m_massmatrix*impulse.m_velocity*sor;
  2651. if (m_bodies[0].m_soft==m_bodies[1].m_soft)
  2652. {
  2653. if ((impulse.m_velocity.getX() ==impulse.m_velocity.getX())&&(impulse.m_velocity.getY() ==impulse.m_velocity.getY())&&
  2654. (impulse.m_velocity.getZ() ==impulse.m_velocity.getZ()))
  2655. {
  2656. if (impulse.m_asVelocity)
  2657. {
  2658. if (impulse.m_velocity.length() <m_bodies[0].m_soft->m_maxSelfCollisionImpulse)
  2659. {
  2660. } else
  2661. {
  2662. m_bodies[0].applyImpulse(-impulse*m_bodies[0].m_soft->m_selfCollisionImpulseFactor,m_rpos[0]);
  2663. m_bodies[1].applyImpulse( impulse*m_bodies[0].m_soft->m_selfCollisionImpulseFactor,m_rpos[1]);
  2664. }
  2665. }
  2666. }
  2667. } else
  2668. {
  2669. m_bodies[0].applyImpulse(-impulse,m_rpos[0]);
  2670. m_bodies[1].applyImpulse( impulse,m_rpos[1]);
  2671. }
  2672. }
  2673. //
  2674. void btSoftBody::CJoint::Terminate(btScalar dt)
  2675. {
  2676. if(m_split>0)
  2677. {
  2678. m_bodies[0].applyDImpulse(-m_sdrift,m_rpos[0]);
  2679. m_bodies[1].applyDImpulse( m_sdrift,m_rpos[1]);
  2680. }
  2681. }
  2682. //
  2683. void btSoftBody::applyForces()
  2684. {
  2685. BT_PROFILE("SoftBody applyForces");
  2686. // const btScalar dt = m_sst.sdt;
  2687. const btScalar kLF = m_cfg.kLF;
  2688. const btScalar kDG = m_cfg.kDG;
  2689. const btScalar kPR = m_cfg.kPR;
  2690. const btScalar kVC = m_cfg.kVC;
  2691. const bool as_lift = kLF>0;
  2692. const bool as_drag = kDG>0;
  2693. const bool as_pressure = kPR!=0;
  2694. const bool as_volume = kVC>0;
  2695. const bool as_aero = as_lift ||
  2696. as_drag ;
  2697. //const bool as_vaero = as_aero &&
  2698. // (m_cfg.aeromodel < btSoftBody::eAeroModel::F_TwoSided);
  2699. //const bool as_faero = as_aero &&
  2700. // (m_cfg.aeromodel >= btSoftBody::eAeroModel::F_TwoSided);
  2701. const bool use_medium = as_aero;
  2702. const bool use_volume = as_pressure ||
  2703. as_volume ;
  2704. btScalar volume = 0;
  2705. btScalar ivolumetp = 0;
  2706. btScalar dvolumetv = 0;
  2707. btSoftBody::sMedium medium;
  2708. if(use_volume)
  2709. {
  2710. volume = getVolume();
  2711. ivolumetp = 1/btFabs(volume)*kPR;
  2712. dvolumetv = (m_pose.m_volume-volume)*kVC;
  2713. }
  2714. /* Per vertex forces */
  2715. int i,ni;
  2716. for(i=0,ni=m_nodes.size();i<ni;++i)
  2717. {
  2718. btSoftBody::Node& n=m_nodes[i];
  2719. if(n.m_im>0)
  2720. {
  2721. if(use_medium)
  2722. {
  2723. /* Aerodynamics */
  2724. addAeroForceToNode(m_windVelocity, i);
  2725. }
  2726. /* Pressure */
  2727. if(as_pressure)
  2728. {
  2729. n.m_f += n.m_n*(n.m_area*ivolumetp);
  2730. }
  2731. /* Volume */
  2732. if(as_volume)
  2733. {
  2734. n.m_f += n.m_n*(n.m_area*dvolumetv);
  2735. }
  2736. }
  2737. }
  2738. /* Per face forces */
  2739. for(i=0,ni=m_faces.size();i<ni;++i)
  2740. {
  2741. // btSoftBody::Face& f=m_faces[i];
  2742. /* Aerodynamics */
  2743. addAeroForceToFace(m_windVelocity, i);
  2744. }
  2745. }
  2746. //
  2747. void btSoftBody::PSolve_Anchors(btSoftBody* psb,btScalar kst,btScalar ti)
  2748. {
  2749. BT_PROFILE("PSolve_Anchors");
  2750. const btScalar kAHR=psb->m_cfg.kAHR*kst;
  2751. const btScalar dt=psb->m_sst.sdt;
  2752. for(int i=0,ni=psb->m_anchors.size();i<ni;++i)
  2753. {
  2754. const Anchor& a=psb->m_anchors[i];
  2755. const btTransform& t=a.m_body->getWorldTransform();
  2756. Node& n=*a.m_node;
  2757. const btVector3 wa=t*a.m_local;
  2758. const btVector3 va=a.m_body->getVelocityInLocalPoint(a.m_c1)*dt;
  2759. const btVector3 vb=n.m_x-n.m_q;
  2760. const btVector3 vr=(va-vb)+(wa-n.m_x)*kAHR;
  2761. const btVector3 impulse=a.m_c0*vr*a.m_influence;
  2762. n.m_x+=impulse*a.m_c2;
  2763. a.m_body->applyImpulse(-impulse,a.m_c1);
  2764. }
  2765. }
  2766. //
  2767. void btSoftBody::PSolve_RContacts(btSoftBody* psb, btScalar kst, btScalar ti)
  2768. {
  2769. BT_PROFILE("PSolve_RContacts");
  2770. const btScalar dt = psb->m_sst.sdt;
  2771. const btScalar mrg = psb->getCollisionShape()->getMargin();
  2772. btMultiBodyJacobianData jacobianData;
  2773. for(int i=0,ni=psb->m_rcontacts.size();i<ni;++i)
  2774. {
  2775. const RContact& c = psb->m_rcontacts[i];
  2776. const sCti& cti = c.m_cti;
  2777. if (cti.m_colObj->hasContactResponse())
  2778. {
  2779. btVector3 va(0,0,0);
  2780. btRigidBody* rigidCol=0;
  2781. btMultiBodyLinkCollider* multibodyLinkCol=0;
  2782. btScalar* deltaV;
  2783. if (cti.m_colObj->getInternalType() == btCollisionObject::CO_RIGID_BODY)
  2784. {
  2785. rigidCol = (btRigidBody*)btRigidBody::upcast(cti.m_colObj);
  2786. va = rigidCol ? rigidCol->getVelocityInLocalPoint(c.m_c1)*dt : btVector3(0,0,0);
  2787. }
  2788. else if (cti.m_colObj->getInternalType() == btCollisionObject::CO_FEATHERSTONE_LINK)
  2789. {
  2790. multibodyLinkCol = (btMultiBodyLinkCollider*)btMultiBodyLinkCollider::upcast(cti.m_colObj);
  2791. if (multibodyLinkCol)
  2792. {
  2793. const int ndof = multibodyLinkCol->m_multiBody->getNumDofs() + 6;
  2794. jacobianData.m_jacobians.resize(ndof);
  2795. jacobianData.m_deltaVelocitiesUnitImpulse.resize(ndof);
  2796. btScalar* jac=&jacobianData.m_jacobians[0];
  2797. multibodyLinkCol->m_multiBody->fillContactJacobianMultiDof(multibodyLinkCol->m_link, c.m_node->m_x, cti.m_normal, jac, jacobianData.scratch_r, jacobianData.scratch_v, jacobianData.scratch_m);
  2798. deltaV = &jacobianData.m_deltaVelocitiesUnitImpulse[0];
  2799. multibodyLinkCol->m_multiBody->calcAccelerationDeltasMultiDof(&jacobianData.m_jacobians[0],deltaV,jacobianData.scratch_r, jacobianData.scratch_v);
  2800. btScalar vel = 0.0;
  2801. for (int j = 0; j < ndof ; ++j) {
  2802. vel += multibodyLinkCol->m_multiBody->getVelocityVector()[j] * jac[j];
  2803. }
  2804. va = cti.m_normal*vel*dt;
  2805. }
  2806. }
  2807. const btVector3 vb = c.m_node->m_x-c.m_node->m_q;
  2808. const btVector3 vr = vb-va;
  2809. const btScalar dn = btDot(vr, cti.m_normal);
  2810. if(dn<=SIMD_EPSILON)
  2811. {
  2812. const btScalar dp = btMin( (btDot(c.m_node->m_x, cti.m_normal) + cti.m_offset), mrg );
  2813. const btVector3 fv = vr - (cti.m_normal * dn);
  2814. // c0 is the impulse matrix, c3 is 1 - the friction coefficient or 0, c4 is the contact hardness coefficient
  2815. const btVector3 impulse = c.m_c0 * ( (vr - (fv * c.m_c3) + (cti.m_normal * (dp * c.m_c4))) * kst );
  2816. c.m_node->m_x -= impulse * c.m_c2;
  2817. if (cti.m_colObj->getInternalType() == btCollisionObject::CO_RIGID_BODY)
  2818. {
  2819. if (rigidCol)
  2820. rigidCol->applyImpulse(impulse,c.m_c1);
  2821. }
  2822. else if (cti.m_colObj->getInternalType() == btCollisionObject::CO_FEATHERSTONE_LINK)
  2823. {
  2824. if (multibodyLinkCol)
  2825. {
  2826. double multiplier = 0.5;
  2827. multibodyLinkCol->m_multiBody->applyDeltaVeeMultiDof(deltaV,-impulse.length()*multiplier);
  2828. }
  2829. }
  2830. }
  2831. }
  2832. }
  2833. }
  2834. //
  2835. void btSoftBody::PSolve_SContacts(btSoftBody* psb,btScalar,btScalar ti)
  2836. {
  2837. BT_PROFILE("PSolve_SContacts");
  2838. for(int i=0,ni=psb->m_scontacts.size();i<ni;++i)
  2839. {
  2840. const SContact& c=psb->m_scontacts[i];
  2841. const btVector3& nr=c.m_normal;
  2842. Node& n=*c.m_node;
  2843. Face& f=*c.m_face;
  2844. const btVector3 p=BaryEval( f.m_n[0]->m_x,
  2845. f.m_n[1]->m_x,
  2846. f.m_n[2]->m_x,
  2847. c.m_weights);
  2848. const btVector3 q=BaryEval( f.m_n[0]->m_q,
  2849. f.m_n[1]->m_q,
  2850. f.m_n[2]->m_q,
  2851. c.m_weights);
  2852. const btVector3 vr=(n.m_x-n.m_q)-(p-q);
  2853. btVector3 corr(0,0,0);
  2854. btScalar dot = btDot(vr,nr);
  2855. if(dot<0)
  2856. {
  2857. const btScalar j=c.m_margin-(btDot(nr,n.m_x)-btDot(nr,p));
  2858. corr+=c.m_normal*j;
  2859. }
  2860. corr -= ProjectOnPlane(vr,nr)*c.m_friction;
  2861. n.m_x += corr*c.m_cfm[0];
  2862. f.m_n[0]->m_x -= corr*(c.m_cfm[1]*c.m_weights.x());
  2863. f.m_n[1]->m_x -= corr*(c.m_cfm[1]*c.m_weights.y());
  2864. f.m_n[2]->m_x -= corr*(c.m_cfm[1]*c.m_weights.z());
  2865. }
  2866. }
  2867. //
  2868. void btSoftBody::PSolve_Links(btSoftBody* psb,btScalar kst,btScalar ti)
  2869. {
  2870. BT_PROFILE("PSolve_Links");
  2871. for(int i=0,ni=psb->m_links.size();i<ni;++i)
  2872. {
  2873. Link& l=psb->m_links[i];
  2874. if(l.m_c0>0)
  2875. {
  2876. Node& a=*l.m_n[0];
  2877. Node& b=*l.m_n[1];
  2878. const btVector3 del=b.m_x-a.m_x;
  2879. const btScalar len=del.length2();
  2880. if (l.m_c1+len > SIMD_EPSILON)
  2881. {
  2882. const btScalar k=((l.m_c1-len)/(l.m_c0*(l.m_c1+len)))*kst;
  2883. a.m_x-=del*(k*a.m_im);
  2884. b.m_x+=del*(k*b.m_im);
  2885. }
  2886. }
  2887. }
  2888. }
  2889. //
  2890. void btSoftBody::VSolve_Links(btSoftBody* psb,btScalar kst)
  2891. {
  2892. BT_PROFILE("VSolve_Links");
  2893. for(int i=0,ni=psb->m_links.size();i<ni;++i)
  2894. {
  2895. Link& l=psb->m_links[i];
  2896. Node** n=l.m_n;
  2897. const btScalar j=-btDot(l.m_c3,n[0]->m_v-n[1]->m_v)*l.m_c2*kst;
  2898. n[0]->m_v+= l.m_c3*(j*n[0]->m_im);
  2899. n[1]->m_v-= l.m_c3*(j*n[1]->m_im);
  2900. }
  2901. }
  2902. //
  2903. btSoftBody::psolver_t btSoftBody::getSolver(ePSolver::_ solver)
  2904. {
  2905. switch(solver)
  2906. {
  2907. case ePSolver::Anchors:
  2908. return(&btSoftBody::PSolve_Anchors);
  2909. case ePSolver::Linear:
  2910. return(&btSoftBody::PSolve_Links);
  2911. case ePSolver::RContacts:
  2912. return(&btSoftBody::PSolve_RContacts);
  2913. case ePSolver::SContacts:
  2914. return(&btSoftBody::PSolve_SContacts);
  2915. default:
  2916. {
  2917. }
  2918. }
  2919. return(0);
  2920. }
  2921. //
  2922. btSoftBody::vsolver_t btSoftBody::getSolver(eVSolver::_ solver)
  2923. {
  2924. switch(solver)
  2925. {
  2926. case eVSolver::Linear: return(&btSoftBody::VSolve_Links);
  2927. default:
  2928. {
  2929. }
  2930. }
  2931. return(0);
  2932. }
  2933. //
  2934. void btSoftBody::defaultCollisionHandler(const btCollisionObjectWrapper* pcoWrap)
  2935. {
  2936. switch(m_cfg.collisions&fCollision::RVSmask)
  2937. {
  2938. case fCollision::SDF_RS:
  2939. {
  2940. btSoftColliders::CollideSDF_RS docollide;
  2941. btRigidBody* prb1=(btRigidBody*) btRigidBody::upcast(pcoWrap->getCollisionObject());
  2942. btTransform wtr=pcoWrap->getWorldTransform();
  2943. const btTransform ctr=pcoWrap->getWorldTransform();
  2944. const btScalar timemargin=(wtr.getOrigin()-ctr.getOrigin()).length();
  2945. const btScalar basemargin=getCollisionShape()->getMargin();
  2946. btVector3 mins;
  2947. btVector3 maxs;
  2948. ATTRIBUTE_ALIGNED16(btDbvtVolume) volume;
  2949. pcoWrap->getCollisionShape()->getAabb( pcoWrap->getWorldTransform(),
  2950. mins,
  2951. maxs);
  2952. volume=btDbvtVolume::FromMM(mins,maxs);
  2953. volume.Expand(btVector3(basemargin,basemargin,basemargin));
  2954. docollide.psb = this;
  2955. docollide.m_colObj1Wrap = pcoWrap;
  2956. docollide.m_rigidBody = prb1;
  2957. docollide.dynmargin = basemargin+timemargin;
  2958. docollide.stamargin = basemargin;
  2959. m_ndbvt.collideTV(m_ndbvt.m_root,volume,docollide);
  2960. }
  2961. break;
  2962. case fCollision::CL_RS:
  2963. {
  2964. btSoftColliders::CollideCL_RS collider;
  2965. collider.ProcessColObj(this,pcoWrap);
  2966. }
  2967. break;
  2968. }
  2969. }
  2970. //
  2971. void btSoftBody::defaultCollisionHandler(btSoftBody* psb)
  2972. {
  2973. const int cf=m_cfg.collisions&psb->m_cfg.collisions;
  2974. switch(cf&fCollision::SVSmask)
  2975. {
  2976. case fCollision::CL_SS:
  2977. {
  2978. //support self-collision if CL_SELF flag set
  2979. if (this!=psb || psb->m_cfg.collisions&fCollision::CL_SELF)
  2980. {
  2981. btSoftColliders::CollideCL_SS docollide;
  2982. docollide.ProcessSoftSoft(this,psb);
  2983. }
  2984. }
  2985. break;
  2986. case fCollision::VF_SS:
  2987. {
  2988. //only self-collision for Cluster, not Vertex-Face yet
  2989. if (this!=psb)
  2990. {
  2991. btSoftColliders::CollideVF_SS docollide;
  2992. /* common */
  2993. docollide.mrg= getCollisionShape()->getMargin()+
  2994. psb->getCollisionShape()->getMargin();
  2995. /* psb0 nodes vs psb1 faces */
  2996. docollide.psb[0]=this;
  2997. docollide.psb[1]=psb;
  2998. docollide.psb[0]->m_ndbvt.collideTT( docollide.psb[0]->m_ndbvt.m_root,
  2999. docollide.psb[1]->m_fdbvt.m_root,
  3000. docollide);
  3001. /* psb1 nodes vs psb0 faces */
  3002. docollide.psb[0]=psb;
  3003. docollide.psb[1]=this;
  3004. docollide.psb[0]->m_ndbvt.collideTT( docollide.psb[0]->m_ndbvt.m_root,
  3005. docollide.psb[1]->m_fdbvt.m_root,
  3006. docollide);
  3007. }
  3008. }
  3009. break;
  3010. default:
  3011. {
  3012. }
  3013. }
  3014. }
  3015. void btSoftBody::setWindVelocity( const btVector3 &velocity )
  3016. {
  3017. m_windVelocity = velocity;
  3018. }
  3019. const btVector3& btSoftBody::getWindVelocity()
  3020. {
  3021. return m_windVelocity;
  3022. }
  3023. int btSoftBody::calculateSerializeBufferSize() const
  3024. {
  3025. int sz = sizeof(btSoftBodyData);
  3026. return sz;
  3027. }
  3028. ///fills the dataBuffer and returns the struct name (and 0 on failure)
  3029. const char* btSoftBody::serialize(void* dataBuffer, class btSerializer* serializer) const
  3030. {
  3031. btSoftBodyData* sbd = (btSoftBodyData*) dataBuffer;
  3032. btCollisionObject::serialize(&sbd->m_collisionObjectData, serializer);
  3033. btHashMap<btHashPtr,int> m_nodeIndexMap;
  3034. sbd->m_numMaterials = m_materials.size();
  3035. sbd->m_materials = sbd->m_numMaterials? (SoftBodyMaterialData**) serializer->getUniquePointer((void*)&m_materials): 0;
  3036. if (sbd->m_materials)
  3037. {
  3038. int sz = sizeof(SoftBodyMaterialData*);
  3039. int numElem = sbd->m_numMaterials;
  3040. btChunk* chunk = serializer->allocate(sz,numElem);
  3041. //SoftBodyMaterialData** memPtr = chunk->m_oldPtr;
  3042. SoftBodyMaterialData** memPtr = (SoftBodyMaterialData**)chunk->m_oldPtr;
  3043. for (int i=0;i<numElem;i++,memPtr++)
  3044. {
  3045. btSoftBody::Material* mat = m_materials[i];
  3046. *memPtr = mat ? (SoftBodyMaterialData*)serializer->getUniquePointer((void*)mat) : 0;
  3047. if (!serializer->findPointer(mat))
  3048. {
  3049. //serialize it here
  3050. btChunk* chunk = serializer->allocate(sizeof(SoftBodyMaterialData),1);
  3051. SoftBodyMaterialData* memPtr = (SoftBodyMaterialData*)chunk->m_oldPtr;
  3052. memPtr->m_flags = mat->m_flags;
  3053. memPtr->m_angularStiffness = mat->m_kAST;
  3054. memPtr->m_linearStiffness = mat->m_kLST;
  3055. memPtr->m_volumeStiffness = mat->m_kVST;
  3056. serializer->finalizeChunk(chunk,"SoftBodyMaterialData",BT_SBMATERIAL_CODE,mat);
  3057. }
  3058. }
  3059. serializer->finalizeChunk(chunk,"SoftBodyMaterialData",BT_ARRAY_CODE,(void*) &m_materials);
  3060. }
  3061. sbd->m_numNodes = m_nodes.size();
  3062. sbd->m_nodes = sbd->m_numNodes ? (SoftBodyNodeData*)serializer->getUniquePointer((void*)&m_nodes): 0;
  3063. if (sbd->m_nodes)
  3064. {
  3065. int sz = sizeof(SoftBodyNodeData);
  3066. int numElem = sbd->m_numNodes;
  3067. btChunk* chunk = serializer->allocate(sz,numElem);
  3068. SoftBodyNodeData* memPtr = (SoftBodyNodeData*)chunk->m_oldPtr;
  3069. for (int i=0;i<numElem;i++,memPtr++)
  3070. {
  3071. m_nodes[i].m_f.serializeFloat( memPtr->m_accumulatedForce);
  3072. memPtr->m_area = m_nodes[i].m_area;
  3073. memPtr->m_attach = m_nodes[i].m_battach;
  3074. memPtr->m_inverseMass = m_nodes[i].m_im;
  3075. memPtr->m_material = m_nodes[i].m_material? (SoftBodyMaterialData*)serializer->getUniquePointer((void*) m_nodes[i].m_material):0;
  3076. m_nodes[i].m_n.serializeFloat(memPtr->m_normal);
  3077. m_nodes[i].m_x.serializeFloat(memPtr->m_position);
  3078. m_nodes[i].m_q.serializeFloat(memPtr->m_previousPosition);
  3079. m_nodes[i].m_v.serializeFloat(memPtr->m_velocity);
  3080. m_nodeIndexMap.insert(&m_nodes[i],i);
  3081. }
  3082. serializer->finalizeChunk(chunk,"SoftBodyNodeData",BT_SBNODE_CODE,(void*) &m_nodes);
  3083. }
  3084. sbd->m_numLinks = m_links.size();
  3085. sbd->m_links = sbd->m_numLinks? (SoftBodyLinkData*) serializer->getUniquePointer((void*)&m_links[0]):0;
  3086. if (sbd->m_links)
  3087. {
  3088. int sz = sizeof(SoftBodyLinkData);
  3089. int numElem = sbd->m_numLinks;
  3090. btChunk* chunk = serializer->allocate(sz,numElem);
  3091. SoftBodyLinkData* memPtr = (SoftBodyLinkData*)chunk->m_oldPtr;
  3092. for (int i=0;i<numElem;i++,memPtr++)
  3093. {
  3094. memPtr->m_bbending = m_links[i].m_bbending;
  3095. memPtr->m_material = m_links[i].m_material? (SoftBodyMaterialData*)serializer->getUniquePointer((void*) m_links[i].m_material):0;
  3096. memPtr->m_nodeIndices[0] = m_links[i].m_n[0] ? m_links[i].m_n[0] - &m_nodes[0]: -1;
  3097. memPtr->m_nodeIndices[1] = m_links[i].m_n[1] ? m_links[i].m_n[1] - &m_nodes[0]: -1;
  3098. btAssert(memPtr->m_nodeIndices[0]<m_nodes.size());
  3099. btAssert(memPtr->m_nodeIndices[1]<m_nodes.size());
  3100. memPtr->m_restLength = m_links[i].m_rl;
  3101. }
  3102. serializer->finalizeChunk(chunk,"SoftBodyLinkData",BT_ARRAY_CODE,(void*) &m_links[0]);
  3103. }
  3104. sbd->m_numFaces = m_faces.size();
  3105. sbd->m_faces = sbd->m_numFaces? (SoftBodyFaceData*) serializer->getUniquePointer((void*)&m_faces[0]):0;
  3106. if (sbd->m_faces)
  3107. {
  3108. int sz = sizeof(SoftBodyFaceData);
  3109. int numElem = sbd->m_numFaces;
  3110. btChunk* chunk = serializer->allocate(sz,numElem);
  3111. SoftBodyFaceData* memPtr = (SoftBodyFaceData*)chunk->m_oldPtr;
  3112. for (int i=0;i<numElem;i++,memPtr++)
  3113. {
  3114. memPtr->m_material = m_faces[i].m_material ? (SoftBodyMaterialData*) serializer->getUniquePointer((void*)m_faces[i].m_material): 0;
  3115. m_faces[i].m_normal.serializeFloat( memPtr->m_normal);
  3116. for (int j=0;j<3;j++)
  3117. {
  3118. memPtr->m_nodeIndices[j] = m_faces[i].m_n[j]? m_faces[i].m_n[j] - &m_nodes[0]: -1;
  3119. }
  3120. memPtr->m_restArea = m_faces[i].m_ra;
  3121. }
  3122. serializer->finalizeChunk(chunk,"SoftBodyFaceData",BT_ARRAY_CODE,(void*) &m_faces[0]);
  3123. }
  3124. sbd->m_numTetrahedra = m_tetras.size();
  3125. sbd->m_tetrahedra = sbd->m_numTetrahedra ? (SoftBodyTetraData*) serializer->getUniquePointer((void*)&m_tetras[0]):0;
  3126. if (sbd->m_tetrahedra)
  3127. {
  3128. int sz = sizeof(SoftBodyTetraData);
  3129. int numElem = sbd->m_numTetrahedra;
  3130. btChunk* chunk = serializer->allocate(sz,numElem);
  3131. SoftBodyTetraData* memPtr = (SoftBodyTetraData*)chunk->m_oldPtr;
  3132. for (int i=0;i<numElem;i++,memPtr++)
  3133. {
  3134. for (int j=0;j<4;j++)
  3135. {
  3136. m_tetras[i].m_c0[j].serializeFloat( memPtr->m_c0[j] );
  3137. memPtr->m_nodeIndices[j] = m_tetras[j].m_n[j]? m_tetras[j].m_n[j]-&m_nodes[0] : -1;
  3138. }
  3139. memPtr->m_c1 = m_tetras[i].m_c1;
  3140. memPtr->m_c2 = m_tetras[i].m_c2;
  3141. memPtr->m_material = m_tetras[i].m_material ? (SoftBodyMaterialData*)serializer->getUniquePointer((void*) m_tetras[i].m_material): 0;
  3142. memPtr->m_restVolume = m_tetras[i].m_rv;
  3143. }
  3144. serializer->finalizeChunk(chunk,"SoftBodyTetraData",BT_ARRAY_CODE,(void*) &m_tetras[0]);
  3145. }
  3146. sbd->m_numAnchors = m_anchors.size();
  3147. sbd->m_anchors = sbd->m_numAnchors ? (SoftRigidAnchorData*) serializer->getUniquePointer((void*)&m_anchors[0]):0;
  3148. if (sbd->m_anchors)
  3149. {
  3150. int sz = sizeof(SoftRigidAnchorData);
  3151. int numElem = sbd->m_numAnchors;
  3152. btChunk* chunk = serializer->allocate(sz,numElem);
  3153. SoftRigidAnchorData* memPtr = (SoftRigidAnchorData*)chunk->m_oldPtr;
  3154. for (int i=0;i<numElem;i++,memPtr++)
  3155. {
  3156. m_anchors[i].m_c0.serializeFloat(memPtr->m_c0);
  3157. m_anchors[i].m_c1.serializeFloat(memPtr->m_c1);
  3158. memPtr->m_c2 = m_anchors[i].m_c2;
  3159. m_anchors[i].m_local.serializeFloat(memPtr->m_localFrame);
  3160. memPtr->m_nodeIndex = m_anchors[i].m_node? m_anchors[i].m_node-&m_nodes[0]: -1;
  3161. memPtr->m_rigidBody = m_anchors[i].m_body? (btRigidBodyData*) serializer->getUniquePointer((void*)m_anchors[i].m_body): 0;
  3162. btAssert(memPtr->m_nodeIndex < m_nodes.size());
  3163. }
  3164. serializer->finalizeChunk(chunk,"SoftRigidAnchorData",BT_ARRAY_CODE,(void*) &m_anchors[0]);
  3165. }
  3166. sbd->m_config.m_dynamicFriction = m_cfg.kDF;
  3167. sbd->m_config.m_baumgarte = m_cfg.kVCF;
  3168. sbd->m_config.m_pressure = m_cfg.kPR;
  3169. sbd->m_config.m_aeroModel = this->m_cfg.aeromodel;
  3170. sbd->m_config.m_lift = m_cfg.kLF;
  3171. sbd->m_config.m_drag = m_cfg.kDG;
  3172. sbd->m_config.m_positionIterations = m_cfg.piterations;
  3173. sbd->m_config.m_driftIterations = m_cfg.diterations;
  3174. sbd->m_config.m_clusterIterations = m_cfg.citerations;
  3175. sbd->m_config.m_velocityIterations = m_cfg.viterations;
  3176. sbd->m_config.m_maxVolume = m_cfg.maxvolume;
  3177. sbd->m_config.m_damping = m_cfg.kDP;
  3178. sbd->m_config.m_poseMatch = m_cfg.kMT;
  3179. sbd->m_config.m_collisionFlags = m_cfg.collisions;
  3180. sbd->m_config.m_volume = m_cfg.kVC;
  3181. sbd->m_config.m_rigidContactHardness = m_cfg.kCHR;
  3182. sbd->m_config.m_kineticContactHardness = m_cfg.kKHR;
  3183. sbd->m_config.m_softContactHardness = m_cfg.kSHR;
  3184. sbd->m_config.m_anchorHardness = m_cfg.kAHR;
  3185. sbd->m_config.m_timeScale = m_cfg.timescale;
  3186. sbd->m_config.m_maxVolume = m_cfg.maxvolume;
  3187. sbd->m_config.m_softRigidClusterHardness = m_cfg.kSRHR_CL;
  3188. sbd->m_config.m_softKineticClusterHardness = m_cfg.kSKHR_CL;
  3189. sbd->m_config.m_softSoftClusterHardness = m_cfg.kSSHR_CL;
  3190. sbd->m_config.m_softRigidClusterImpulseSplit = m_cfg.kSR_SPLT_CL;
  3191. sbd->m_config.m_softKineticClusterImpulseSplit = m_cfg.kSK_SPLT_CL;
  3192. sbd->m_config.m_softSoftClusterImpulseSplit = m_cfg.kSS_SPLT_CL;
  3193. //pose for shape matching
  3194. {
  3195. sbd->m_pose = (SoftBodyPoseData*)serializer->getUniquePointer((void*)&m_pose);
  3196. int sz = sizeof(SoftBodyPoseData);
  3197. btChunk* chunk = serializer->allocate(sz,1);
  3198. SoftBodyPoseData* memPtr = (SoftBodyPoseData*)chunk->m_oldPtr;
  3199. m_pose.m_aqq.serializeFloat(memPtr->m_aqq);
  3200. memPtr->m_bframe = m_pose.m_bframe;
  3201. memPtr->m_bvolume = m_pose.m_bvolume;
  3202. m_pose.m_com.serializeFloat(memPtr->m_com);
  3203. memPtr->m_numPositions = m_pose.m_pos.size();
  3204. memPtr->m_positions = memPtr->m_numPositions ? (btVector3FloatData*)serializer->getUniquePointer((void*)&m_pose.m_pos[0]): 0;
  3205. if (memPtr->m_numPositions)
  3206. {
  3207. int numElem = memPtr->m_numPositions;
  3208. int sz = sizeof(btVector3Data);
  3209. btChunk* chunk = serializer->allocate(sz,numElem);
  3210. btVector3FloatData* memPtr = (btVector3FloatData*)chunk->m_oldPtr;
  3211. for (int i=0;i<numElem;i++,memPtr++)
  3212. {
  3213. m_pose.m_pos[i].serializeFloat(*memPtr);
  3214. }
  3215. serializer->finalizeChunk(chunk,"btVector3FloatData",BT_ARRAY_CODE,(void*)&m_pose.m_pos[0]);
  3216. }
  3217. memPtr->m_restVolume = m_pose.m_volume;
  3218. m_pose.m_rot.serializeFloat(memPtr->m_rot);
  3219. m_pose.m_scl.serializeFloat(memPtr->m_scale);
  3220. memPtr->m_numWeigts = m_pose.m_wgh.size();
  3221. memPtr->m_weights = memPtr->m_numWeigts? (float*) serializer->getUniquePointer((void*) &m_pose.m_wgh[0]) : 0;
  3222. if (memPtr->m_numWeigts)
  3223. {
  3224. int numElem = memPtr->m_numWeigts;
  3225. int sz = sizeof(float);
  3226. btChunk* chunk = serializer->allocate(sz,numElem);
  3227. float* memPtr = (float*) chunk->m_oldPtr;
  3228. for (int i=0;i<numElem;i++,memPtr++)
  3229. {
  3230. *memPtr = m_pose.m_wgh[i];
  3231. }
  3232. serializer->finalizeChunk(chunk,"float",BT_ARRAY_CODE,(void*)&m_pose.m_wgh[0]);
  3233. }
  3234. serializer->finalizeChunk(chunk,"SoftBodyPoseData",BT_ARRAY_CODE,(void*)&m_pose);
  3235. }
  3236. //clusters for convex-cluster collision detection
  3237. sbd->m_numClusters = m_clusters.size();
  3238. sbd->m_clusters = sbd->m_numClusters? (SoftBodyClusterData*) serializer->getUniquePointer((void*)m_clusters[0]) : 0;
  3239. if (sbd->m_numClusters)
  3240. {
  3241. int numElem = sbd->m_numClusters;
  3242. int sz = sizeof(SoftBodyClusterData);
  3243. btChunk* chunk = serializer->allocate(sz,numElem);
  3244. SoftBodyClusterData* memPtr = (SoftBodyClusterData*) chunk->m_oldPtr;
  3245. for (int i=0;i<numElem;i++,memPtr++)
  3246. {
  3247. memPtr->m_adamping= m_clusters[i]->m_adamping;
  3248. m_clusters[i]->m_av.serializeFloat(memPtr->m_av);
  3249. memPtr->m_clusterIndex = m_clusters[i]->m_clusterIndex;
  3250. memPtr->m_collide = m_clusters[i]->m_collide;
  3251. m_clusters[i]->m_com.serializeFloat(memPtr->m_com);
  3252. memPtr->m_containsAnchor = m_clusters[i]->m_containsAnchor;
  3253. m_clusters[i]->m_dimpulses[0].serializeFloat(memPtr->m_dimpulses[0]);
  3254. m_clusters[i]->m_dimpulses[1].serializeFloat(memPtr->m_dimpulses[1]);
  3255. m_clusters[i]->m_framexform.serializeFloat(memPtr->m_framexform);
  3256. memPtr->m_idmass = m_clusters[i]->m_idmass;
  3257. memPtr->m_imass = m_clusters[i]->m_imass;
  3258. m_clusters[i]->m_invwi.serializeFloat(memPtr->m_invwi);
  3259. memPtr->m_ldamping = m_clusters[i]->m_ldamping;
  3260. m_clusters[i]->m_locii.serializeFloat(memPtr->m_locii);
  3261. m_clusters[i]->m_lv.serializeFloat(memPtr->m_lv);
  3262. memPtr->m_matching = m_clusters[i]->m_matching;
  3263. memPtr->m_maxSelfCollisionImpulse = m_clusters[i]->m_maxSelfCollisionImpulse;
  3264. memPtr->m_ndamping = m_clusters[i]->m_ndamping;
  3265. memPtr->m_ldamping = m_clusters[i]->m_ldamping;
  3266. memPtr->m_adamping = m_clusters[i]->m_adamping;
  3267. memPtr->m_selfCollisionImpulseFactor = m_clusters[i]->m_selfCollisionImpulseFactor;
  3268. memPtr->m_numFrameRefs = m_clusters[i]->m_framerefs.size();
  3269. memPtr->m_numMasses = m_clusters[i]->m_masses.size();
  3270. memPtr->m_numNodes = m_clusters[i]->m_nodes.size();
  3271. memPtr->m_nvimpulses = m_clusters[i]->m_nvimpulses;
  3272. m_clusters[i]->m_vimpulses[0].serializeFloat(memPtr->m_vimpulses[0]);
  3273. m_clusters[i]->m_vimpulses[1].serializeFloat(memPtr->m_vimpulses[1]);
  3274. memPtr->m_ndimpulses = m_clusters[i]->m_ndimpulses;
  3275. memPtr->m_framerefs = memPtr->m_numFrameRefs? (btVector3FloatData*)serializer->getUniquePointer((void*)&m_clusters[i]->m_framerefs[0]) : 0;
  3276. if (memPtr->m_framerefs)
  3277. {
  3278. int numElem = memPtr->m_numFrameRefs;
  3279. int sz = sizeof(btVector3FloatData);
  3280. btChunk* chunk = serializer->allocate(sz,numElem);
  3281. btVector3FloatData* memPtr = (btVector3FloatData*) chunk->m_oldPtr;
  3282. for (int j=0;j<numElem;j++,memPtr++)
  3283. {
  3284. m_clusters[i]->m_framerefs[j].serializeFloat(*memPtr);
  3285. }
  3286. serializer->finalizeChunk(chunk,"btVector3FloatData",BT_ARRAY_CODE,(void*)&m_clusters[i]->m_framerefs[0]);
  3287. }
  3288. memPtr->m_masses = memPtr->m_numMasses ? (float*) serializer->getUniquePointer((void*)&m_clusters[i]->m_masses[0]): 0;
  3289. if (memPtr->m_masses)
  3290. {
  3291. int numElem = memPtr->m_numMasses;
  3292. int sz = sizeof(float);
  3293. btChunk* chunk = serializer->allocate(sz,numElem);
  3294. float* memPtr = (float*) chunk->m_oldPtr;
  3295. for (int j=0;j<numElem;j++,memPtr++)
  3296. {
  3297. *memPtr = m_clusters[i]->m_masses[j];
  3298. }
  3299. serializer->finalizeChunk(chunk,"float",BT_ARRAY_CODE,(void*)&m_clusters[i]->m_masses[0]);
  3300. }
  3301. memPtr->m_nodeIndices = memPtr->m_numNodes ? (int*) serializer->getUniquePointer((void*) &m_clusters[i]->m_nodes) : 0;
  3302. if (memPtr->m_nodeIndices )
  3303. {
  3304. int numElem = memPtr->m_numMasses;
  3305. int sz = sizeof(int);
  3306. btChunk* chunk = serializer->allocate(sz,numElem);
  3307. int* memPtr = (int*) chunk->m_oldPtr;
  3308. for (int j=0;j<numElem;j++,memPtr++)
  3309. {
  3310. int* indexPtr = m_nodeIndexMap.find(m_clusters[i]->m_nodes[j]);
  3311. btAssert(indexPtr);
  3312. *memPtr = *indexPtr;
  3313. }
  3314. serializer->finalizeChunk(chunk,"int",BT_ARRAY_CODE,(void*)&m_clusters[i]->m_nodes);
  3315. }
  3316. }
  3317. serializer->finalizeChunk(chunk,"SoftBodyClusterData",BT_ARRAY_CODE,(void*)m_clusters[0]);
  3318. }
  3319. sbd->m_numJoints = m_joints.size();
  3320. sbd->m_joints = m_joints.size()? (btSoftBodyJointData*) serializer->getUniquePointer((void*)&m_joints[0]) : 0;
  3321. if (sbd->m_joints)
  3322. {
  3323. int sz = sizeof(btSoftBodyJointData);
  3324. int numElem = m_joints.size();
  3325. btChunk* chunk = serializer->allocate(sz,numElem);
  3326. btSoftBodyJointData* memPtr = (btSoftBodyJointData*)chunk->m_oldPtr;
  3327. for (int i=0;i<numElem;i++,memPtr++)
  3328. {
  3329. memPtr->m_jointType = (int)m_joints[i]->Type();
  3330. m_joints[i]->m_refs[0].serializeFloat(memPtr->m_refs[0]);
  3331. m_joints[i]->m_refs[1].serializeFloat(memPtr->m_refs[1]);
  3332. memPtr->m_cfm = m_joints[i]->m_cfm;
  3333. memPtr->m_erp = float(m_joints[i]->m_erp);
  3334. memPtr->m_split = float(m_joints[i]->m_split);
  3335. memPtr->m_delete = m_joints[i]->m_delete;
  3336. for (int j=0;j<4;j++)
  3337. {
  3338. memPtr->m_relPosition[0].m_floats[j] = 0.f;
  3339. memPtr->m_relPosition[1].m_floats[j] = 0.f;
  3340. }
  3341. memPtr->m_bodyA = 0;
  3342. memPtr->m_bodyB = 0;
  3343. if (m_joints[i]->m_bodies[0].m_soft)
  3344. {
  3345. memPtr->m_bodyAtype = BT_JOINT_SOFT_BODY_CLUSTER;
  3346. memPtr->m_bodyA = serializer->getUniquePointer((void*)m_joints[i]->m_bodies[0].m_soft);
  3347. }
  3348. if (m_joints[i]->m_bodies[0].m_collisionObject)
  3349. {
  3350. memPtr->m_bodyAtype = BT_JOINT_COLLISION_OBJECT;
  3351. memPtr->m_bodyA = serializer->getUniquePointer((void*)m_joints[i]->m_bodies[0].m_collisionObject);
  3352. }
  3353. if (m_joints[i]->m_bodies[0].m_rigid)
  3354. {
  3355. memPtr->m_bodyAtype = BT_JOINT_RIGID_BODY;
  3356. memPtr->m_bodyA = serializer->getUniquePointer((void*)m_joints[i]->m_bodies[0].m_rigid);
  3357. }
  3358. if (m_joints[i]->m_bodies[1].m_soft)
  3359. {
  3360. memPtr->m_bodyBtype = BT_JOINT_SOFT_BODY_CLUSTER;
  3361. memPtr->m_bodyB = serializer->getUniquePointer((void*)m_joints[i]->m_bodies[1].m_soft);
  3362. }
  3363. if (m_joints[i]->m_bodies[1].m_collisionObject)
  3364. {
  3365. memPtr->m_bodyBtype = BT_JOINT_COLLISION_OBJECT;
  3366. memPtr->m_bodyB = serializer->getUniquePointer((void*)m_joints[i]->m_bodies[1].m_collisionObject);
  3367. }
  3368. if (m_joints[i]->m_bodies[1].m_rigid)
  3369. {
  3370. memPtr->m_bodyBtype = BT_JOINT_RIGID_BODY;
  3371. memPtr->m_bodyB = serializer->getUniquePointer((void*)m_joints[i]->m_bodies[1].m_rigid);
  3372. }
  3373. }
  3374. serializer->finalizeChunk(chunk,"btSoftBodyJointData",BT_ARRAY_CODE,(void*) &m_joints[0]);
  3375. }
  3376. return btSoftBodyDataName;
  3377. }