12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375103761037710378103791038010381103821038310384103851038610387103881038910390103911039210393103941039510396103971039810399104001040110402104031040410405104061040710408104091041010411104121041310414104151041610417104181041910420104211042210423104241042510426104271042810429104301043110432104331043410435104361043710438104391044010441104421044310444104451044610447104481044910450104511045210453104541045510456104571045810459104601046110462104631046410465104661046710468104691047010471104721047310474104751047610477104781047910480104811048210483104841048510486104871048810489104901049110492104931049410495104961049710498104991050010501105021050310504105051050610507105081050910510105111051210513105141051510516105171051810519105201052110522105231052410525105261052710528105291053010531105321053310534105351053610537105381053910540105411054210543105441054510546105471054810549105501055110552105531055410555105561055710558105591056010561105621056310564105651056610567105681056910570105711057210573105741057510576105771057810579105801058110582105831058410585105861058710588105891059010591105921059310594105951059610597105981059910600106011060210603106041060510606106071060810609106101061110612106131061410615106161061710618106191062010621106221062310624106251062610627106281062910630106311063210633106341063510636106371063810639106401064110642106431064410645106461064710648106491065010651106521065310654106551065610657106581065910660106611066210663106641066510666106671066810669106701067110672106731067410675106761067710678106791068010681106821068310684106851068610687106881068910690106911069210693106941069510696106971069810699107001070110702107031070410705107061070710708107091071010711107121071310714107151071610717107181071910720107211072210723107241072510726107271072810729107301073110732107331073410735107361073710738107391074010741107421074310744107451074610747107481074910750107511075210753107541075510756107571075810759107601076110762107631076410765107661076710768107691077010771107721077310774107751077610777107781077910780107811078210783107841078510786107871078810789107901079110792107931079410795107961079710798107991080010801108021080310804108051080610807108081080910810108111081210813108141081510816108171081810819108201082110822108231082410825108261082710828108291083010831108321083310834108351083610837108381083910840108411084210843108441084510846108471084810849108501085110852108531085410855108561085710858108591086010861108621086310864108651086610867108681086910870108711087210873108741087510876108771087810879108801088110882108831088410885108861088710888108891089010891108921089310894108951089610897108981089910900109011090210903109041090510906109071090810909109101091110912109131091410915109161091710918109191092010921109221092310924109251092610927109281092910930109311093210933109341093510936109371093810939109401094110942109431094410945109461094710948109491095010951109521095310954109551095610957109581095910960109611096210963109641096510966109671096810969109701097110972109731097410975109761097710978109791098010981109821098310984109851098610987109881098910990109911099210993109941099510996109971099810999110001100111002110031100411005110061100711008110091101011011110121101311014110151101611017110181101911020110211102211023110241102511026110271102811029110301103111032110331103411035110361103711038110391104011041110421104311044110451104611047110481104911050110511105211053110541105511056110571105811059110601106111062110631106411065110661106711068110691107011071110721107311074110751107611077110781107911080110811108211083110841108511086110871108811089110901109111092110931109411095110961109711098110991110011101111021110311104111051110611107111081110911110111111111211113111141111511116111171111811119111201112111122111231112411125111261112711128111291113011131111321113311134111351113611137111381113911140111411114211143111441114511146111471114811149111501115111152111531115411155111561115711158111591116011161111621116311164111651116611167111681116911170111711117211173111741117511176111771117811179111801118111182111831118411185111861118711188111891119011191111921119311194111951119611197111981119911200112011120211203112041120511206112071120811209112101121111212112131121411215112161121711218112191122011221112221122311224112251122611227112281122911230112311123211233112341123511236112371123811239112401124111242112431124411245112461124711248112491125011251112521125311254112551125611257112581125911260112611126211263112641126511266112671126811269112701127111272112731127411275112761127711278112791128011281112821128311284112851128611287112881128911290112911129211293112941129511296112971129811299113001130111302113031130411305113061130711308113091131011311113121131311314113151131611317113181131911320113211132211323113241132511326113271132811329113301133111332113331133411335113361133711338113391134011341113421134311344113451134611347113481134911350113511135211353113541135511356113571135811359113601136111362113631136411365113661136711368113691137011371113721137311374113751137611377113781137911380113811138211383113841138511386113871138811389113901139111392113931139411395113961139711398113991140011401114021140311404114051140611407114081140911410114111141211413114141141511416114171141811419114201142111422114231142411425114261142711428114291143011431114321143311434114351143611437114381143911440114411144211443114441144511446114471144811449114501145111452114531145411455114561145711458114591146011461114621146311464114651146611467114681146911470114711147211473114741147511476114771147811479114801148111482114831148411485114861148711488114891149011491114921149311494114951149611497114981149911500115011150211503115041150511506115071150811509115101151111512115131151411515115161151711518115191152011521115221152311524115251152611527115281152911530115311153211533115341153511536115371153811539115401154111542115431154411545115461154711548115491155011551115521155311554115551155611557115581155911560115611156211563115641156511566115671156811569115701157111572115731157411575115761157711578115791158011581115821158311584115851158611587115881158911590115911159211593115941159511596115971159811599116001160111602116031160411605116061160711608116091161011611116121161311614116151161611617116181161911620116211162211623116241162511626116271162811629116301163111632116331163411635116361163711638116391164011641116421164311644116451164611647116481164911650116511165211653116541165511656116571165811659116601166111662116631166411665116661166711668116691167011671116721167311674116751167611677116781167911680116811168211683116841168511686116871168811689116901169111692116931169411695116961169711698116991170011701117021170311704117051170611707117081170911710117111171211713117141171511716117171171811719117201172111722117231172411725117261172711728117291173011731117321173311734117351173611737117381173911740117411174211743117441174511746117471174811749117501175111752117531175411755117561175711758117591176011761117621176311764117651176611767117681176911770117711177211773117741177511776117771177811779117801178111782117831178411785117861178711788117891179011791117921179311794117951179611797117981179911800118011180211803118041180511806118071180811809118101181111812118131181411815118161181711818118191182011821118221182311824118251182611827118281182911830118311183211833118341183511836118371183811839118401184111842118431184411845118461184711848118491185011851118521185311854118551185611857118581185911860118611186211863118641186511866118671186811869118701187111872118731187411875118761187711878118791188011881118821188311884118851188611887118881188911890118911189211893118941189511896118971189811899119001190111902119031190411905119061190711908119091191011911119121191311914119151191611917119181191911920119211192211923119241192511926119271192811929119301193111932119331193411935119361193711938119391194011941119421194311944119451194611947119481194911950119511195211953119541195511956119571195811959119601196111962119631196411965119661196711968119691197011971119721197311974119751197611977119781197911980119811198211983119841198511986119871198811989119901199111992119931199411995119961199711998119991200012001120021200312004120051200612007120081200912010120111201212013120141201512016120171201812019120201202112022120231202412025120261202712028120291203012031120321203312034120351203612037120381203912040120411204212043120441204512046120471204812049120501205112052120531205412055120561205712058120591206012061120621206312064120651206612067120681206912070120711207212073120741207512076120771207812079120801208112082120831208412085120861208712088120891209012091120921209312094120951209612097120981209912100121011210212103121041210512106121071210812109121101211112112121131211412115121161211712118121191212012121121221212312124121251212612127121281212912130121311213212133121341213512136121371213812139121401214112142121431214412145121461214712148121491215012151121521215312154121551215612157121581215912160121611216212163121641216512166121671216812169121701217112172121731217412175121761217712178121791218012181121821218312184121851218612187121881218912190121911219212193121941219512196121971219812199122001220112202122031220412205122061220712208122091221012211122121221312214122151221612217122181221912220122211222212223122241222512226122271222812229122301223112232122331223412235122361223712238122391224012241122421224312244122451224612247122481224912250122511225212253122541225512256122571225812259122601226112262122631226412265122661226712268122691227012271122721227312274122751227612277122781227912280122811228212283122841228512286122871228812289122901229112292122931229412295122961229712298122991230012301123021230312304123051230612307123081230912310123111231212313123141231512316123171231812319123201232112322123231232412325123261232712328123291233012331123321233312334123351233612337123381233912340123411234212343123441234512346123471234812349123501235112352123531235412355123561235712358123591236012361123621236312364123651236612367123681236912370123711237212373123741237512376123771237812379123801238112382123831238412385123861238712388123891239012391123921239312394123951239612397123981239912400124011240212403124041240512406124071240812409124101241112412124131241412415124161241712418124191242012421124221242312424124251242612427124281242912430124311243212433124341243512436124371243812439124401244112442124431244412445124461244712448124491245012451124521245312454124551245612457124581245912460124611246212463124641246512466124671246812469124701247112472124731247412475124761247712478124791248012481124821248312484124851248612487124881248912490124911249212493124941249512496124971249812499125001250112502125031250412505125061250712508125091251012511125121251312514125151251612517125181251912520125211252212523125241252512526125271252812529125301253112532125331253412535125361253712538125391254012541125421254312544125451254612547125481254912550125511255212553125541255512556125571255812559125601256112562125631256412565125661256712568125691257012571125721257312574125751257612577125781257912580125811258212583125841258512586125871258812589125901259112592125931259412595125961259712598125991260012601126021260312604126051260612607126081260912610126111261212613126141261512616126171261812619126201262112622126231262412625126261262712628126291263012631126321263312634126351263612637126381263912640126411264212643126441264512646126471264812649126501265112652126531265412655126561265712658126591266012661126621266312664126651266612667126681266912670126711267212673126741267512676126771267812679126801268112682126831268412685126861268712688126891269012691126921269312694126951269612697126981269912700127011270212703127041270512706127071270812709127101271112712127131271412715127161271712718127191272012721127221272312724127251272612727127281272912730127311273212733127341273512736127371273812739127401274112742127431274412745127461274712748127491275012751127521275312754127551275612757127581275912760127611276212763127641276512766127671276812769127701277112772127731277412775127761277712778127791278012781127821278312784127851278612787127881278912790127911279212793127941279512796127971279812799128001280112802128031280412805128061280712808128091281012811128121281312814128151281612817128181281912820128211282212823128241282512826128271282812829128301283112832128331283412835128361283712838128391284012841128421284312844128451284612847128481284912850128511285212853128541285512856128571285812859128601286112862128631286412865128661286712868128691287012871128721287312874128751287612877128781287912880128811288212883128841288512886128871288812889128901289112892128931289412895128961289712898128991290012901129021290312904129051290612907129081290912910129111291212913129141291512916129171291812919129201292112922129231292412925129261292712928129291293012931129321293312934129351293612937129381293912940129411294212943129441294512946129471294812949129501295112952129531295412955129561295712958129591296012961129621296312964129651296612967129681296912970129711297212973129741297512976129771297812979129801298112982129831298412985129861298712988129891299012991129921299312994129951299612997129981299913000130011300213003130041300513006130071300813009130101301113012130131301413015130161301713018130191302013021130221302313024130251302613027130281302913030130311303213033130341303513036130371303813039130401304113042130431304413045130461304713048130491305013051130521305313054130551305613057130581305913060130611306213063130641306513066130671306813069130701307113072130731307413075130761307713078130791308013081130821308313084130851308613087130881308913090130911309213093130941309513096130971309813099131001310113102131031310413105131061310713108131091311013111131121311313114131151311613117131181311913120131211312213123131241312513126131271312813129131301313113132131331313413135131361313713138131391314013141131421314313144131451314613147131481314913150131511315213153131541315513156131571315813159131601316113162131631316413165131661316713168131691317013171131721317313174131751317613177131781317913180131811318213183131841318513186131871318813189131901319113192131931319413195131961319713198131991320013201132021320313204132051320613207132081320913210132111321213213132141321513216132171321813219132201322113222132231322413225132261322713228132291323013231132321323313234132351323613237132381323913240132411324213243132441324513246132471324813249132501325113252132531325413255132561325713258132591326013261132621326313264132651326613267132681326913270132711327213273132741327513276132771327813279132801328113282132831328413285132861328713288132891329013291132921329313294132951329613297132981329913300133011330213303133041330513306133071330813309133101331113312133131331413315133161331713318133191332013321133221332313324133251332613327133281332913330133311333213333133341333513336133371333813339133401334113342133431334413345133461334713348133491335013351133521335313354133551335613357133581335913360133611336213363133641336513366133671336813369133701337113372133731337413375133761337713378133791338013381133821338313384133851338613387133881338913390133911339213393133941339513396133971339813399134001340113402134031340413405134061340713408134091341013411134121341313414134151341613417134181341913420134211342213423134241342513426134271342813429134301343113432134331343413435134361343713438134391344013441134421344313444134451344613447134481344913450134511345213453134541345513456134571345813459134601346113462134631346413465134661346713468134691347013471134721347313474134751347613477134781347913480134811348213483134841348513486134871348813489134901349113492134931349413495134961349713498134991350013501135021350313504135051350613507135081350913510135111351213513135141351513516135171351813519135201352113522135231352413525135261352713528135291353013531135321353313534135351353613537135381353913540135411354213543135441354513546135471354813549135501355113552135531355413555135561355713558135591356013561135621356313564135651356613567135681356913570135711357213573135741357513576135771357813579135801358113582135831358413585135861358713588135891359013591135921359313594135951359613597135981359913600136011360213603136041360513606136071360813609136101361113612136131361413615136161361713618136191362013621136221362313624136251362613627136281362913630136311363213633136341363513636136371363813639136401364113642136431364413645136461364713648136491365013651136521365313654136551365613657136581365913660136611366213663136641366513666136671366813669136701367113672136731367413675136761367713678136791368013681136821368313684136851368613687136881368913690136911369213693136941369513696136971369813699137001370113702137031370413705137061370713708137091371013711137121371313714137151371613717137181371913720137211372213723137241372513726137271372813729137301373113732137331373413735137361373713738137391374013741137421374313744137451374613747137481374913750137511375213753137541375513756137571375813759137601376113762137631376413765137661376713768137691377013771137721377313774137751377613777137781377913780137811378213783137841378513786137871378813789137901379113792137931379413795137961379713798137991380013801138021380313804138051380613807138081380913810138111381213813138141381513816138171381813819138201382113822138231382413825138261382713828138291383013831138321383313834138351383613837138381383913840138411384213843138441384513846138471384813849138501385113852138531385413855138561385713858138591386013861138621386313864138651386613867138681386913870138711387213873138741387513876138771387813879138801388113882138831388413885138861388713888138891389013891138921389313894138951389613897138981389913900139011390213903139041390513906139071390813909139101391113912139131391413915139161391713918139191392013921139221392313924139251392613927139281392913930139311393213933139341393513936139371393813939139401394113942139431394413945139461394713948139491395013951139521395313954139551395613957139581395913960139611396213963139641396513966139671396813969139701397113972139731397413975139761397713978139791398013981139821398313984139851398613987139881398913990139911399213993139941399513996139971399813999140001400114002140031400414005140061400714008140091401014011140121401314014140151401614017140181401914020140211402214023140241402514026140271402814029140301403114032140331403414035140361403714038140391404014041140421404314044140451404614047140481404914050140511405214053140541405514056140571405814059140601406114062140631406414065140661406714068140691407014071140721407314074140751407614077140781407914080140811408214083140841408514086140871408814089140901409114092140931409414095140961409714098140991410014101141021410314104141051410614107141081410914110141111411214113141141411514116141171411814119141201412114122141231412414125141261412714128141291413014131141321413314134141351413614137141381413914140141411414214143141441414514146141471414814149141501415114152141531415414155141561415714158141591416014161141621416314164141651416614167141681416914170141711417214173141741417514176141771417814179141801418114182141831418414185141861418714188141891419014191141921419314194141951419614197141981419914200142011420214203142041420514206142071420814209142101421114212142131421414215142161421714218142191422014221142221422314224142251422614227142281422914230142311423214233142341423514236142371423814239142401424114242142431424414245142461424714248142491425014251142521425314254142551425614257142581425914260142611426214263142641426514266142671426814269142701427114272142731427414275142761427714278142791428014281142821428314284142851428614287142881428914290142911429214293142941429514296142971429814299143001430114302143031430414305143061430714308143091431014311143121431314314143151431614317143181431914320143211432214323143241432514326143271432814329143301433114332143331433414335143361433714338143391434014341143421434314344143451434614347143481434914350143511435214353143541435514356143571435814359143601436114362143631436414365143661436714368143691437014371143721437314374143751437614377143781437914380143811438214383143841438514386143871438814389143901439114392143931439414395143961439714398143991440014401144021440314404144051440614407144081440914410144111441214413144141441514416144171441814419144201442114422144231442414425144261442714428144291443014431144321443314434144351443614437144381443914440144411444214443144441444514446144471444814449144501445114452144531445414455144561445714458144591446014461144621446314464144651446614467144681446914470144711447214473144741447514476144771447814479144801448114482144831448414485144861448714488144891449014491144921449314494144951449614497144981449914500145011450214503145041450514506145071450814509145101451114512145131451414515145161451714518145191452014521145221452314524145251452614527145281452914530145311453214533145341453514536145371453814539145401454114542145431454414545145461454714548145491455014551145521455314554145551455614557145581455914560145611456214563145641456514566145671456814569145701457114572145731457414575145761457714578145791458014581145821458314584145851458614587145881458914590145911459214593145941459514596145971459814599146001460114602146031460414605146061460714608146091461014611146121461314614146151461614617146181461914620146211462214623146241462514626146271462814629146301463114632146331463414635146361463714638146391464014641146421464314644146451464614647146481464914650146511465214653146541465514656146571465814659146601466114662146631466414665146661466714668146691467014671146721467314674146751467614677146781467914680146811468214683146841468514686146871468814689146901469114692146931469414695146961469714698146991470014701147021470314704147051470614707147081470914710147111471214713147141471514716147171471814719147201472114722147231472414725147261472714728147291473014731147321473314734147351473614737147381473914740147411474214743147441474514746147471474814749147501475114752147531475414755147561475714758147591476014761147621476314764147651476614767147681476914770147711477214773147741477514776147771477814779147801478114782147831478414785147861478714788147891479014791147921479314794147951479614797147981479914800148011480214803148041480514806148071480814809148101481114812148131481414815148161481714818148191482014821148221482314824148251482614827148281482914830148311483214833148341483514836148371483814839148401484114842148431484414845148461484714848148491485014851148521485314854148551485614857148581485914860148611486214863148641486514866148671486814869148701487114872148731487414875148761487714878148791488014881148821488314884148851488614887148881488914890148911489214893148941489514896148971489814899149001490114902149031490414905149061490714908149091491014911149121491314914149151491614917149181491914920149211492214923149241492514926149271492814929149301493114932149331493414935149361493714938149391494014941149421494314944149451494614947149481494914950149511495214953149541495514956149571495814959149601496114962149631496414965149661496714968149691497014971149721497314974149751497614977149781497914980149811498214983149841498514986149871498814989149901499114992149931499414995149961499714998149991500015001150021500315004150051500615007150081500915010150111501215013150141501515016150171501815019150201502115022150231502415025150261502715028150291503015031150321503315034150351503615037150381503915040150411504215043150441504515046150471504815049150501505115052150531505415055150561505715058150591506015061150621506315064150651506615067150681506915070150711507215073150741507515076150771507815079150801508115082150831508415085150861508715088150891509015091150921509315094150951509615097150981509915100151011510215103151041510515106151071510815109151101511115112151131511415115151161511715118151191512015121151221512315124151251512615127151281512915130151311513215133151341513515136151371513815139151401514115142151431514415145151461514715148151491515015151151521515315154151551515615157151581515915160151611516215163151641516515166151671516815169151701517115172151731517415175151761517715178151791518015181151821518315184151851518615187151881518915190151911519215193151941519515196151971519815199152001520115202152031520415205152061520715208152091521015211152121521315214152151521615217152181521915220152211522215223152241522515226152271522815229152301523115232152331523415235152361523715238152391524015241152421524315244152451524615247152481524915250152511525215253152541525515256152571525815259152601526115262152631526415265152661526715268152691527015271152721527315274152751527615277152781527915280152811528215283152841528515286152871528815289152901529115292152931529415295152961529715298152991530015301153021530315304153051530615307153081530915310153111531215313153141531515316153171531815319153201532115322153231532415325153261532715328153291533015331153321533315334153351533615337153381533915340153411534215343153441534515346153471534815349153501535115352153531535415355153561535715358153591536015361153621536315364153651536615367153681536915370153711537215373153741537515376153771537815379153801538115382153831538415385153861538715388153891539015391153921539315394153951539615397153981539915400154011540215403154041540515406154071540815409154101541115412154131541415415154161541715418154191542015421154221542315424154251542615427154281542915430154311543215433154341543515436154371543815439154401544115442154431544415445154461544715448154491545015451154521545315454154551545615457154581545915460154611546215463154641546515466154671546815469154701547115472154731547415475154761547715478154791548015481154821548315484154851548615487154881548915490154911549215493154941549515496154971549815499155001550115502155031550415505155061550715508155091551015511155121551315514155151551615517155181551915520155211552215523155241552515526155271552815529155301553115532155331553415535155361553715538155391554015541155421554315544155451554615547155481554915550155511555215553155541555515556155571555815559155601556115562155631556415565155661556715568155691557015571155721557315574155751557615577155781557915580155811558215583155841558515586155871558815589155901559115592155931559415595155961559715598155991560015601156021560315604156051560615607156081560915610156111561215613156141561515616156171561815619156201562115622156231562415625156261562715628156291563015631156321563315634156351563615637156381563915640156411564215643156441564515646156471564815649156501565115652156531565415655156561565715658156591566015661156621566315664156651566615667156681566915670156711567215673156741567515676156771567815679156801568115682156831568415685156861568715688156891569015691156921569315694156951569615697156981569915700157011570215703157041570515706157071570815709157101571115712157131571415715157161571715718157191572015721157221572315724157251572615727157281572915730157311573215733157341573515736157371573815739157401574115742157431574415745157461574715748157491575015751157521575315754157551575615757157581575915760157611576215763157641576515766157671576815769157701577115772157731577415775157761577715778157791578015781157821578315784157851578615787157881578915790157911579215793157941579515796157971579815799158001580115802158031580415805158061580715808158091581015811158121581315814158151581615817158181581915820158211582215823158241582515826158271582815829158301583115832158331583415835158361583715838158391584015841158421584315844158451584615847158481584915850158511585215853158541585515856158571585815859158601586115862158631586415865158661586715868158691587015871158721587315874158751587615877158781587915880158811588215883158841588515886158871588815889158901589115892158931589415895158961589715898158991590015901159021590315904159051590615907159081590915910159111591215913159141591515916159171591815919159201592115922159231592415925159261592715928159291593015931159321593315934159351593615937159381593915940159411594215943159441594515946159471594815949159501595115952159531595415955159561595715958159591596015961159621596315964159651596615967159681596915970159711597215973159741597515976159771597815979159801598115982159831598415985159861598715988159891599015991159921599315994159951599615997159981599916000160011600216003160041600516006160071600816009160101601116012160131601416015160161601716018160191602016021160221602316024160251602616027160281602916030160311603216033160341603516036160371603816039160401604116042160431604416045160461604716048160491605016051160521605316054160551605616057160581605916060160611606216063160641606516066160671606816069160701607116072160731607416075160761607716078160791608016081160821608316084160851608616087160881608916090160911609216093160941609516096160971609816099161001610116102161031610416105161061610716108161091611016111161121611316114161151611616117161181611916120161211612216123161241612516126161271612816129161301613116132161331613416135161361613716138161391614016141161421614316144161451614616147161481614916150161511615216153161541615516156161571615816159161601616116162161631616416165161661616716168161691617016171161721617316174161751617616177161781617916180161811618216183161841618516186161871618816189161901619116192161931619416195161961619716198161991620016201162021620316204162051620616207162081620916210162111621216213162141621516216162171621816219162201622116222162231622416225162261622716228162291623016231162321623316234162351623616237162381623916240162411624216243162441624516246162471624816249162501625116252162531625416255162561625716258162591626016261162621626316264162651626616267162681626916270162711627216273162741627516276162771627816279162801628116282162831628416285162861628716288162891629016291162921629316294162951629616297162981629916300163011630216303163041630516306163071630816309163101631116312163131631416315163161631716318163191632016321163221632316324163251632616327163281632916330163311633216333163341633516336163371633816339163401634116342163431634416345163461634716348163491635016351163521635316354163551635616357163581635916360163611636216363163641636516366163671636816369163701637116372163731637416375163761637716378163791638016381163821638316384163851638616387163881638916390163911639216393163941639516396163971639816399164001640116402164031640416405164061640716408164091641016411164121641316414164151641616417164181641916420164211642216423164241642516426164271642816429164301643116432164331643416435164361643716438164391644016441164421644316444164451644616447164481644916450164511645216453164541645516456164571645816459164601646116462164631646416465164661646716468164691647016471164721647316474164751647616477164781647916480164811648216483164841648516486164871648816489164901649116492164931649416495164961649716498164991650016501165021650316504165051650616507165081650916510165111651216513165141651516516165171651816519165201652116522165231652416525165261652716528165291653016531165321653316534165351653616537165381653916540165411654216543165441654516546165471654816549165501655116552165531655416555165561655716558165591656016561165621656316564165651656616567165681656916570165711657216573165741657516576165771657816579165801658116582165831658416585165861658716588165891659016591165921659316594165951659616597165981659916600166011660216603166041660516606166071660816609166101661116612166131661416615166161661716618166191662016621166221662316624166251662616627166281662916630166311663216633166341663516636166371663816639166401664116642166431664416645166461664716648166491665016651166521665316654166551665616657166581665916660166611666216663166641666516666166671666816669166701667116672166731667416675166761667716678166791668016681166821668316684166851668616687166881668916690166911669216693166941669516696166971669816699167001670116702167031670416705167061670716708167091671016711167121671316714167151671616717167181671916720167211672216723167241672516726167271672816729167301673116732167331673416735167361673716738167391674016741167421674316744167451674616747167481674916750167511675216753167541675516756167571675816759167601676116762167631676416765167661676716768167691677016771167721677316774167751677616777167781677916780167811678216783167841678516786167871678816789167901679116792167931679416795167961679716798167991680016801168021680316804168051680616807168081680916810168111681216813168141681516816168171681816819168201682116822168231682416825168261682716828168291683016831168321683316834168351683616837168381683916840168411684216843168441684516846168471684816849168501685116852168531685416855168561685716858168591686016861168621686316864168651686616867168681686916870168711687216873168741687516876168771687816879168801688116882168831688416885168861688716888168891689016891168921689316894168951689616897168981689916900169011690216903169041690516906169071690816909169101691116912169131691416915169161691716918169191692016921169221692316924169251692616927169281692916930169311693216933169341693516936169371693816939169401694116942169431694416945169461694716948169491695016951169521695316954169551695616957169581695916960169611696216963169641696516966169671696816969169701697116972169731697416975169761697716978169791698016981169821698316984169851698616987169881698916990169911699216993169941699516996169971699816999170001700117002170031700417005170061700717008170091701017011170121701317014170151701617017170181701917020170211702217023170241702517026170271702817029170301703117032170331703417035170361703717038170391704017041170421704317044170451704617047170481704917050170511705217053170541705517056170571705817059170601706117062170631706417065170661706717068170691707017071170721707317074170751707617077170781707917080170811708217083170841708517086170871708817089170901709117092170931709417095170961709717098170991710017101171021710317104171051710617107171081710917110171111711217113171141711517116171171711817119171201712117122171231712417125171261712717128171291713017131171321713317134171351713617137171381713917140171411714217143171441714517146171471714817149171501715117152171531715417155171561715717158171591716017161171621716317164171651716617167171681716917170171711717217173171741717517176171771717817179171801718117182171831718417185171861718717188171891719017191171921719317194171951719617197171981719917200172011720217203172041720517206172071720817209172101721117212172131721417215172161721717218172191722017221172221722317224172251722617227172281722917230172311723217233172341723517236172371723817239172401724117242172431724417245172461724717248172491725017251172521725317254172551725617257172581725917260172611726217263172641726517266172671726817269172701727117272172731727417275172761727717278172791728017281172821728317284172851728617287172881728917290172911729217293172941729517296172971729817299173001730117302173031730417305173061730717308173091731017311173121731317314173151731617317173181731917320173211732217323173241732517326173271732817329173301733117332173331733417335173361733717338173391734017341173421734317344173451734617347173481734917350173511735217353173541735517356173571735817359173601736117362173631736417365173661736717368173691737017371173721737317374173751737617377173781737917380173811738217383173841738517386173871738817389173901739117392173931739417395173961739717398173991740017401174021740317404174051740617407174081740917410174111741217413174141741517416174171741817419174201742117422174231742417425174261742717428174291743017431174321743317434174351743617437174381743917440174411744217443174441744517446174471744817449174501745117452174531745417455174561745717458174591746017461174621746317464174651746617467174681746917470174711747217473174741747517476174771747817479174801748117482174831748417485174861748717488174891749017491174921749317494174951749617497174981749917500175011750217503175041750517506175071750817509175101751117512175131751417515175161751717518175191752017521175221752317524175251752617527175281752917530175311753217533175341753517536175371753817539175401754117542175431754417545175461754717548175491755017551175521755317554175551755617557175581755917560175611756217563175641756517566175671756817569175701757117572175731757417575175761757717578175791758017581175821758317584175851758617587175881758917590175911759217593175941759517596175971759817599176001760117602176031760417605176061760717608176091761017611176121761317614176151761617617176181761917620176211762217623176241762517626176271762817629176301763117632176331763417635176361763717638176391764017641176421764317644176451764617647176481764917650176511765217653176541765517656176571765817659176601766117662176631766417665176661766717668176691767017671176721767317674176751767617677176781767917680176811768217683176841768517686176871768817689176901769117692176931769417695176961769717698176991770017701177021770317704177051770617707177081770917710177111771217713177141771517716177171771817719177201772117722177231772417725177261772717728177291773017731177321773317734177351773617737177381773917740177411774217743177441774517746177471774817749177501775117752177531775417755177561775717758177591776017761177621776317764177651776617767177681776917770177711777217773177741777517776177771777817779177801778117782177831778417785177861778717788177891779017791177921779317794177951779617797177981779917800178011780217803178041780517806178071780817809178101781117812178131781417815178161781717818178191782017821178221782317824178251782617827178281782917830178311783217833178341783517836178371783817839178401784117842178431784417845178461784717848178491785017851178521785317854178551785617857178581785917860178611786217863178641786517866178671786817869178701787117872178731787417875178761787717878178791788017881178821788317884178851788617887178881788917890178911789217893178941789517896178971789817899179001790117902179031790417905179061790717908179091791017911179121791317914179151791617917179181791917920179211792217923179241792517926179271792817929179301793117932179331793417935179361793717938179391794017941179421794317944179451794617947179481794917950179511795217953179541795517956179571795817959179601796117962179631796417965179661796717968179691797017971179721797317974179751797617977179781797917980179811798217983179841798517986179871798817989179901799117992179931799417995179961799717998179991800018001180021800318004180051800618007180081800918010180111801218013180141801518016180171801818019180201802118022180231802418025180261802718028180291803018031180321803318034180351803618037180381803918040180411804218043180441804518046180471804818049180501805118052180531805418055180561805718058180591806018061180621806318064180651806618067180681806918070180711807218073180741807518076180771807818079180801808118082180831808418085180861808718088180891809018091180921809318094180951809618097180981809918100181011810218103181041810518106181071810818109181101811118112181131811418115181161811718118181191812018121181221812318124181251812618127181281812918130181311813218133181341813518136181371813818139181401814118142181431814418145181461814718148181491815018151181521815318154181551815618157181581815918160181611816218163181641816518166181671816818169181701817118172181731817418175181761817718178181791818018181181821818318184181851818618187181881818918190181911819218193181941819518196181971819818199182001820118202182031820418205182061820718208182091821018211182121821318214182151821618217182181821918220182211822218223182241822518226182271822818229182301823118232182331823418235182361823718238182391824018241182421824318244182451824618247182481824918250182511825218253182541825518256182571825818259182601826118262182631826418265182661826718268182691827018271182721827318274182751827618277182781827918280182811828218283182841828518286182871828818289182901829118292182931829418295182961829718298182991830018301183021830318304183051830618307183081830918310183111831218313183141831518316183171831818319183201832118322183231832418325183261832718328183291833018331183321833318334183351833618337183381833918340183411834218343183441834518346183471834818349183501835118352183531835418355183561835718358183591836018361183621836318364183651836618367183681836918370183711837218373183741837518376183771837818379183801838118382183831838418385183861838718388183891839018391183921839318394183951839618397183981839918400184011840218403184041840518406184071840818409184101841118412184131841418415184161841718418184191842018421184221842318424184251842618427184281842918430184311843218433184341843518436184371843818439184401844118442184431844418445184461844718448184491845018451184521845318454184551845618457184581845918460184611846218463184641846518466184671846818469184701847118472184731847418475184761847718478184791848018481184821848318484184851848618487184881848918490184911849218493184941849518496184971849818499185001850118502185031850418505185061850718508185091851018511185121851318514185151851618517185181851918520185211852218523185241852518526185271852818529185301853118532185331853418535185361853718538185391854018541185421854318544185451854618547185481854918550185511855218553185541855518556185571855818559185601856118562185631856418565185661856718568185691857018571185721857318574185751857618577185781857918580185811858218583185841858518586185871858818589185901859118592185931859418595185961859718598185991860018601186021860318604186051860618607186081860918610186111861218613186141861518616186171861818619186201862118622186231862418625186261862718628186291863018631186321863318634186351863618637186381863918640186411864218643186441864518646186471864818649186501865118652186531865418655186561865718658186591866018661186621866318664186651866618667186681866918670186711867218673186741867518676186771867818679186801868118682186831868418685186861868718688186891869018691186921869318694186951869618697186981869918700187011870218703187041870518706187071870818709187101871118712187131871418715187161871718718187191872018721187221872318724187251872618727187281872918730187311873218733187341873518736187371873818739187401874118742187431874418745187461874718748187491875018751187521875318754187551875618757187581875918760187611876218763187641876518766187671876818769187701877118772187731877418775187761877718778187791878018781187821878318784187851878618787187881878918790187911879218793187941879518796187971879818799188001880118802188031880418805188061880718808188091881018811188121881318814188151881618817188181881918820188211882218823188241882518826188271882818829188301883118832188331883418835188361883718838188391884018841188421884318844188451884618847188481884918850188511885218853188541885518856188571885818859188601886118862188631886418865188661886718868188691887018871188721887318874188751887618877188781887918880188811888218883188841888518886188871888818889188901889118892188931889418895188961889718898188991890018901189021890318904189051890618907189081890918910189111891218913189141891518916189171891818919189201892118922189231892418925189261892718928189291893018931189321893318934189351893618937189381893918940189411894218943189441894518946189471894818949189501895118952189531895418955189561895718958189591896018961189621896318964189651896618967189681896918970189711897218973189741897518976189771897818979189801898118982189831898418985189861898718988189891899018991189921899318994189951899618997189981899919000190011900219003190041900519006190071900819009190101901119012190131901419015190161901719018190191902019021190221902319024190251902619027190281902919030190311903219033190341903519036190371903819039190401904119042190431904419045190461904719048190491905019051190521905319054190551905619057190581905919060190611906219063190641906519066190671906819069190701907119072190731907419075190761907719078190791908019081190821908319084190851908619087190881908919090190911909219093190941909519096190971909819099191001910119102191031910419105191061910719108191091911019111191121911319114191151911619117191181911919120191211912219123191241912519126191271912819129191301913119132191331913419135191361913719138191391914019141191421914319144191451914619147191481914919150191511915219153191541915519156191571915819159191601916119162191631916419165191661916719168191691917019171191721917319174191751917619177191781917919180191811918219183191841918519186191871918819189191901919119192191931919419195191961919719198191991920019201192021920319204192051920619207192081920919210192111921219213192141921519216192171921819219192201922119222192231922419225192261922719228192291923019231192321923319234192351923619237192381923919240192411924219243192441924519246192471924819249192501925119252192531925419255192561925719258192591926019261192621926319264192651926619267192681926919270192711927219273192741927519276192771927819279192801928119282192831928419285192861928719288192891929019291192921929319294192951929619297192981929919300193011930219303193041930519306193071930819309193101931119312193131931419315193161931719318193191932019321193221932319324193251932619327193281932919330193311933219333193341933519336193371933819339193401934119342193431934419345193461934719348193491935019351193521935319354193551935619357193581935919360193611936219363193641936519366193671936819369193701937119372193731937419375193761937719378193791938019381193821938319384193851938619387193881938919390193911939219393193941939519396193971939819399194001940119402194031940419405194061940719408194091941019411194121941319414194151941619417194181941919420194211942219423194241942519426194271942819429194301943119432194331943419435194361943719438194391944019441194421944319444194451944619447194481944919450194511945219453194541945519456194571945819459194601946119462194631946419465194661946719468194691947019471194721947319474194751947619477194781947919480194811948219483194841948519486194871948819489194901949119492194931949419495194961949719498194991950019501195021950319504195051950619507195081950919510195111951219513195141951519516195171951819519195201952119522195231952419525195261952719528195291953019531195321953319534195351953619537195381953919540195411954219543195441954519546195471954819549195501955119552195531955419555195561955719558195591956019561195621956319564195651956619567195681956919570195711957219573195741957519576195771957819579195801958119582195831958419585195861958719588195891959019591195921959319594195951959619597195981959919600196011960219603196041960519606196071960819609196101961119612196131961419615196161961719618196191962019621196221962319624196251962619627196281962919630196311963219633196341963519636196371963819639196401964119642196431964419645196461964719648196491965019651196521965319654196551965619657196581965919660196611966219663196641966519666196671966819669196701967119672196731967419675196761967719678196791968019681196821968319684196851968619687196881968919690196911969219693196941969519696196971969819699197001970119702197031970419705197061970719708197091971019711197121971319714197151971619717197181971919720197211972219723197241972519726197271972819729197301973119732197331973419735197361973719738197391974019741197421974319744197451974619747197481974919750197511975219753197541975519756197571975819759197601976119762197631976419765197661976719768197691977019771197721977319774197751977619777197781977919780197811978219783197841978519786197871978819789197901979119792197931979419795197961979719798197991980019801198021980319804198051980619807198081980919810198111981219813198141981519816198171981819819198201982119822198231982419825198261982719828198291983019831198321983319834198351983619837198381983919840198411984219843198441984519846198471984819849198501985119852198531985419855198561985719858198591986019861198621986319864198651986619867198681986919870198711987219873198741987519876198771987819879198801988119882198831988419885198861988719888198891989019891198921989319894198951989619897198981989919900199011990219903199041990519906199071990819909199101991119912199131991419915199161991719918199191992019921199221992319924199251992619927199281992919930199311993219933199341993519936199371993819939199401994119942199431994419945199461994719948199491995019951199521995319954199551995619957199581995919960199611996219963199641996519966199671996819969199701997119972199731997419975199761997719978199791998019981199821998319984199851998619987199881998919990199911999219993199941999519996199971999819999200002000120002200032000420005200062000720008200092001020011200122001320014200152001620017200182001920020200212002220023200242002520026200272002820029200302003120032200332003420035200362003720038200392004020041200422004320044200452004620047200482004920050200512005220053200542005520056200572005820059200602006120062200632006420065200662006720068200692007020071200722007320074200752007620077200782007920080200812008220083200842008520086200872008820089200902009120092200932009420095200962009720098200992010020101201022010320104201052010620107201082010920110201112011220113201142011520116201172011820119201202012120122201232012420125201262012720128201292013020131201322013320134201352013620137201382013920140201412014220143201442014520146201472014820149201502015120152201532015420155201562015720158201592016020161201622016320164201652016620167201682016920170201712017220173201742017520176201772017820179201802018120182201832018420185201862018720188201892019020191201922019320194201952019620197201982019920200202012020220203202042020520206202072020820209202102021120212202132021420215202162021720218202192022020221202222022320224202252022620227202282022920230202312023220233202342023520236202372023820239202402024120242202432024420245202462024720248202492025020251202522025320254202552025620257202582025920260202612026220263202642026520266202672026820269202702027120272202732027420275202762027720278202792028020281202822028320284202852028620287202882028920290202912029220293202942029520296202972029820299203002030120302203032030420305203062030720308203092031020311203122031320314203152031620317203182031920320203212032220323203242032520326203272032820329203302033120332203332033420335203362033720338203392034020341203422034320344203452034620347203482034920350203512035220353203542035520356203572035820359203602036120362203632036420365203662036720368203692037020371203722037320374203752037620377203782037920380203812038220383203842038520386203872038820389203902039120392203932039420395203962039720398203992040020401204022040320404204052040620407204082040920410204112041220413204142041520416204172041820419204202042120422204232042420425204262042720428204292043020431204322043320434204352043620437204382043920440204412044220443204442044520446204472044820449204502045120452204532045420455204562045720458204592046020461204622046320464204652046620467204682046920470204712047220473204742047520476204772047820479204802048120482204832048420485204862048720488204892049020491204922049320494204952049620497204982049920500205012050220503205042050520506205072050820509205102051120512205132051420515205162051720518205192052020521205222052320524205252052620527205282052920530205312053220533205342053520536205372053820539205402054120542205432054420545205462054720548205492055020551205522055320554205552055620557205582055920560205612056220563205642056520566205672056820569205702057120572205732057420575205762057720578205792058020581205822058320584205852058620587205882058920590205912059220593205942059520596205972059820599206002060120602206032060420605206062060720608206092061020611206122061320614206152061620617206182061920620206212062220623206242062520626206272062820629206302063120632206332063420635206362063720638206392064020641206422064320644206452064620647206482064920650206512065220653206542065520656206572065820659206602066120662206632066420665206662066720668206692067020671206722067320674206752067620677206782067920680206812068220683206842068520686206872068820689206902069120692206932069420695206962069720698206992070020701207022070320704207052070620707207082070920710207112071220713207142071520716207172071820719207202072120722207232072420725207262072720728207292073020731207322073320734207352073620737207382073920740207412074220743207442074520746207472074820749207502075120752207532075420755207562075720758207592076020761207622076320764207652076620767207682076920770207712077220773207742077520776207772077820779207802078120782207832078420785207862078720788207892079020791207922079320794207952079620797207982079920800208012080220803208042080520806208072080820809208102081120812208132081420815208162081720818208192082020821208222082320824208252082620827208282082920830208312083220833208342083520836208372083820839208402084120842208432084420845208462084720848208492085020851208522085320854208552085620857208582085920860208612086220863208642086520866208672086820869208702087120872208732087420875208762087720878208792088020881208822088320884208852088620887208882088920890208912089220893208942089520896208972089820899209002090120902209032090420905209062090720908209092091020911209122091320914209152091620917209182091920920209212092220923209242092520926209272092820929209302093120932209332093420935209362093720938209392094020941209422094320944209452094620947209482094920950209512095220953209542095520956209572095820959209602096120962209632096420965209662096720968209692097020971209722097320974209752097620977209782097920980209812098220983209842098520986209872098820989209902099120992209932099420995209962099720998209992100021001210022100321004210052100621007210082100921010210112101221013210142101521016210172101821019210202102121022210232102421025210262102721028210292103021031210322103321034210352103621037210382103921040210412104221043210442104521046210472104821049210502105121052210532105421055210562105721058210592106021061210622106321064210652106621067210682106921070210712107221073210742107521076210772107821079210802108121082210832108421085210862108721088210892109021091210922109321094210952109621097210982109921100211012110221103211042110521106211072110821109211102111121112211132111421115211162111721118211192112021121211222112321124211252112621127211282112921130211312113221133211342113521136211372113821139211402114121142211432114421145211462114721148211492115021151211522115321154211552115621157211582115921160211612116221163211642116521166211672116821169211702117121172211732117421175211762117721178211792118021181211822118321184211852118621187211882118921190211912119221193211942119521196211972119821199212002120121202212032120421205212062120721208212092121021211212122121321214212152121621217212182121921220212212122221223212242122521226212272122821229212302123121232212332123421235212362123721238212392124021241212422124321244212452124621247212482124921250212512125221253212542125521256212572125821259212602126121262212632126421265212662126721268212692127021271212722127321274212752127621277212782127921280212812128221283212842128521286212872128821289212902129121292212932129421295212962129721298212992130021301213022130321304213052130621307213082130921310213112131221313213142131521316213172131821319213202132121322213232132421325213262132721328213292133021331213322133321334213352133621337213382133921340213412134221343213442134521346213472134821349213502135121352213532135421355213562135721358213592136021361213622136321364213652136621367213682136921370213712137221373213742137521376213772137821379213802138121382213832138421385213862138721388213892139021391213922139321394213952139621397213982139921400214012140221403214042140521406214072140821409214102141121412214132141421415214162141721418214192142021421214222142321424214252142621427214282142921430214312143221433214342143521436214372143821439214402144121442214432144421445214462144721448214492145021451214522145321454214552145621457214582145921460214612146221463214642146521466214672146821469214702147121472214732147421475214762147721478214792148021481214822148321484214852148621487214882148921490214912149221493214942149521496214972149821499215002150121502215032150421505215062150721508215092151021511215122151321514215152151621517215182151921520215212152221523215242152521526215272152821529215302153121532215332153421535215362153721538215392154021541215422154321544215452154621547215482154921550215512155221553215542155521556215572155821559215602156121562215632156421565215662156721568215692157021571215722157321574215752157621577215782157921580215812158221583215842158521586215872158821589215902159121592215932159421595215962159721598215992160021601216022160321604216052160621607216082160921610216112161221613216142161521616216172161821619216202162121622216232162421625216262162721628216292163021631216322163321634216352163621637216382163921640216412164221643216442164521646216472164821649216502165121652216532165421655216562165721658216592166021661216622166321664216652166621667216682166921670216712167221673216742167521676216772167821679216802168121682216832168421685216862168721688216892169021691216922169321694216952169621697216982169921700217012170221703217042170521706217072170821709217102171121712217132171421715217162171721718217192172021721217222172321724217252172621727217282172921730217312173221733217342173521736217372173821739217402174121742217432174421745217462174721748217492175021751217522175321754217552175621757217582175921760217612176221763217642176521766217672176821769217702177121772217732177421775217762177721778217792178021781217822178321784217852178621787217882178921790217912179221793217942179521796217972179821799218002180121802218032180421805218062180721808218092181021811218122181321814218152181621817218182181921820218212182221823218242182521826218272182821829218302183121832218332183421835218362183721838218392184021841218422184321844218452184621847218482184921850218512185221853218542185521856218572185821859218602186121862218632186421865218662186721868218692187021871218722187321874218752187621877218782187921880218812188221883218842188521886218872188821889218902189121892218932189421895218962189721898218992190021901219022190321904219052190621907219082190921910219112191221913219142191521916219172191821919219202192121922219232192421925219262192721928219292193021931219322193321934219352193621937219382193921940219412194221943219442194521946219472194821949219502195121952219532195421955219562195721958219592196021961219622196321964219652196621967219682196921970219712197221973219742197521976219772197821979219802198121982219832198421985219862198721988219892199021991219922199321994219952199621997219982199922000220012200222003220042200522006220072200822009220102201122012220132201422015220162201722018220192202022021220222202322024220252202622027220282202922030220312203222033220342203522036220372203822039220402204122042220432204422045220462204722048220492205022051220522205322054220552205622057220582205922060220612206222063220642206522066220672206822069220702207122072220732207422075220762207722078220792208022081220822208322084220852208622087220882208922090220912209222093220942209522096220972209822099221002210122102221032210422105221062210722108221092211022111221122211322114221152211622117221182211922120221212212222123221242212522126221272212822129221302213122132221332213422135221362213722138221392214022141221422214322144221452214622147221482214922150221512215222153221542215522156221572215822159221602216122162221632216422165221662216722168221692217022171221722217322174221752217622177221782217922180221812218222183221842218522186221872218822189221902219122192221932219422195221962219722198221992220022201222022220322204222052220622207222082220922210222112221222213222142221522216222172221822219222202222122222222232222422225222262222722228222292223022231222322223322234222352223622237222382223922240222412224222243222442224522246222472224822249222502225122252222532225422255222562225722258222592226022261222622226322264222652226622267222682226922270222712227222273222742227522276222772227822279222802228122282222832228422285222862228722288222892229022291222922229322294222952229622297222982229922300223012230222303223042230522306223072230822309223102231122312223132231422315223162231722318223192232022321223222232322324223252232622327223282232922330223312233222333223342233522336223372233822339223402234122342223432234422345223462234722348223492235022351223522235322354223552235622357223582235922360223612236222363223642236522366223672236822369223702237122372223732237422375223762237722378223792238022381223822238322384223852238622387223882238922390223912239222393223942239522396223972239822399224002240122402224032240422405224062240722408224092241022411224122241322414224152241622417224182241922420224212242222423224242242522426224272242822429224302243122432224332243422435224362243722438224392244022441224422244322444224452244622447224482244922450224512245222453224542245522456224572245822459224602246122462224632246422465224662246722468224692247022471224722247322474224752247622477224782247922480224812248222483224842248522486224872248822489224902249122492224932249422495224962249722498224992250022501225022250322504225052250622507225082250922510225112251222513225142251522516225172251822519225202252122522225232252422525225262252722528225292253022531225322253322534225352253622537225382253922540225412254222543225442254522546225472254822549225502255122552225532255422555225562255722558225592256022561225622256322564225652256622567225682256922570225712257222573225742257522576225772257822579225802258122582225832258422585225862258722588225892259022591225922259322594225952259622597225982259922600226012260222603226042260522606226072260822609226102261122612226132261422615226162261722618226192262022621226222262322624226252262622627226282262922630226312263222633226342263522636226372263822639226402264122642226432264422645226462264722648226492265022651226522265322654226552265622657226582265922660226612266222663226642266522666226672266822669226702267122672226732267422675226762267722678226792268022681226822268322684226852268622687226882268922690226912269222693226942269522696226972269822699227002270122702227032270422705227062270722708227092271022711227122271322714227152271622717227182271922720227212272222723227242272522726227272272822729227302273122732227332273422735227362273722738227392274022741227422274322744227452274622747227482274922750227512275222753227542275522756227572275822759227602276122762227632276422765227662276722768227692277022771227722277322774227752277622777227782277922780227812278222783227842278522786227872278822789227902279122792227932279422795227962279722798227992280022801228022280322804228052280622807228082280922810228112281222813228142281522816228172281822819228202282122822228232282422825228262282722828228292283022831228322283322834228352283622837228382283922840228412284222843228442284522846228472284822849228502285122852228532285422855228562285722858228592286022861228622286322864228652286622867228682286922870228712287222873228742287522876228772287822879228802288122882228832288422885228862288722888228892289022891228922289322894228952289622897228982289922900229012290222903229042290522906229072290822909229102291122912229132291422915229162291722918229192292022921229222292322924229252292622927229282292922930229312293222933229342293522936229372293822939229402294122942229432294422945229462294722948229492295022951229522295322954229552295622957229582295922960229612296222963229642296522966229672296822969229702297122972229732297422975229762297722978229792298022981229822298322984229852298622987229882298922990229912299222993229942299522996229972299822999230002300123002230032300423005230062300723008230092301023011230122301323014230152301623017230182301923020230212302223023230242302523026230272302823029230302303123032230332303423035230362303723038230392304023041230422304323044230452304623047230482304923050230512305223053230542305523056230572305823059230602306123062230632306423065230662306723068230692307023071230722307323074230752307623077230782307923080230812308223083230842308523086230872308823089230902309123092230932309423095230962309723098230992310023101231022310323104231052310623107231082310923110231112311223113231142311523116231172311823119231202312123122231232312423125231262312723128231292313023131231322313323134231352313623137231382313923140231412314223143231442314523146231472314823149231502315123152231532315423155231562315723158231592316023161231622316323164231652316623167231682316923170231712317223173231742317523176231772317823179231802318123182231832318423185231862318723188231892319023191231922319323194231952319623197231982319923200232012320223203232042320523206232072320823209232102321123212232132321423215232162321723218232192322023221232222322323224232252322623227232282322923230232312323223233232342323523236232372323823239232402324123242232432324423245232462324723248232492325023251232522325323254232552325623257232582325923260232612326223263232642326523266232672326823269232702327123272232732327423275232762327723278232792328023281232822328323284232852328623287232882328923290232912329223293232942329523296232972329823299233002330123302233032330423305233062330723308233092331023311233122331323314233152331623317233182331923320233212332223323233242332523326233272332823329233302333123332233332333423335233362333723338233392334023341233422334323344233452334623347233482334923350233512335223353233542335523356233572335823359233602336123362233632336423365233662336723368233692337023371233722337323374233752337623377233782337923380233812338223383233842338523386233872338823389233902339123392233932339423395233962339723398233992340023401234022340323404234052340623407234082340923410234112341223413234142341523416234172341823419234202342123422234232342423425234262342723428234292343023431234322343323434234352343623437234382343923440234412344223443234442344523446234472344823449234502345123452234532345423455234562345723458234592346023461234622346323464234652346623467234682346923470234712347223473234742347523476234772347823479234802348123482234832348423485234862348723488234892349023491234922349323494234952349623497234982349923500235012350223503235042350523506235072350823509235102351123512235132351423515235162351723518235192352023521235222352323524235252352623527235282352923530235312353223533235342353523536235372353823539235402354123542235432354423545235462354723548235492355023551235522355323554235552355623557235582355923560235612356223563235642356523566235672356823569235702357123572235732357423575235762357723578235792358023581235822358323584235852358623587235882358923590235912359223593235942359523596235972359823599236002360123602236032360423605236062360723608236092361023611236122361323614236152361623617236182361923620236212362223623236242362523626236272362823629236302363123632236332363423635236362363723638236392364023641236422364323644236452364623647236482364923650236512365223653236542365523656236572365823659236602366123662236632366423665236662366723668236692367023671236722367323674236752367623677236782367923680236812368223683236842368523686236872368823689236902369123692236932369423695236962369723698236992370023701237022370323704237052370623707237082370923710237112371223713237142371523716237172371823719237202372123722237232372423725237262372723728237292373023731237322373323734237352373623737237382373923740237412374223743237442374523746237472374823749237502375123752237532375423755237562375723758237592376023761237622376323764237652376623767237682376923770237712377223773237742377523776237772377823779237802378123782237832378423785237862378723788237892379023791237922379323794237952379623797237982379923800238012380223803238042380523806238072380823809238102381123812238132381423815238162381723818238192382023821238222382323824238252382623827238282382923830238312383223833238342383523836238372383823839238402384123842238432384423845238462384723848238492385023851238522385323854238552385623857238582385923860238612386223863238642386523866238672386823869238702387123872238732387423875238762387723878238792388023881238822388323884238852388623887238882388923890238912389223893238942389523896238972389823899239002390123902239032390423905239062390723908239092391023911239122391323914239152391623917239182391923920239212392223923239242392523926239272392823929239302393123932239332393423935239362393723938239392394023941239422394323944239452394623947239482394923950239512395223953239542395523956239572395823959239602396123962239632396423965239662396723968239692397023971239722397323974239752397623977239782397923980239812398223983239842398523986239872398823989239902399123992239932399423995239962399723998239992400024001240022400324004240052400624007240082400924010240112401224013240142401524016240172401824019240202402124022240232402424025240262402724028240292403024031240322403324034240352403624037240382403924040240412404224043240442404524046240472404824049240502405124052240532405424055240562405724058240592406024061240622406324064240652406624067240682406924070240712407224073240742407524076240772407824079240802408124082240832408424085240862408724088240892409024091240922409324094240952409624097240982409924100241012410224103241042410524106241072410824109241102411124112241132411424115241162411724118241192412024121241222412324124241252412624127241282412924130241312413224133241342413524136241372413824139241402414124142241432414424145241462414724148241492415024151241522415324154241552415624157241582415924160241612416224163241642416524166241672416824169241702417124172241732417424175241762417724178241792418024181241822418324184241852418624187241882418924190241912419224193241942419524196241972419824199242002420124202242032420424205242062420724208242092421024211242122421324214242152421624217242182421924220242212422224223242242422524226242272422824229242302423124232242332423424235242362423724238242392424024241242422424324244242452424624247242482424924250242512425224253242542425524256242572425824259242602426124262242632426424265242662426724268242692427024271242722427324274242752427624277242782427924280242812428224283242842428524286242872428824289242902429124292242932429424295242962429724298242992430024301243022430324304243052430624307243082430924310243112431224313243142431524316243172431824319243202432124322243232432424325243262432724328243292433024331243322433324334243352433624337243382433924340243412434224343243442434524346243472434824349243502435124352243532435424355243562435724358243592436024361243622436324364243652436624367243682436924370243712437224373243742437524376243772437824379243802438124382243832438424385243862438724388243892439024391243922439324394243952439624397243982439924400244012440224403244042440524406244072440824409244102441124412244132441424415244162441724418244192442024421244222442324424244252442624427244282442924430244312443224433244342443524436244372443824439244402444124442244432444424445244462444724448244492445024451244522445324454244552445624457244582445924460244612446224463244642446524466244672446824469244702447124472244732447424475244762447724478244792448024481244822448324484244852448624487244882448924490244912449224493244942449524496244972449824499245002450124502245032450424505245062450724508245092451024511245122451324514245152451624517245182451924520245212452224523245242452524526245272452824529245302453124532245332453424535245362453724538245392454024541245422454324544245452454624547245482454924550245512455224553245542455524556245572455824559245602456124562245632456424565245662456724568245692457024571245722457324574245752457624577245782457924580245812458224583245842458524586245872458824589245902459124592245932459424595245962459724598245992460024601246022460324604246052460624607246082460924610246112461224613246142461524616246172461824619246202462124622246232462424625246262462724628246292463024631246322463324634246352463624637246382463924640246412464224643246442464524646246472464824649246502465124652246532465424655246562465724658246592466024661246622466324664246652466624667246682466924670246712467224673246742467524676246772467824679246802468124682246832468424685246862468724688246892469024691246922469324694246952469624697246982469924700247012470224703247042470524706247072470824709247102471124712247132471424715247162471724718247192472024721247222472324724247252472624727247282472924730247312473224733247342473524736247372473824739247402474124742247432474424745247462474724748247492475024751247522475324754247552475624757247582475924760247612476224763247642476524766247672476824769247702477124772247732477424775247762477724778247792478024781247822478324784247852478624787247882478924790247912479224793247942479524796247972479824799248002480124802248032480424805248062480724808248092481024811248122481324814248152481624817248182481924820248212482224823248242482524826248272482824829248302483124832248332483424835248362483724838248392484024841248422484324844248452484624847248482484924850248512485224853248542485524856248572485824859248602486124862248632486424865248662486724868248692487024871248722487324874248752487624877248782487924880248812488224883248842488524886248872488824889248902489124892248932489424895248962489724898248992490024901249022490324904249052490624907249082490924910249112491224913249142491524916249172491824919249202492124922249232492424925249262492724928249292493024931249322493324934249352493624937249382493924940249412494224943249442494524946249472494824949249502495124952249532495424955249562495724958249592496024961249622496324964249652496624967249682496924970249712497224973249742497524976249772497824979249802498124982249832498424985249862498724988249892499024991249922499324994249952499624997249982499925000250012500225003250042500525006250072500825009250102501125012250132501425015250162501725018250192502025021250222502325024250252502625027250282502925030250312503225033250342503525036250372503825039250402504125042250432504425045250462504725048250492505025051250522505325054250552505625057250582505925060250612506225063250642506525066250672506825069250702507125072250732507425075250762507725078250792508025081250822508325084250852508625087250882508925090250912509225093250942509525096250972509825099251002510125102251032510425105251062510725108251092511025111251122511325114251152511625117251182511925120251212512225123251242512525126251272512825129251302513125132251332513425135251362513725138251392514025141251422514325144251452514625147251482514925150251512515225153251542515525156251572515825159251602516125162251632516425165251662516725168251692517025171251722517325174251752517625177251782517925180251812518225183251842518525186251872518825189251902519125192251932519425195251962519725198251992520025201252022520325204252052520625207252082520925210252112521225213252142521525216252172521825219252202522125222252232522425225252262522725228252292523025231252322523325234252352523625237252382523925240252412524225243252442524525246252472524825249252502525125252252532525425255252562525725258252592526025261252622526325264252652526625267252682526925270252712527225273252742527525276252772527825279252802528125282252832528425285252862528725288252892529025291252922529325294252952529625297252982529925300253012530225303253042530525306253072530825309253102531125312253132531425315253162531725318253192532025321253222532325324253252532625327253282532925330253312533225333253342533525336253372533825339253402534125342253432534425345253462534725348253492535025351253522535325354253552535625357253582535925360253612536225363253642536525366253672536825369253702537125372253732537425375253762537725378253792538025381253822538325384253852538625387253882538925390253912539225393253942539525396253972539825399254002540125402254032540425405254062540725408254092541025411254122541325414254152541625417254182541925420254212542225423254242542525426254272542825429254302543125432254332543425435254362543725438254392544025441254422544325444254452544625447254482544925450254512545225453254542545525456254572545825459254602546125462254632546425465254662546725468254692547025471254722547325474254752547625477254782547925480254812548225483254842548525486254872548825489254902549125492254932549425495254962549725498254992550025501255022550325504255052550625507255082550925510255112551225513255142551525516255172551825519255202552125522255232552425525255262552725528255292553025531255322553325534255352553625537255382553925540255412554225543255442554525546255472554825549255502555125552255532555425555255562555725558255592556025561255622556325564255652556625567255682556925570255712557225573255742557525576255772557825579255802558125582255832558425585255862558725588255892559025591255922559325594255952559625597255982559925600256012560225603256042560525606256072560825609256102561125612256132561425615256162561725618256192562025621256222562325624256252562625627256282562925630256312563225633256342563525636256372563825639256402564125642256432564425645256462564725648256492565025651256522565325654256552565625657256582565925660256612566225663256642566525666256672566825669256702567125672256732567425675256762567725678256792568025681256822568325684256852568625687256882568925690256912569225693256942569525696256972569825699257002570125702257032570425705257062570725708257092571025711257122571325714257152571625717257182571925720257212572225723257242572525726257272572825729257302573125732257332573425735257362573725738257392574025741257422574325744257452574625747257482574925750257512575225753257542575525756257572575825759257602576125762257632576425765257662576725768257692577025771257722577325774257752577625777257782577925780257812578225783257842578525786257872578825789257902579125792257932579425795257962579725798257992580025801258022580325804258052580625807258082580925810258112581225813258142581525816258172581825819258202582125822258232582425825258262582725828258292583025831258322583325834258352583625837258382583925840258412584225843258442584525846258472584825849258502585125852258532585425855258562585725858258592586025861258622586325864258652586625867258682586925870258712587225873258742587525876258772587825879258802588125882258832588425885258862588725888258892589025891258922589325894258952589625897258982589925900259012590225903259042590525906259072590825909259102591125912259132591425915259162591725918259192592025921259222592325924259252592625927259282592925930259312593225933259342593525936259372593825939259402594125942259432594425945259462594725948259492595025951259522595325954259552595625957259582595925960259612596225963259642596525966259672596825969259702597125972259732597425975259762597725978259792598025981259822598325984259852598625987259882598925990259912599225993259942599525996259972599825999260002600126002260032600426005260062600726008260092601026011260122601326014260152601626017260182601926020260212602226023260242602526026260272602826029260302603126032260332603426035260362603726038260392604026041260422604326044260452604626047260482604926050260512605226053260542605526056260572605826059260602606126062260632606426065260662606726068260692607026071260722607326074260752607626077260782607926080260812608226083260842608526086260872608826089260902609126092260932609426095260962609726098260992610026101261022610326104261052610626107261082610926110261112611226113261142611526116261172611826119261202612126122261232612426125261262612726128261292613026131261322613326134261352613626137261382613926140261412614226143261442614526146261472614826149261502615126152261532615426155261562615726158261592616026161261622616326164261652616626167261682616926170261712617226173261742617526176261772617826179261802618126182261832618426185261862618726188261892619026191261922619326194261952619626197261982619926200262012620226203262042620526206262072620826209262102621126212262132621426215262162621726218262192622026221262222622326224262252622626227262282622926230262312623226233262342623526236262372623826239262402624126242262432624426245262462624726248262492625026251262522625326254262552625626257262582625926260262612626226263262642626526266262672626826269262702627126272262732627426275262762627726278262792628026281262822628326284262852628626287262882628926290262912629226293262942629526296262972629826299263002630126302263032630426305263062630726308263092631026311263122631326314263152631626317263182631926320263212632226323263242632526326263272632826329263302633126332263332633426335263362633726338263392634026341263422634326344263452634626347263482634926350263512635226353263542635526356263572635826359263602636126362263632636426365263662636726368263692637026371263722637326374263752637626377263782637926380263812638226383263842638526386263872638826389263902639126392263932639426395263962639726398263992640026401264022640326404264052640626407264082640926410264112641226413264142641526416264172641826419264202642126422264232642426425264262642726428264292643026431264322643326434264352643626437264382643926440264412644226443264442644526446264472644826449264502645126452264532645426455264562645726458264592646026461264622646326464264652646626467264682646926470264712647226473264742647526476264772647826479264802648126482264832648426485264862648726488264892649026491264922649326494264952649626497264982649926500265012650226503265042650526506265072650826509265102651126512265132651426515265162651726518265192652026521265222652326524265252652626527265282652926530265312653226533265342653526536265372653826539265402654126542265432654426545265462654726548265492655026551265522655326554265552655626557265582655926560265612656226563265642656526566265672656826569265702657126572265732657426575265762657726578265792658026581265822658326584265852658626587265882658926590265912659226593265942659526596265972659826599266002660126602266032660426605266062660726608266092661026611266122661326614266152661626617266182661926620266212662226623266242662526626266272662826629266302663126632266332663426635266362663726638266392664026641266422664326644266452664626647266482664926650266512665226653266542665526656266572665826659266602666126662266632666426665266662666726668266692667026671266722667326674266752667626677266782667926680266812668226683266842668526686266872668826689266902669126692266932669426695266962669726698266992670026701267022670326704267052670626707267082670926710267112671226713267142671526716267172671826719267202672126722267232672426725267262672726728267292673026731267322673326734267352673626737267382673926740267412674226743267442674526746267472674826749267502675126752267532675426755267562675726758267592676026761267622676326764267652676626767267682676926770267712677226773267742677526776267772677826779267802678126782267832678426785267862678726788267892679026791267922679326794267952679626797267982679926800268012680226803268042680526806268072680826809268102681126812268132681426815268162681726818268192682026821268222682326824268252682626827268282682926830268312683226833268342683526836268372683826839268402684126842268432684426845268462684726848268492685026851268522685326854268552685626857268582685926860268612686226863268642686526866268672686826869268702687126872268732687426875268762687726878268792688026881268822688326884268852688626887268882688926890268912689226893268942689526896268972689826899269002690126902269032690426905269062690726908269092691026911269122691326914269152691626917269182691926920269212692226923269242692526926269272692826929269302693126932269332693426935269362693726938269392694026941269422694326944269452694626947269482694926950269512695226953269542695526956269572695826959269602696126962269632696426965269662696726968269692697026971269722697326974269752697626977269782697926980269812698226983269842698526986269872698826989269902699126992269932699426995269962699726998269992700027001270022700327004270052700627007270082700927010270112701227013270142701527016270172701827019270202702127022270232702427025270262702727028270292703027031270322703327034270352703627037270382703927040270412704227043270442704527046270472704827049270502705127052270532705427055270562705727058270592706027061270622706327064270652706627067270682706927070270712707227073270742707527076270772707827079270802708127082270832708427085270862708727088270892709027091270922709327094270952709627097270982709927100271012710227103271042710527106271072710827109271102711127112271132711427115271162711727118271192712027121271222712327124271252712627127271282712927130271312713227133271342713527136271372713827139271402714127142271432714427145271462714727148271492715027151271522715327154271552715627157271582715927160271612716227163271642716527166271672716827169271702717127172271732717427175271762717727178271792718027181271822718327184271852718627187271882718927190271912719227193271942719527196271972719827199272002720127202272032720427205272062720727208272092721027211272122721327214272152721627217272182721927220272212722227223272242722527226272272722827229272302723127232272332723427235272362723727238272392724027241272422724327244272452724627247272482724927250272512725227253272542725527256272572725827259272602726127262272632726427265272662726727268272692727027271272722727327274272752727627277272782727927280272812728227283272842728527286272872728827289272902729127292272932729427295272962729727298272992730027301273022730327304273052730627307273082730927310273112731227313273142731527316273172731827319273202732127322273232732427325273262732727328273292733027331273322733327334273352733627337273382733927340273412734227343273442734527346273472734827349273502735127352273532735427355273562735727358273592736027361273622736327364273652736627367273682736927370273712737227373273742737527376273772737827379273802738127382273832738427385273862738727388273892739027391273922739327394273952739627397273982739927400274012740227403274042740527406274072740827409274102741127412274132741427415274162741727418274192742027421274222742327424274252742627427274282742927430274312743227433274342743527436274372743827439274402744127442274432744427445274462744727448274492745027451274522745327454274552745627457274582745927460274612746227463274642746527466274672746827469274702747127472274732747427475274762747727478274792748027481274822748327484274852748627487274882748927490274912749227493274942749527496274972749827499275002750127502275032750427505275062750727508275092751027511275122751327514275152751627517275182751927520275212752227523275242752527526275272752827529275302753127532275332753427535275362753727538275392754027541275422754327544275452754627547275482754927550275512755227553275542755527556275572755827559275602756127562275632756427565275662756727568275692757027571275722757327574275752757627577275782757927580275812758227583275842758527586275872758827589275902759127592275932759427595275962759727598275992760027601276022760327604276052760627607276082760927610276112761227613276142761527616276172761827619276202762127622276232762427625276262762727628276292763027631276322763327634276352763627637276382763927640276412764227643276442764527646276472764827649276502765127652276532765427655276562765727658276592766027661276622766327664276652766627667276682766927670276712767227673276742767527676276772767827679276802768127682276832768427685276862768727688276892769027691276922769327694276952769627697276982769927700277012770227703277042770527706277072770827709277102771127712277132771427715277162771727718277192772027721277222772327724277252772627727277282772927730277312773227733277342773527736277372773827739277402774127742277432774427745277462774727748277492775027751277522775327754277552775627757277582775927760277612776227763277642776527766277672776827769277702777127772277732777427775277762777727778277792778027781277822778327784277852778627787277882778927790277912779227793277942779527796277972779827799278002780127802278032780427805278062780727808278092781027811278122781327814278152781627817278182781927820278212782227823278242782527826278272782827829278302783127832278332783427835278362783727838278392784027841278422784327844278452784627847278482784927850278512785227853278542785527856278572785827859278602786127862278632786427865278662786727868278692787027871278722787327874278752787627877278782787927880278812788227883278842788527886278872788827889278902789127892278932789427895278962789727898278992790027901279022790327904279052790627907279082790927910279112791227913279142791527916279172791827919279202792127922279232792427925279262792727928279292793027931279322793327934279352793627937279382793927940279412794227943279442794527946279472794827949279502795127952279532795427955279562795727958279592796027961279622796327964279652796627967279682796927970279712797227973279742797527976279772797827979279802798127982279832798427985279862798727988279892799027991279922799327994279952799627997279982799928000280012800228003280042800528006280072800828009280102801128012280132801428015280162801728018280192802028021280222802328024280252802628027280282802928030280312803228033280342803528036280372803828039280402804128042280432804428045280462804728048280492805028051280522805328054280552805628057280582805928060280612806228063280642806528066280672806828069280702807128072280732807428075280762807728078280792808028081280822808328084280852808628087280882808928090280912809228093280942809528096280972809828099281002810128102281032810428105281062810728108281092811028111281122811328114281152811628117281182811928120281212812228123281242812528126281272812828129281302813128132281332813428135281362813728138281392814028141281422814328144281452814628147281482814928150281512815228153281542815528156281572815828159281602816128162281632816428165281662816728168281692817028171281722817328174281752817628177281782817928180281812818228183281842818528186281872818828189281902819128192281932819428195281962819728198281992820028201282022820328204282052820628207282082820928210282112821228213282142821528216282172821828219282202822128222282232822428225282262822728228282292823028231282322823328234282352823628237282382823928240282412824228243282442824528246282472824828249282502825128252282532825428255282562825728258282592826028261282622826328264282652826628267282682826928270282712827228273282742827528276282772827828279282802828128282282832828428285282862828728288282892829028291282922829328294282952829628297282982829928300283012830228303283042830528306283072830828309283102831128312283132831428315283162831728318283192832028321283222832328324283252832628327283282832928330283312833228333283342833528336283372833828339283402834128342283432834428345283462834728348283492835028351283522835328354283552835628357283582835928360283612836228363283642836528366283672836828369283702837128372283732837428375283762837728378283792838028381283822838328384283852838628387283882838928390283912839228393283942839528396283972839828399284002840128402284032840428405284062840728408284092841028411284122841328414284152841628417284182841928420284212842228423284242842528426284272842828429284302843128432284332843428435284362843728438284392844028441284422844328444284452844628447284482844928450284512845228453284542845528456284572845828459284602846128462284632846428465284662846728468284692847028471284722847328474284752847628477284782847928480284812848228483284842848528486284872848828489284902849128492284932849428495284962849728498284992850028501285022850328504285052850628507285082850928510285112851228513285142851528516285172851828519285202852128522285232852428525285262852728528285292853028531285322853328534285352853628537285382853928540285412854228543285442854528546285472854828549285502855128552285532855428555285562855728558285592856028561285622856328564285652856628567285682856928570285712857228573285742857528576285772857828579285802858128582285832858428585285862858728588285892859028591285922859328594285952859628597285982859928600286012860228603286042860528606286072860828609286102861128612286132861428615286162861728618286192862028621286222862328624286252862628627286282862928630286312863228633286342863528636286372863828639286402864128642286432864428645286462864728648286492865028651286522865328654286552865628657286582865928660286612866228663286642866528666286672866828669286702867128672286732867428675286762867728678286792868028681286822868328684286852868628687286882868928690286912869228693286942869528696286972869828699287002870128702287032870428705287062870728708287092871028711287122871328714287152871628717287182871928720287212872228723287242872528726287272872828729287302873128732287332873428735287362873728738287392874028741287422874328744287452874628747287482874928750287512875228753287542875528756287572875828759287602876128762287632876428765287662876728768287692877028771287722877328774287752877628777287782877928780287812878228783287842878528786287872878828789287902879128792287932879428795287962879728798287992880028801288022880328804288052880628807288082880928810288112881228813288142881528816288172881828819288202882128822288232882428825288262882728828288292883028831288322883328834288352883628837288382883928840288412884228843288442884528846288472884828849288502885128852288532885428855288562885728858288592886028861288622886328864288652886628867288682886928870288712887228873288742887528876288772887828879288802888128882288832888428885288862888728888288892889028891288922889328894288952889628897288982889928900289012890228903289042890528906289072890828909289102891128912289132891428915289162891728918289192892028921289222892328924289252892628927289282892928930289312893228933289342893528936289372893828939289402894128942289432894428945289462894728948289492895028951289522895328954289552895628957289582895928960289612896228963289642896528966289672896828969289702897128972289732897428975289762897728978289792898028981289822898328984289852898628987289882898928990289912899228993289942899528996289972899828999290002900129002290032900429005290062900729008290092901029011290122901329014290152901629017290182901929020290212902229023290242902529026290272902829029290302903129032290332903429035290362903729038290392904029041290422904329044290452904629047290482904929050290512905229053290542905529056290572905829059290602906129062290632906429065290662906729068290692907029071290722907329074290752907629077290782907929080290812908229083290842908529086290872908829089290902909129092290932909429095290962909729098290992910029101291022910329104291052910629107291082910929110291112911229113291142911529116291172911829119291202912129122291232912429125291262912729128291292913029131291322913329134291352913629137291382913929140291412914229143291442914529146291472914829149291502915129152291532915429155291562915729158291592916029161291622916329164291652916629167291682916929170291712917229173291742917529176291772917829179291802918129182291832918429185291862918729188291892919029191291922919329194291952919629197291982919929200292012920229203292042920529206292072920829209292102921129212292132921429215292162921729218292192922029221292222922329224292252922629227292282922929230292312923229233292342923529236292372923829239292402924129242292432924429245292462924729248292492925029251292522925329254292552925629257292582925929260292612926229263292642926529266292672926829269292702927129272292732927429275292762927729278292792928029281292822928329284292852928629287292882928929290292912929229293292942929529296292972929829299293002930129302293032930429305293062930729308293092931029311293122931329314293152931629317293182931929320293212932229323293242932529326293272932829329293302933129332293332933429335293362933729338293392934029341293422934329344293452934629347293482934929350293512935229353293542935529356293572935829359293602936129362293632936429365293662936729368293692937029371293722937329374293752937629377293782937929380293812938229383293842938529386293872938829389293902939129392293932939429395293962939729398293992940029401294022940329404294052940629407294082940929410294112941229413294142941529416294172941829419294202942129422294232942429425294262942729428294292943029431294322943329434294352943629437294382943929440294412944229443294442944529446294472944829449294502945129452294532945429455294562945729458294592946029461294622946329464294652946629467294682946929470294712947229473294742947529476294772947829479294802948129482294832948429485294862948729488294892949029491294922949329494294952949629497294982949929500295012950229503295042950529506295072950829509295102951129512295132951429515295162951729518295192952029521295222952329524295252952629527295282952929530295312953229533295342953529536295372953829539295402954129542295432954429545295462954729548295492955029551295522955329554295552955629557295582955929560295612956229563295642956529566295672956829569295702957129572295732957429575295762957729578295792958029581295822958329584295852958629587295882958929590295912959229593295942959529596295972959829599296002960129602296032960429605296062960729608296092961029611296122961329614296152961629617296182961929620296212962229623296242962529626296272962829629296302963129632296332963429635296362963729638296392964029641296422964329644296452964629647296482964929650296512965229653296542965529656296572965829659296602966129662296632966429665296662966729668296692967029671296722967329674296752967629677296782967929680296812968229683296842968529686296872968829689296902969129692296932969429695296962969729698296992970029701297022970329704297052970629707297082970929710297112971229713297142971529716297172971829719297202972129722297232972429725297262972729728297292973029731297322973329734297352973629737297382973929740297412974229743297442974529746297472974829749297502975129752297532975429755297562975729758297592976029761297622976329764297652976629767297682976929770297712977229773297742977529776297772977829779297802978129782297832978429785297862978729788297892979029791297922979329794297952979629797297982979929800298012980229803298042980529806298072980829809298102981129812298132981429815298162981729818298192982029821298222982329824298252982629827298282982929830298312983229833298342983529836298372983829839298402984129842298432984429845298462984729848298492985029851298522985329854298552985629857298582985929860298612986229863298642986529866298672986829869298702987129872298732987429875298762987729878298792988029881298822988329884298852988629887298882988929890298912989229893298942989529896298972989829899299002990129902299032990429905299062990729908299092991029911299122991329914299152991629917299182991929920299212992229923299242992529926299272992829929299302993129932299332993429935299362993729938299392994029941299422994329944299452994629947299482994929950299512995229953299542995529956299572995829959299602996129962299632996429965299662996729968299692997029971299722997329974299752997629977299782997929980299812998229983299842998529986299872998829989299902999129992299932999429995299962999729998299993000030001300023000330004300053000630007300083000930010300113001230013300143001530016300173001830019300203002130022300233002430025300263002730028300293003030031300323003330034300353003630037300383003930040300413004230043300443004530046300473004830049300503005130052300533005430055300563005730058300593006030061300623006330064300653006630067300683006930070300713007230073300743007530076300773007830079300803008130082300833008430085300863008730088300893009030091300923009330094300953009630097300983009930100301013010230103301043010530106301073010830109301103011130112301133011430115301163011730118301193012030121301223012330124301253012630127301283012930130301313013230133301343013530136301373013830139301403014130142301433014430145301463014730148301493015030151301523015330154301553015630157301583015930160301613016230163301643016530166301673016830169301703017130172301733017430175301763017730178301793018030181301823018330184301853018630187301883018930190301913019230193301943019530196301973019830199302003020130202302033020430205302063020730208302093021030211302123021330214302153021630217302183021930220302213022230223302243022530226302273022830229302303023130232302333023430235302363023730238302393024030241302423024330244302453024630247302483024930250302513025230253302543025530256302573025830259302603026130262302633026430265302663026730268302693027030271302723027330274302753027630277302783027930280302813028230283302843028530286302873028830289302903029130292302933029430295302963029730298302993030030301303023030330304303053030630307303083030930310303113031230313303143031530316303173031830319303203032130322303233032430325303263032730328303293033030331303323033330334303353033630337303383033930340303413034230343303443034530346303473034830349303503035130352303533035430355303563035730358303593036030361303623036330364303653036630367303683036930370303713037230373303743037530376303773037830379303803038130382303833038430385303863038730388303893039030391303923039330394303953039630397303983039930400304013040230403304043040530406304073040830409304103041130412304133041430415304163041730418304193042030421304223042330424304253042630427304283042930430304313043230433304343043530436304373043830439304403044130442304433044430445304463044730448304493045030451304523045330454304553045630457304583045930460304613046230463304643046530466304673046830469304703047130472304733047430475304763047730478304793048030481304823048330484304853048630487304883048930490304913049230493304943049530496304973049830499305003050130502305033050430505305063050730508305093051030511305123051330514305153051630517305183051930520305213052230523305243052530526305273052830529305303053130532305333053430535305363053730538305393054030541305423054330544305453054630547305483054930550305513055230553305543055530556305573055830559305603056130562305633056430565305663056730568305693057030571305723057330574305753057630577305783057930580305813058230583305843058530586305873058830589305903059130592305933059430595305963059730598305993060030601306023060330604306053060630607306083060930610306113061230613306143061530616306173061830619306203062130622306233062430625306263062730628306293063030631306323063330634306353063630637306383063930640306413064230643306443064530646306473064830649306503065130652306533065430655306563065730658306593066030661306623066330664306653066630667306683066930670306713067230673306743067530676306773067830679306803068130682306833068430685306863068730688306893069030691306923069330694306953069630697306983069930700307013070230703307043070530706307073070830709307103071130712307133071430715307163071730718307193072030721307223072330724307253072630727307283072930730307313073230733307343073530736307373073830739307403074130742307433074430745307463074730748307493075030751307523075330754307553075630757307583075930760307613076230763307643076530766307673076830769307703077130772307733077430775307763077730778307793078030781307823078330784307853078630787307883078930790307913079230793307943079530796307973079830799308003080130802308033080430805308063080730808308093081030811308123081330814308153081630817308183081930820308213082230823308243082530826308273082830829308303083130832308333083430835308363083730838308393084030841308423084330844308453084630847308483084930850308513085230853308543085530856308573085830859308603086130862308633086430865308663086730868308693087030871308723087330874308753087630877308783087930880308813088230883308843088530886308873088830889308903089130892308933089430895308963089730898308993090030901309023090330904309053090630907309083090930910309113091230913309143091530916309173091830919309203092130922309233092430925309263092730928309293093030931309323093330934309353093630937309383093930940309413094230943309443094530946309473094830949309503095130952309533095430955309563095730958309593096030961309623096330964309653096630967309683096930970309713097230973309743097530976309773097830979309803098130982309833098430985309863098730988309893099030991309923099330994309953099630997309983099931000310013100231003310043100531006310073100831009310103101131012310133101431015310163101731018310193102031021310223102331024310253102631027310283102931030310313103231033310343103531036310373103831039310403104131042310433104431045310463104731048310493105031051310523105331054310553105631057310583105931060310613106231063310643106531066310673106831069310703107131072310733107431075310763107731078310793108031081310823108331084310853108631087310883108931090310913109231093310943109531096310973109831099311003110131102311033110431105311063110731108311093111031111311123111331114311153111631117311183111931120311213112231123311243112531126311273112831129311303113131132311333113431135311363113731138311393114031141311423114331144311453114631147311483114931150311513115231153311543115531156311573115831159311603116131162311633116431165311663116731168311693117031171311723117331174311753117631177311783117931180311813118231183311843118531186311873118831189311903119131192311933119431195311963119731198311993120031201312023120331204312053120631207312083120931210312113121231213312143121531216312173121831219312203122131222312233122431225312263122731228312293123031231312323123331234312353123631237312383123931240312413124231243312443124531246312473124831249312503125131252312533125431255312563125731258312593126031261312623126331264312653126631267312683126931270312713127231273312743127531276312773127831279312803128131282312833128431285312863128731288312893129031291312923129331294312953129631297312983129931300313013130231303313043130531306313073130831309313103131131312313133131431315313163131731318313193132031321313223132331324313253132631327313283132931330313313133231333313343133531336313373133831339313403134131342313433134431345313463134731348313493135031351313523135331354313553135631357313583135931360313613136231363313643136531366313673136831369313703137131372313733137431375313763137731378313793138031381313823138331384313853138631387313883138931390313913139231393313943139531396313973139831399314003140131402314033140431405314063140731408314093141031411314123141331414314153141631417314183141931420314213142231423314243142531426314273142831429314303143131432314333143431435314363143731438314393144031441314423144331444314453144631447314483144931450314513145231453314543145531456314573145831459314603146131462314633146431465314663146731468314693147031471314723147331474314753147631477314783147931480314813148231483314843148531486314873148831489314903149131492314933149431495314963149731498314993150031501315023150331504315053150631507315083150931510315113151231513315143151531516315173151831519315203152131522315233152431525315263152731528315293153031531315323153331534315353153631537315383153931540315413154231543315443154531546315473154831549315503155131552315533155431555315563155731558315593156031561315623156331564315653156631567315683156931570315713157231573315743157531576315773157831579315803158131582315833158431585315863158731588315893159031591315923159331594315953159631597315983159931600316013160231603316043160531606316073160831609316103161131612316133161431615316163161731618316193162031621316223162331624316253162631627316283162931630316313163231633316343163531636316373163831639316403164131642316433164431645316463164731648316493165031651316523165331654316553165631657316583165931660316613166231663316643166531666316673166831669316703167131672316733167431675316763167731678316793168031681316823168331684316853168631687316883168931690316913169231693316943169531696316973169831699317003170131702317033170431705317063170731708317093171031711317123171331714317153171631717317183171931720317213172231723317243172531726317273172831729317303173131732317333173431735317363173731738317393174031741317423174331744317453174631747317483174931750317513175231753317543175531756317573175831759317603176131762317633176431765317663176731768317693177031771317723177331774317753177631777317783177931780317813178231783317843178531786317873178831789317903179131792317933179431795317963179731798317993180031801318023180331804318053180631807318083180931810318113181231813318143181531816318173181831819318203182131822318233182431825318263182731828318293183031831318323183331834318353183631837318383183931840318413184231843318443184531846318473184831849318503185131852318533185431855318563185731858318593186031861318623186331864318653186631867318683186931870318713187231873318743187531876318773187831879318803188131882318833188431885318863188731888318893189031891318923189331894318953189631897318983189931900319013190231903319043190531906319073190831909319103191131912319133191431915319163191731918319193192031921319223192331924319253192631927319283192931930319313193231933319343193531936319373193831939319403194131942319433194431945319463194731948319493195031951319523195331954319553195631957319583195931960319613196231963319643196531966319673196831969319703197131972319733197431975319763197731978319793198031981319823198331984319853198631987319883198931990319913199231993319943199531996319973199831999320003200132002320033200432005320063200732008320093201032011320123201332014320153201632017320183201932020320213202232023320243202532026320273202832029320303203132032320333203432035320363203732038320393204032041320423204332044320453204632047320483204932050320513205232053320543205532056320573205832059320603206132062320633206432065320663206732068320693207032071320723207332074320753207632077320783207932080320813208232083320843208532086320873208832089320903209132092320933209432095320963209732098320993210032101321023210332104321053210632107321083210932110321113211232113321143211532116321173211832119321203212132122321233212432125321263212732128321293213032131321323213332134321353213632137321383213932140321413214232143321443214532146321473214832149321503215132152321533215432155321563215732158321593216032161321623216332164321653216632167321683216932170321713217232173321743217532176321773217832179321803218132182321833218432185321863218732188321893219032191321923219332194321953219632197321983219932200322013220232203322043220532206322073220832209322103221132212322133221432215322163221732218322193222032221322223222332224322253222632227322283222932230322313223232233322343223532236322373223832239322403224132242322433224432245322463224732248322493225032251322523225332254322553225632257322583225932260322613226232263322643226532266322673226832269322703227132272322733227432275322763227732278322793228032281322823228332284322853228632287322883228932290322913229232293322943229532296322973229832299323003230132302323033230432305323063230732308323093231032311323123231332314323153231632317323183231932320323213232232323323243232532326323273232832329323303233132332323333233432335323363233732338323393234032341323423234332344323453234632347323483234932350323513235232353323543235532356323573235832359323603236132362323633236432365323663236732368323693237032371323723237332374323753237632377323783237932380323813238232383323843238532386323873238832389323903239132392323933239432395323963239732398323993240032401324023240332404324053240632407324083240932410324113241232413324143241532416324173241832419324203242132422324233242432425324263242732428324293243032431324323243332434324353243632437324383243932440324413244232443324443244532446324473244832449324503245132452324533245432455324563245732458324593246032461324623246332464324653246632467324683246932470324713247232473324743247532476324773247832479324803248132482324833248432485324863248732488324893249032491324923249332494324953249632497324983249932500325013250232503325043250532506325073250832509325103251132512325133251432515325163251732518325193252032521325223252332524325253252632527325283252932530325313253232533325343253532536325373253832539325403254132542325433254432545325463254732548325493255032551325523255332554325553255632557325583255932560325613256232563325643256532566325673256832569325703257132572325733257432575325763257732578325793258032581325823258332584325853258632587325883258932590325913259232593325943259532596325973259832599326003260132602326033260432605326063260732608326093261032611326123261332614326153261632617326183261932620326213262232623326243262532626326273262832629326303263132632326333263432635326363263732638326393264032641326423264332644326453264632647326483264932650326513265232653326543265532656326573265832659326603266132662326633266432665326663266732668326693267032671326723267332674326753267632677326783267932680326813268232683326843268532686326873268832689326903269132692326933269432695326963269732698326993270032701327023270332704327053270632707327083270932710327113271232713327143271532716327173271832719327203272132722327233272432725327263272732728327293273032731327323273332734327353273632737327383273932740327413274232743327443274532746327473274832749327503275132752327533275432755327563275732758327593276032761327623276332764327653276632767327683276932770327713277232773327743277532776327773277832779327803278132782327833278432785327863278732788327893279032791327923279332794327953279632797327983279932800328013280232803328043280532806328073280832809328103281132812328133281432815328163281732818328193282032821328223282332824328253282632827328283282932830328313283232833328343283532836328373283832839328403284132842328433284432845328463284732848328493285032851328523285332854328553285632857328583285932860328613286232863328643286532866328673286832869328703287132872328733287432875328763287732878328793288032881328823288332884328853288632887328883288932890328913289232893328943289532896328973289832899329003290132902329033290432905329063290732908329093291032911329123291332914329153291632917329183291932920329213292232923329243292532926329273292832929329303293132932329333293432935329363293732938329393294032941329423294332944329453294632947329483294932950329513295232953329543295532956329573295832959329603296132962329633296432965329663296732968329693297032971329723297332974329753297632977329783297932980329813298232983329843298532986329873298832989329903299132992329933299432995329963299732998329993300033001330023300333004330053300633007330083300933010330113301233013330143301533016330173301833019330203302133022330233302433025330263302733028330293303033031330323303333034330353303633037330383303933040330413304233043330443304533046330473304833049330503305133052330533305433055330563305733058330593306033061330623306333064330653306633067330683306933070330713307233073330743307533076330773307833079330803308133082330833308433085330863308733088330893309033091330923309333094330953309633097330983309933100331013310233103331043310533106331073310833109331103311133112331133311433115331163311733118331193312033121331223312333124331253312633127331283312933130331313313233133331343313533136331373313833139331403314133142331433314433145331463314733148331493315033151331523315333154331553315633157331583315933160331613316233163331643316533166331673316833169331703317133172331733317433175331763317733178331793318033181331823318333184331853318633187331883318933190331913319233193331943319533196331973319833199332003320133202332033320433205332063320733208332093321033211332123321333214332153321633217332183321933220332213322233223332243322533226332273322833229332303323133232332333323433235332363323733238332393324033241332423324333244332453324633247332483324933250332513325233253332543325533256332573325833259332603326133262332633326433265332663326733268332693327033271332723327333274332753327633277332783327933280332813328233283332843328533286332873328833289332903329133292332933329433295332963329733298332993330033301333023330333304333053330633307333083330933310333113331233313333143331533316333173331833319333203332133322333233332433325333263332733328333293333033331333323333333334333353333633337333383333933340333413334233343333443334533346333473334833349333503335133352333533335433355333563335733358333593336033361333623336333364333653336633367333683336933370333713337233373333743337533376333773337833379333803338133382333833338433385333863338733388333893339033391333923339333394333953339633397333983339933400334013340233403334043340533406334073340833409334103341133412334133341433415334163341733418334193342033421334223342333424334253342633427334283342933430334313343233433334343343533436334373343833439334403344133442334433344433445334463344733448334493345033451334523345333454334553345633457334583345933460334613346233463334643346533466334673346833469334703347133472334733347433475334763347733478334793348033481334823348333484334853348633487334883348933490334913349233493334943349533496334973349833499335003350133502335033350433505335063350733508335093351033511335123351333514335153351633517335183351933520335213352233523335243352533526335273352833529335303353133532335333353433535335363353733538335393354033541335423354333544335453354633547335483354933550335513355233553335543355533556335573355833559335603356133562335633356433565335663356733568335693357033571335723357333574335753357633577335783357933580335813358233583335843358533586335873358833589335903359133592335933359433595335963359733598335993360033601336023360333604336053360633607336083360933610336113361233613336143361533616336173361833619336203362133622336233362433625336263362733628336293363033631336323363333634336353363633637336383363933640336413364233643336443364533646336473364833649336503365133652336533365433655336563365733658336593366033661336623366333664336653366633667336683366933670336713367233673336743367533676336773367833679336803368133682336833368433685336863368733688336893369033691336923369333694336953369633697336983369933700337013370233703337043370533706337073370833709337103371133712337133371433715337163371733718337193372033721337223372333724337253372633727337283372933730337313373233733337343373533736337373373833739337403374133742337433374433745337463374733748337493375033751337523375333754337553375633757337583375933760337613376233763337643376533766337673376833769337703377133772337733377433775337763377733778337793378033781337823378333784337853378633787337883378933790337913379233793337943379533796337973379833799338003380133802338033380433805338063380733808338093381033811338123381333814338153381633817338183381933820338213382233823338243382533826338273382833829338303383133832338333383433835338363383733838338393384033841338423384333844338453384633847338483384933850338513385233853338543385533856338573385833859338603386133862338633386433865338663386733868338693387033871338723387333874338753387633877338783387933880338813388233883338843388533886338873388833889338903389133892338933389433895338963389733898338993390033901339023390333904339053390633907339083390933910339113391233913339143391533916339173391833919339203392133922339233392433925339263392733928339293393033931339323393333934339353393633937339383393933940339413394233943339443394533946339473394833949339503395133952339533395433955339563395733958339593396033961339623396333964339653396633967339683396933970339713397233973339743397533976339773397833979339803398133982339833398433985339863398733988339893399033991339923399333994339953399633997339983399934000340013400234003340043400534006340073400834009340103401134012340133401434015340163401734018340193402034021340223402334024340253402634027340283402934030340313403234033340343403534036340373403834039340403404134042340433404434045340463404734048340493405034051340523405334054340553405634057340583405934060340613406234063340643406534066340673406834069340703407134072340733407434075340763407734078340793408034081340823408334084340853408634087340883408934090340913409234093340943409534096340973409834099341003410134102341033410434105341063410734108341093411034111341123411334114341153411634117341183411934120341213412234123341243412534126341273412834129341303413134132341333413434135341363413734138341393414034141341423414334144341453414634147341483414934150341513415234153341543415534156341573415834159341603416134162341633416434165341663416734168341693417034171341723417334174341753417634177341783417934180341813418234183341843418534186341873418834189341903419134192341933419434195341963419734198341993420034201342023420334204342053420634207342083420934210342113421234213342143421534216342173421834219342203422134222342233422434225342263422734228342293423034231342323423334234342353423634237342383423934240342413424234243342443424534246342473424834249342503425134252342533425434255342563425734258342593426034261342623426334264342653426634267342683426934270342713427234273342743427534276342773427834279342803428134282342833428434285342863428734288342893429034291342923429334294342953429634297342983429934300343013430234303343043430534306343073430834309343103431134312343133431434315343163431734318343193432034321343223432334324343253432634327343283432934330343313433234333343343433534336343373433834339343403434134342343433434434345343463434734348343493435034351343523435334354343553435634357343583435934360343613436234363343643436534366343673436834369343703437134372343733437434375343763437734378343793438034381343823438334384343853438634387343883438934390343913439234393343943439534396343973439834399344003440134402344033440434405344063440734408344093441034411344123441334414344153441634417344183441934420344213442234423344243442534426344273442834429344303443134432344333443434435344363443734438344393444034441344423444334444344453444634447344483444934450344513445234453344543445534456344573445834459344603446134462344633446434465344663446734468344693447034471344723447334474344753447634477344783447934480344813448234483344843448534486344873448834489344903449134492344933449434495344963449734498344993450034501345023450334504345053450634507345083450934510345113451234513345143451534516345173451834519345203452134522345233452434525345263452734528345293453034531345323453334534345353453634537345383453934540345413454234543345443454534546345473454834549345503455134552345533455434555345563455734558345593456034561345623456334564345653456634567345683456934570345713457234573345743457534576345773457834579345803458134582345833458434585345863458734588345893459034591345923459334594345953459634597345983459934600346013460234603346043460534606346073460834609346103461134612346133461434615346163461734618346193462034621346223462334624346253462634627346283462934630346313463234633346343463534636346373463834639346403464134642346433464434645346463464734648346493465034651346523465334654346553465634657346583465934660346613466234663346643466534666346673466834669346703467134672346733467434675346763467734678346793468034681346823468334684346853468634687346883468934690346913469234693346943469534696346973469834699347003470134702347033470434705347063470734708347093471034711347123471334714347153471634717347183471934720347213472234723347243472534726347273472834729347303473134732347333473434735347363473734738347393474034741347423474334744347453474634747347483474934750347513475234753347543475534756347573475834759347603476134762347633476434765347663476734768347693477034771347723477334774347753477634777347783477934780347813478234783347843478534786347873478834789347903479134792347933479434795347963479734798347993480034801348023480334804348053480634807348083480934810348113481234813348143481534816348173481834819348203482134822348233482434825348263482734828348293483034831348323483334834348353483634837348383483934840348413484234843348443484534846348473484834849348503485134852348533485434855348563485734858348593486034861348623486334864348653486634867348683486934870348713487234873348743487534876348773487834879348803488134882348833488434885348863488734888348893489034891348923489334894348953489634897348983489934900349013490234903349043490534906349073490834909349103491134912349133491434915349163491734918349193492034921349223492334924349253492634927349283492934930349313493234933349343493534936349373493834939349403494134942349433494434945349463494734948349493495034951349523495334954349553495634957349583495934960349613496234963349643496534966349673496834969349703497134972349733497434975349763497734978349793498034981349823498334984349853498634987349883498934990349913499234993349943499534996349973499834999350003500135002350033500435005350063500735008350093501035011350123501335014350153501635017350183501935020350213502235023350243502535026350273502835029350303503135032350333503435035350363503735038350393504035041350423504335044350453504635047350483504935050350513505235053350543505535056350573505835059350603506135062350633506435065350663506735068350693507035071350723507335074350753507635077350783507935080350813508235083350843508535086350873508835089350903509135092350933509435095350963509735098350993510035101351023510335104351053510635107351083510935110351113511235113351143511535116351173511835119351203512135122351233512435125351263512735128351293513035131351323513335134351353513635137351383513935140351413514235143351443514535146351473514835149351503515135152351533515435155351563515735158351593516035161351623516335164351653516635167351683516935170351713517235173351743517535176351773517835179351803518135182351833518435185351863518735188351893519035191351923519335194351953519635197351983519935200352013520235203352043520535206352073520835209352103521135212352133521435215352163521735218352193522035221352223522335224352253522635227352283522935230352313523235233352343523535236352373523835239352403524135242352433524435245352463524735248352493525035251352523525335254352553525635257352583525935260352613526235263352643526535266352673526835269352703527135272352733527435275352763527735278352793528035281352823528335284352853528635287352883528935290352913529235293352943529535296352973529835299353003530135302353033530435305353063530735308353093531035311353123531335314353153531635317353183531935320353213532235323353243532535326353273532835329353303533135332353333533435335353363533735338353393534035341353423534335344353453534635347353483534935350353513535235353353543535535356353573535835359353603536135362353633536435365353663536735368353693537035371353723537335374353753537635377353783537935380353813538235383353843538535386353873538835389353903539135392353933539435395353963539735398353993540035401354023540335404354053540635407354083540935410354113541235413354143541535416354173541835419354203542135422354233542435425354263542735428354293543035431354323543335434354353543635437354383543935440354413544235443354443544535446354473544835449354503545135452354533545435455354563545735458354593546035461354623546335464354653546635467354683546935470354713547235473354743547535476354773547835479354803548135482354833548435485354863548735488354893549035491354923549335494354953549635497354983549935500355013550235503355043550535506355073550835509355103551135512355133551435515355163551735518355193552035521355223552335524355253552635527355283552935530355313553235533355343553535536355373553835539355403554135542355433554435545355463554735548355493555035551355523555335554355553555635557355583555935560355613556235563355643556535566355673556835569355703557135572355733557435575355763557735578355793558035581355823558335584355853558635587355883558935590355913559235593355943559535596355973559835599356003560135602356033560435605356063560735608356093561035611356123561335614356153561635617356183561935620356213562235623356243562535626356273562835629356303563135632356333563435635356363563735638356393564035641356423564335644356453564635647356483564935650356513565235653356543565535656356573565835659356603566135662356633566435665356663566735668356693567035671356723567335674356753567635677356783567935680356813568235683356843568535686356873568835689356903569135692356933569435695356963569735698356993570035701357023570335704357053570635707357083570935710357113571235713357143571535716357173571835719357203572135722357233572435725357263572735728357293573035731357323573335734357353573635737357383573935740357413574235743357443574535746357473574835749357503575135752357533575435755357563575735758357593576035761357623576335764357653576635767357683576935770357713577235773357743577535776357773577835779357803578135782357833578435785357863578735788357893579035791357923579335794357953579635797357983579935800358013580235803358043580535806358073580835809358103581135812358133581435815358163581735818358193582035821358223582335824358253582635827358283582935830358313583235833358343583535836358373583835839358403584135842358433584435845358463584735848358493585035851358523585335854358553585635857358583585935860358613586235863358643586535866358673586835869358703587135872358733587435875358763587735878358793588035881358823588335884358853588635887358883588935890358913589235893358943589535896358973589835899359003590135902359033590435905359063590735908359093591035911359123591335914359153591635917359183591935920359213592235923359243592535926359273592835929359303593135932359333593435935359363593735938359393594035941359423594335944359453594635947359483594935950359513595235953359543595535956359573595835959359603596135962359633596435965359663596735968359693597035971359723597335974359753597635977359783597935980359813598235983359843598535986359873598835989359903599135992359933599435995359963599735998359993600036001360023600336004360053600636007360083600936010360113601236013360143601536016360173601836019360203602136022360233602436025360263602736028360293603036031360323603336034360353603636037360383603936040360413604236043360443604536046360473604836049360503605136052360533605436055360563605736058360593606036061360623606336064360653606636067360683606936070360713607236073360743607536076360773607836079360803608136082360833608436085360863608736088360893609036091360923609336094360953609636097360983609936100361013610236103361043610536106361073610836109361103611136112361133611436115361163611736118361193612036121361223612336124361253612636127361283612936130361313613236133361343613536136361373613836139361403614136142361433614436145361463614736148361493615036151361523615336154361553615636157361583615936160361613616236163361643616536166361673616836169361703617136172361733617436175361763617736178361793618036181361823618336184361853618636187361883618936190361913619236193361943619536196361973619836199362003620136202362033620436205362063620736208362093621036211362123621336214362153621636217362183621936220362213622236223362243622536226362273622836229362303623136232362333623436235362363623736238362393624036241362423624336244362453624636247362483624936250362513625236253362543625536256362573625836259362603626136262362633626436265362663626736268362693627036271362723627336274362753627636277362783627936280362813628236283362843628536286362873628836289362903629136292362933629436295362963629736298362993630036301363023630336304363053630636307363083630936310363113631236313363143631536316363173631836319363203632136322363233632436325363263632736328363293633036331363323633336334363353633636337363383633936340363413634236343363443634536346363473634836349363503635136352363533635436355363563635736358363593636036361363623636336364363653636636367363683636936370363713637236373363743637536376363773637836379363803638136382363833638436385363863638736388363893639036391363923639336394363953639636397363983639936400364013640236403364043640536406364073640836409364103641136412364133641436415364163641736418364193642036421364223642336424364253642636427364283642936430364313643236433364343643536436364373643836439364403644136442364433644436445364463644736448364493645036451364523645336454364553645636457364583645936460364613646236463364643646536466364673646836469364703647136472364733647436475364763647736478364793648036481364823648336484364853648636487364883648936490364913649236493364943649536496364973649836499365003650136502365033650436505365063650736508365093651036511365123651336514365153651636517365183651936520365213652236523365243652536526365273652836529365303653136532365333653436535365363653736538365393654036541365423654336544365453654636547365483654936550365513655236553365543655536556365573655836559365603656136562365633656436565365663656736568365693657036571365723657336574365753657636577365783657936580365813658236583365843658536586365873658836589365903659136592365933659436595365963659736598365993660036601366023660336604366053660636607366083660936610366113661236613366143661536616366173661836619366203662136622366233662436625366263662736628366293663036631366323663336634366353663636637366383663936640366413664236643366443664536646366473664836649366503665136652366533665436655366563665736658366593666036661366623666336664366653666636667366683666936670366713667236673366743667536676366773667836679366803668136682366833668436685366863668736688366893669036691366923669336694366953669636697366983669936700367013670236703367043670536706367073670836709367103671136712367133671436715367163671736718367193672036721367223672336724367253672636727367283672936730367313673236733367343673536736367373673836739367403674136742367433674436745367463674736748367493675036751367523675336754367553675636757367583675936760367613676236763367643676536766367673676836769367703677136772367733677436775367763677736778367793678036781367823678336784367853678636787367883678936790367913679236793367943679536796367973679836799368003680136802368033680436805368063680736808368093681036811368123681336814368153681636817368183681936820368213682236823368243682536826368273682836829368303683136832368333683436835368363683736838368393684036841368423684336844368453684636847368483684936850368513685236853368543685536856368573685836859368603686136862368633686436865368663686736868368693687036871368723687336874368753687636877368783687936880368813688236883368843688536886368873688836889368903689136892368933689436895368963689736898368993690036901369023690336904369053690636907369083690936910369113691236913369143691536916369173691836919369203692136922369233692436925369263692736928369293693036931369323693336934369353693636937369383693936940369413694236943369443694536946369473694836949369503695136952369533695436955369563695736958369593696036961369623696336964369653696636967369683696936970369713697236973369743697536976369773697836979369803698136982369833698436985369863698736988369893699036991369923699336994369953699636997369983699937000370013700237003370043700537006370073700837009370103701137012370133701437015370163701737018370193702037021370223702337024370253702637027370283702937030370313703237033370343703537036370373703837039370403704137042370433704437045370463704737048370493705037051370523705337054370553705637057370583705937060370613706237063370643706537066370673706837069370703707137072 |
- // Generated by Haxe 4.2.0
- var oimo = oimo || {};
- if(!oimo.collision) oimo.collision = {};
- if(!oimo.collision.broadphase) oimo.collision.broadphase = {};
- oimo.collision.broadphase.BroadPhase = class oimo_collision_broadphase_BroadPhase {
- constructor(type) {
- this._type = type;
- this._numProxies = 0;
- this._proxyList = null;
- this._proxyListLast = null;
- this._proxyPairList = null;
- this._incremental = false;
- this._testCount = 0;
- this._proxyPairPool = null;
- this._idCount = 0;
- this._convexSweep = new oimo.collision.broadphase._BroadPhase.ConvexSweepGeometry();
- this._aabb = new oimo.collision.broadphase._BroadPhase.AabbGeometry();
- this.identity = new oimo.common.Transform();
- this.zero = new oimo.common.Vec3();
- this.rayCastHit = new oimo.collision.geometry.RayCastHit();
- }
- createProxy(userData,aabb) {
- return null;
- }
- destroyProxy(proxy) {
- }
- moveProxy(proxy,aabb,displacement) {
- }
- isOverlapping(proxy1,proxy2) {
- if(proxy1._aabbMinX < proxy2._aabbMaxX && proxy1._aabbMaxX > proxy2._aabbMinX && proxy1._aabbMinY < proxy2._aabbMaxY && proxy1._aabbMaxY > proxy2._aabbMinY && proxy1._aabbMinZ < proxy2._aabbMaxZ) {
- return proxy1._aabbMaxZ > proxy2._aabbMinZ;
- } else {
- return false;
- }
- }
- collectPairs() {
- }
- getProxyPairList() {
- return this._proxyPairList;
- }
- isIncremental() {
- return this._incremental;
- }
- getTestCount() {
- return this._testCount;
- }
- rayCast(begin,end,callback) {
- }
- convexCast(convex,begin,translation,callback) {
- }
- aabbTest(aabb,callback) {
- }
- }
- if(!oimo.collision.geometry) oimo.collision.geometry = {};
- oimo.collision.geometry.Geometry = class oimo_collision_geometry_Geometry {
- constructor(type) {
- this._type = type;
- this._volume = 0;
- }
- _updateMass() {
- }
- _computeAabb(aabb,tf) {
- }
- _rayCastLocal(beginX,beginY,beginZ,endX,endY,endZ,hit) {
- return false;
- }
- getType() {
- return this._type;
- }
- getVolume() {
- return this._volume;
- }
- rayCast(begin,end,transform,hit) {
- let beginLocalX;
- let beginLocalY;
- let beginLocalZ;
- let endLocalX;
- let endLocalY;
- let endLocalZ;
- beginLocalX = begin.x;
- beginLocalY = begin.y;
- beginLocalZ = begin.z;
- endLocalX = end.x;
- endLocalY = end.y;
- endLocalZ = end.z;
- beginLocalX -= transform._positionX;
- beginLocalY -= transform._positionY;
- beginLocalZ -= transform._positionZ;
- endLocalX -= transform._positionX;
- endLocalY -= transform._positionY;
- endLocalZ -= transform._positionZ;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = transform._rotation00 * beginLocalX + transform._rotation10 * beginLocalY + transform._rotation20 * beginLocalZ;
- __tmp__Y = transform._rotation01 * beginLocalX + transform._rotation11 * beginLocalY + transform._rotation21 * beginLocalZ;
- __tmp__Z = transform._rotation02 * beginLocalX + transform._rotation12 * beginLocalY + transform._rotation22 * beginLocalZ;
- beginLocalX = __tmp__X;
- beginLocalY = __tmp__Y;
- beginLocalZ = __tmp__Z;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = transform._rotation00 * endLocalX + transform._rotation10 * endLocalY + transform._rotation20 * endLocalZ;
- __tmp__Y1 = transform._rotation01 * endLocalX + transform._rotation11 * endLocalY + transform._rotation21 * endLocalZ;
- __tmp__Z1 = transform._rotation02 * endLocalX + transform._rotation12 * endLocalY + transform._rotation22 * endLocalZ;
- endLocalX = __tmp__X1;
- endLocalY = __tmp__Y1;
- endLocalZ = __tmp__Z1;
- if(this._rayCastLocal(beginLocalX,beginLocalY,beginLocalZ,endLocalX,endLocalY,endLocalZ,hit)) {
- let localPosX;
- let localPosY;
- let localPosZ;
- let localNormalX;
- let localNormalY;
- let localNormalZ;
- let v = hit.position;
- localPosX = v.x;
- localPosY = v.y;
- localPosZ = v.z;
- let v1 = hit.normal;
- localNormalX = v1.x;
- localNormalY = v1.y;
- localNormalZ = v1.z;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = transform._rotation00 * localPosX + transform._rotation01 * localPosY + transform._rotation02 * localPosZ;
- __tmp__Y = transform._rotation10 * localPosX + transform._rotation11 * localPosY + transform._rotation12 * localPosZ;
- __tmp__Z = transform._rotation20 * localPosX + transform._rotation21 * localPosY + transform._rotation22 * localPosZ;
- localPosX = __tmp__X;
- localPosY = __tmp__Y;
- localPosZ = __tmp__Z;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = transform._rotation00 * localNormalX + transform._rotation01 * localNormalY + transform._rotation02 * localNormalZ;
- __tmp__Y1 = transform._rotation10 * localNormalX + transform._rotation11 * localNormalY + transform._rotation12 * localNormalZ;
- __tmp__Z1 = transform._rotation20 * localNormalX + transform._rotation21 * localNormalY + transform._rotation22 * localNormalZ;
- localNormalX = __tmp__X1;
- localNormalY = __tmp__Y1;
- localNormalZ = __tmp__Z1;
- localPosX += transform._positionX;
- localPosY += transform._positionY;
- localPosZ += transform._positionZ;
- let v2 = hit.position;
- v2.x = localPosX;
- v2.y = localPosY;
- v2.z = localPosZ;
- let v3 = hit.normal;
- v3.x = localNormalX;
- v3.y = localNormalY;
- v3.z = localNormalZ;
- return true;
- }
- return false;
- }
- }
- oimo.collision.geometry.ConvexGeometry = class oimo_collision_geometry_ConvexGeometry extends oimo.collision.geometry.Geometry {
- constructor(type) {
- super(type);
- this._gjkMargin = oimo.common.Setting.defaultGJKMargin;
- this._useGjkRayCast = false;
- }
- getGjkMergin() {
- return this._gjkMargin;
- }
- setGjkMergin(gjkMergin) {
- if(gjkMergin < 0) {
- gjkMergin = 0;
- }
- this._gjkMargin = gjkMergin;
- }
- computeLocalSupportingVertex(dir,out) {
- }
- rayCast(begin,end,transform,hit) {
- if(this._useGjkRayCast) {
- return oimo.collision.narrowphase.detector.gjkepa.GjkEpa.instance.rayCast(this,transform,begin,end,hit);
- } else {
- return super.rayCast(begin,end,transform,hit);
- }
- }
- }
- if(!oimo.collision.broadphase._BroadPhase) oimo.collision.broadphase._BroadPhase = {};
- oimo.collision.broadphase._BroadPhase.ConvexSweepGeometry = class oimo_collision_broadphase__$BroadPhase_ConvexSweepGeometry extends oimo.collision.geometry.ConvexGeometry {
- constructor() {
- super(-1);
- }
- init(c,transform,translation) {
- this.c = c;
- let trX;
- let trY;
- let trZ;
- trX = translation.x;
- trY = translation.y;
- trZ = translation.z;
- let localTrX;
- let localTrY;
- let localTrZ;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = transform._rotation00 * trX + transform._rotation10 * trY + transform._rotation20 * trZ;
- __tmp__Y = transform._rotation01 * trX + transform._rotation11 * trY + transform._rotation21 * trZ;
- __tmp__Z = transform._rotation02 * trX + transform._rotation12 * trY + transform._rotation22 * trZ;
- localTrX = __tmp__X;
- localTrY = __tmp__Y;
- localTrZ = __tmp__Z;
- this.localTranslation = new oimo.common.Vec3();
- let v = this.localTranslation;
- v.x = localTrX;
- v.y = localTrY;
- v.z = localTrZ;
- this._gjkMargin = c._gjkMargin;
- }
- computeLocalSupportingVertex(dir,out) {
- this.c.computeLocalSupportingVertex(dir,out);
- let v = this.localTranslation;
- if(dir.x * v.x + dir.y * v.y + dir.z * v.z > 0) {
- let v = this.localTranslation;
- out.x += v.x;
- out.y += v.y;
- out.z += v.z;
- }
- }
- }
- oimo.collision.broadphase._BroadPhase.AabbGeometry = class oimo_collision_broadphase__$BroadPhase_AabbGeometry extends oimo.collision.geometry.ConvexGeometry {
- constructor() {
- super(-1);
- this.min = new oimo.common.Vec3();
- this.max = new oimo.common.Vec3();
- }
- computeLocalSupportingVertex(dir,out) {
- out.x = dir.x > 0 ? this.max.x : this.min.x;
- out.y = dir.y > 0 ? this.max.y : this.min.y;
- out.z = dir.z > 0 ? this.max.z : this.min.z;
- }
- }
- oimo.collision.broadphase.BroadPhaseProxyCallback = class oimo_collision_broadphase_BroadPhaseProxyCallback {
- constructor() {
- }
- process(proxy) {
- }
- }
- oimo.collision.broadphase.BroadPhaseType = class oimo_collision_broadphase_BroadPhaseType {
- }
- oimo.collision.broadphase.Proxy = class oimo_collision_broadphase_Proxy {
- constructor(userData,id) {
- this.userData = userData;
- this._id = id;
- this._prev = null;
- this._next = null;
- this._aabbMinX = 0;
- this._aabbMinY = 0;
- this._aabbMinZ = 0;
- this._aabbMaxX = 0;
- this._aabbMaxY = 0;
- this._aabbMaxZ = 0;
- }
- getId() {
- return this._id;
- }
- getFatAabb() {
- let aabb = new oimo.collision.geometry.Aabb();
- aabb._minX = this._aabbMinX;
- aabb._minY = this._aabbMinY;
- aabb._minZ = this._aabbMinZ;
- aabb._maxX = this._aabbMaxX;
- aabb._maxY = this._aabbMaxY;
- aabb._maxZ = this._aabbMaxZ;
- return aabb;
- }
- getFatAabbTo(aabb) {
- aabb._minX = this._aabbMinX;
- aabb._minY = this._aabbMinY;
- aabb._minZ = this._aabbMinZ;
- aabb._maxX = this._aabbMaxX;
- aabb._maxY = this._aabbMaxY;
- aabb._maxZ = this._aabbMaxZ;
- }
- }
- oimo.collision.broadphase.ProxyPair = class oimo_collision_broadphase_ProxyPair {
- constructor() {
- this._p1 = null;
- this._p2 = null;
- }
- getProxy1() {
- return this._p1;
- }
- getProxy2() {
- return this._p2;
- }
- getNext() {
- return this._next;
- }
- }
- if(!oimo.collision.broadphase.bruteforce) oimo.collision.broadphase.bruteforce = {};
- oimo.collision.broadphase.bruteforce.BruteForceBroadPhase = class oimo_collision_broadphase_bruteforce_BruteForceBroadPhase extends oimo.collision.broadphase.BroadPhase {
- constructor() {
- super(1);
- this._incremental = false;
- }
- createProxy(userData,aabb) {
- let proxy = new oimo.collision.broadphase.Proxy(userData,this._idCount++);
- this._numProxies++;
- if(this._proxyList == null) {
- this._proxyList = proxy;
- this._proxyListLast = proxy;
- } else {
- this._proxyListLast._next = proxy;
- proxy._prev = this._proxyListLast;
- this._proxyListLast = proxy;
- }
- proxy._aabbMinX = aabb._minX;
- proxy._aabbMinY = aabb._minY;
- proxy._aabbMinZ = aabb._minZ;
- proxy._aabbMaxX = aabb._maxX;
- proxy._aabbMaxY = aabb._maxY;
- proxy._aabbMaxZ = aabb._maxZ;
- return proxy;
- }
- destroyProxy(proxy) {
- this._numProxies--;
- let prev = proxy._prev;
- let next = proxy._next;
- if(prev != null) {
- prev._next = next;
- }
- if(next != null) {
- next._prev = prev;
- }
- if(proxy == this._proxyList) {
- this._proxyList = this._proxyList._next;
- }
- if(proxy == this._proxyListLast) {
- this._proxyListLast = this._proxyListLast._prev;
- }
- proxy._next = null;
- proxy._prev = null;
- proxy.userData = null;
- }
- moveProxy(proxy,aabb,dislacement) {
- proxy._aabbMinX = aabb._minX;
- proxy._aabbMinY = aabb._minY;
- proxy._aabbMinZ = aabb._minZ;
- proxy._aabbMaxX = aabb._maxX;
- proxy._aabbMaxY = aabb._maxY;
- proxy._aabbMaxZ = aabb._maxZ;
- }
- collectPairs() {
- let p = this._proxyPairList;
- if(p != null) {
- while(true) {
- p._p1 = null;
- p._p2 = null;
- p = p._next;
- if(!(p != null)) {
- break;
- }
- }
- this._proxyPairList._next = this._proxyPairPool;
- this._proxyPairPool = this._proxyPairList;
- this._proxyPairList = null;
- }
- this._testCount = 0;
- let p1 = this._proxyList;
- while(p1 != null) {
- let n = p1._next;
- let p2 = p1._next;
- while(p2 != null) {
- let n = p2._next;
- this._testCount++;
- if(p1._aabbMinX < p2._aabbMaxX && p1._aabbMaxX > p2._aabbMinX && p1._aabbMinY < p2._aabbMaxY && p1._aabbMaxY > p2._aabbMinY && p1._aabbMinZ < p2._aabbMaxZ && p1._aabbMaxZ > p2._aabbMinZ) {
- let first = this._proxyPairPool;
- if(first != null) {
- this._proxyPairPool = first._next;
- first._next = null;
- } else {
- first = new oimo.collision.broadphase.ProxyPair();
- }
- let pp = first;
- if(this._proxyPairList == null) {
- this._proxyPairList = pp;
- } else {
- pp._next = this._proxyPairList;
- this._proxyPairList = pp;
- }
- pp._p1 = p1;
- pp._p2 = p2;
- }
- p2 = n;
- }
- p1 = n;
- }
- }
- rayCast(begin,end,callback) {
- let p1X;
- let p1Y;
- let p1Z;
- let p2X;
- let p2Y;
- let p2Z;
- p1X = begin.x;
- p1Y = begin.y;
- p1Z = begin.z;
- p2X = end.x;
- p2Y = end.y;
- p2Z = end.z;
- let p = this._proxyList;
- while(p != null) {
- let n = p._next;
- let x1 = p1X;
- let y1 = p1Y;
- let z1 = p1Z;
- let x2 = p2X;
- let y2 = p2Y;
- let z2 = p2Z;
- let pminx = p._aabbMinX;
- let pminy = p._aabbMinY;
- let pminz = p._aabbMinZ;
- let pmaxx = p._aabbMaxX;
- let pmaxy = p._aabbMaxY;
- let pmaxz = p._aabbMaxZ;
- let tmp;
- if(pminx > (x1 > x2 ? x1 : x2) || pmaxx < (x1 < x2 ? x1 : x2) || pminy > (y1 > y2 ? y1 : y2) || pmaxy < (y1 < y2 ? y1 : y2) || pminz > (z1 > z2 ? z1 : z2) || pmaxz < (z1 < z2 ? z1 : z2)) {
- tmp = false;
- } else {
- let dx = x2 - x1;
- let dy = y2 - y1;
- let dz = z2 - z1;
- let adx = dx < 0 ? -dx : dx;
- let ady = dy < 0 ? -dy : dy;
- let adz = dz < 0 ? -dz : dz;
- let pextx = (pmaxx - pminx) * 0.5;
- let pexty = (pmaxy - pminy) * 0.5;
- let pextz = (pmaxz - pminz) * 0.5;
- let cpx = x1 - (pmaxx + pminx) * 0.5;
- let cpy = y1 - (pmaxy + pminy) * 0.5;
- let cpz = z1 - (pmaxz + pminz) * 0.5;
- let tmp1;
- let tmp2;
- let x = cpy * dz - cpz * dy;
- if(!((x < 0 ? -x : x) - (pexty * adz + pextz * ady) > 0)) {
- let x = cpz * dx - cpx * dz;
- tmp2 = (x < 0 ? -x : x) - (pextz * adx + pextx * adz) > 0;
- } else {
- tmp2 = true;
- }
- if(!tmp2) {
- let x = cpx * dy - cpy * dx;
- tmp1 = (x < 0 ? -x : x) - (pextx * ady + pexty * adx) > 0;
- } else {
- tmp1 = true;
- }
- tmp = tmp1 ? false : true;
- }
- if(tmp) {
- callback.process(p);
- }
- p = n;
- }
- }
- convexCast(convex,begin,translation,callback) {
- let p = this._proxyList;
- while(p != null) {
- let n = p._next;
- let v = this._aabb.min;
- v.x = p._aabbMinX;
- v.y = p._aabbMinY;
- v.z = p._aabbMinZ;
- let v1 = this._aabb.max;
- v1.x = p._aabbMaxX;
- v1.y = p._aabbMaxY;
- v1.z = p._aabbMaxZ;
- this._convexSweep.init(convex,begin,translation);
- let gjkEpa = oimo.collision.narrowphase.detector.gjkepa.GjkEpa.instance;
- if(gjkEpa.computeClosestPointsImpl(this._convexSweep,this._aabb,begin,this.identity,null,false) == 0 && gjkEpa.distance <= 0) {
- callback.process(p);
- }
- p = n;
- }
- }
- aabbTest(aabb,callback) {
- let p = this._proxyList;
- while(p != null) {
- let n = p._next;
- if(aabb._minX < p._aabbMaxX && aabb._maxX > p._aabbMinX && aabb._minY < p._aabbMaxY && aabb._maxY > p._aabbMinY && aabb._minZ < p._aabbMaxZ && aabb._maxZ > p._aabbMinZ) {
- callback.process(p);
- }
- p = n;
- }
- }
- }
- if(!oimo.collision.broadphase.bvh) oimo.collision.broadphase.bvh = {};
- oimo.collision.broadphase.bvh.BvhBroadPhase = class oimo_collision_broadphase_bvh_BvhBroadPhase extends oimo.collision.broadphase.BroadPhase {
- constructor() {
- super(2);
- this._incremental = true;
- this._tree = new oimo.collision.broadphase.bvh.BvhTree();
- this.movedProxies = new Array(1024);
- this.numMovedProxies = 0;
- }
- collide(n1,n2) {
- this._testCount++;
- let l1 = n1._height == 0;
- let l2 = n2._height == 0;
- if(n1 == n2) {
- if(l1) {
- return;
- }
- this.collide(n1._children[0],n2);
- this.collide(n1._children[1],n2);
- return;
- }
- if(!(n1._aabbMinX < n2._aabbMaxX && n1._aabbMaxX > n2._aabbMinX && n1._aabbMinY < n2._aabbMaxY && n1._aabbMaxY > n2._aabbMinY && n1._aabbMinZ < n2._aabbMaxZ && n1._aabbMaxZ > n2._aabbMinZ)) {
- return;
- }
- if(l1 && l2) {
- let first = this._proxyPairPool;
- if(first != null) {
- this._proxyPairPool = first._next;
- first._next = null;
- } else {
- first = new oimo.collision.broadphase.ProxyPair();
- }
- let pp = first;
- if(this._proxyPairList == null) {
- this._proxyPairList = pp;
- } else {
- pp._next = this._proxyPairList;
- this._proxyPairList = pp;
- }
- pp._p1 = n1._proxy;
- pp._p2 = n2._proxy;
- return;
- }
- if(l2 || n1._height > n2._height) {
- this.collide(n1._children[0],n2);
- this.collide(n1._children[1],n2);
- } else {
- this.collide(n2._children[0],n1);
- this.collide(n2._children[1],n1);
- }
- }
- rayCastRecursive(node,_p1X,_p1Y,_p1Z,_p2X,_p2Y,_p2Z,callback) {
- let x1 = _p1X;
- let y1 = _p1Y;
- let z1 = _p1Z;
- let x2 = _p2X;
- let y2 = _p2Y;
- let z2 = _p2Z;
- let pminx = node._aabbMinX;
- let pminy = node._aabbMinY;
- let pminz = node._aabbMinZ;
- let pmaxx = node._aabbMaxX;
- let pmaxy = node._aabbMaxY;
- let pmaxz = node._aabbMaxZ;
- let tmp;
- if(pminx > (x1 > x2 ? x1 : x2) || pmaxx < (x1 < x2 ? x1 : x2) || pminy > (y1 > y2 ? y1 : y2) || pmaxy < (y1 < y2 ? y1 : y2) || pminz > (z1 > z2 ? z1 : z2) || pmaxz < (z1 < z2 ? z1 : z2)) {
- tmp = false;
- } else {
- let dx = x2 - x1;
- let dy = y2 - y1;
- let dz = z2 - z1;
- let adx = dx < 0 ? -dx : dx;
- let ady = dy < 0 ? -dy : dy;
- let adz = dz < 0 ? -dz : dz;
- let pextx = (pmaxx - pminx) * 0.5;
- let pexty = (pmaxy - pminy) * 0.5;
- let pextz = (pmaxz - pminz) * 0.5;
- let cpx = x1 - (pmaxx + pminx) * 0.5;
- let cpy = y1 - (pmaxy + pminy) * 0.5;
- let cpz = z1 - (pmaxz + pminz) * 0.5;
- let tmp1;
- let tmp2;
- let x = cpy * dz - cpz * dy;
- if(!((x < 0 ? -x : x) - (pexty * adz + pextz * ady) > 0)) {
- let x = cpz * dx - cpx * dz;
- tmp2 = (x < 0 ? -x : x) - (pextz * adx + pextx * adz) > 0;
- } else {
- tmp2 = true;
- }
- if(!tmp2) {
- let x = cpx * dy - cpy * dx;
- tmp1 = (x < 0 ? -x : x) - (pextx * ady + pexty * adx) > 0;
- } else {
- tmp1 = true;
- }
- tmp = tmp1 ? false : true;
- }
- if(!tmp) {
- return;
- }
- if(node._height == 0) {
- callback.process(node._proxy);
- return;
- }
- this.rayCastRecursive(node._children[0],_p1X,_p1Y,_p1Z,_p2X,_p2Y,_p2Z,callback);
- this.rayCastRecursive(node._children[1],_p1X,_p1Y,_p1Z,_p2X,_p2Y,_p2Z,callback);
- }
- convexCastRecursive(node,convex,begin,translation,callback) {
- let v = this._aabb.min;
- v.x = node._aabbMinX;
- v.y = node._aabbMinY;
- v.z = node._aabbMinZ;
- let v1 = this._aabb.max;
- v1.x = node._aabbMaxX;
- v1.y = node._aabbMaxY;
- v1.z = node._aabbMaxZ;
- this._convexSweep.init(convex,begin,translation);
- let gjkEpa = oimo.collision.narrowphase.detector.gjkepa.GjkEpa.instance;
- if(!(gjkEpa.computeClosestPointsImpl(this._convexSweep,this._aabb,begin,this.identity,null,false) == 0 && gjkEpa.distance <= 0)) {
- return;
- }
- if(node._height == 0) {
- callback.process(node._proxy);
- return;
- }
- this.convexCastRecursive(node._children[0],convex,begin,translation,callback);
- this.convexCastRecursive(node._children[1],convex,begin,translation,callback);
- }
- aabbTestRecursive(node,aabb,callback) {
- if(!(node._aabbMinX < aabb._maxX && node._aabbMaxX > aabb._minX && node._aabbMinY < aabb._maxY && node._aabbMaxY > aabb._minY && node._aabbMinZ < aabb._maxZ && node._aabbMaxZ > aabb._minZ)) {
- return;
- }
- if(node._height == 0) {
- callback.process(node._proxy);
- return;
- }
- this.aabbTestRecursive(node._children[0],aabb,callback);
- this.aabbTestRecursive(node._children[1],aabb,callback);
- }
- createProxy(userData,aabb) {
- let p = new oimo.collision.broadphase.bvh.BvhProxy(userData,this._idCount++);
- this._numProxies++;
- if(this._proxyList == null) {
- this._proxyList = p;
- this._proxyListLast = p;
- } else {
- this._proxyListLast._next = p;
- p._prev = this._proxyListLast;
- this._proxyListLast = p;
- }
- p._aabbMinX = aabb._minX;
- p._aabbMinY = aabb._minY;
- p._aabbMinZ = aabb._minZ;
- p._aabbMaxX = aabb._maxX;
- p._aabbMaxY = aabb._maxY;
- p._aabbMaxZ = aabb._maxZ;
- let padding = oimo.common.Setting.bvhProxyPadding;
- p._aabbMinX -= padding;
- p._aabbMinY -= padding;
- p._aabbMinZ -= padding;
- p._aabbMaxX += padding;
- p._aabbMaxY += padding;
- p._aabbMaxZ += padding;
- let _this = this._tree;
- let first = _this._nodePool;
- if(first != null) {
- _this._nodePool = first._next;
- first._next = null;
- } else {
- first = new oimo.collision.broadphase.bvh.BvhNode();
- }
- let leaf = first;
- leaf._proxy = p;
- p._leaf = leaf;
- leaf._aabbMinX = p._aabbMinX;
- leaf._aabbMinY = p._aabbMinY;
- leaf._aabbMinZ = p._aabbMinZ;
- leaf._aabbMaxX = p._aabbMaxX;
- leaf._aabbMaxY = p._aabbMaxY;
- leaf._aabbMaxZ = p._aabbMaxZ;
- _this._numLeaves++;
- if(_this.leafList == null) {
- _this.leafList = leaf;
- _this.leafListLast = leaf;
- } else {
- _this.leafListLast._nextLeaf = leaf;
- leaf._prevLeaf = _this.leafListLast;
- _this.leafListLast = leaf;
- }
- if(_this._root == null) {
- _this._root = leaf;
- } else {
- let sibling = _this._root;
- while(sibling._height > 0) {
- let nextStep = _this._strategy._decideInsertion(sibling,leaf);
- if(nextStep == -1) {
- break;
- } else {
- sibling = sibling._children[nextStep];
- }
- }
- let parent = sibling._parent;
- let first = _this._nodePool;
- if(first != null) {
- _this._nodePool = first._next;
- first._next = null;
- } else {
- first = new oimo.collision.broadphase.bvh.BvhNode();
- }
- let node = first;
- if(parent == null) {
- _this._root = node;
- } else {
- let index = sibling._childIndex;
- parent._children[index] = node;
- node._parent = parent;
- node._childIndex = index;
- }
- let index = sibling._childIndex;
- node._children[index] = sibling;
- sibling._parent = node;
- sibling._childIndex = index;
- let index1 = sibling._childIndex ^ 1;
- node._children[index1] = leaf;
- leaf._parent = node;
- leaf._childIndex = index1;
- while(node != null) {
- if(_this._strategy._balancingEnabled) {
- if(node._height >= 2) {
- let p = node._parent;
- let l = node._children[0];
- let r = node._children[1];
- let balance = l._height - r._height;
- let nodeIndex = node._childIndex;
- if(balance > 1) {
- let ll = l._children[0];
- let lr = l._children[1];
- if(ll._height > lr._height) {
- l._children[1] = node;
- node._parent = l;
- node._childIndex = 1;
- node._children[0] = lr;
- lr._parent = node;
- lr._childIndex = 0;
- let c1 = l._children[0];
- let c2 = l._children[1];
- l._aabbMinX = c1._aabbMinX < c2._aabbMinX ? c1._aabbMinX : c2._aabbMinX;
- l._aabbMinY = c1._aabbMinY < c2._aabbMinY ? c1._aabbMinY : c2._aabbMinY;
- l._aabbMinZ = c1._aabbMinZ < c2._aabbMinZ ? c1._aabbMinZ : c2._aabbMinZ;
- l._aabbMaxX = c1._aabbMaxX > c2._aabbMaxX ? c1._aabbMaxX : c2._aabbMaxX;
- l._aabbMaxY = c1._aabbMaxY > c2._aabbMaxY ? c1._aabbMaxY : c2._aabbMaxY;
- l._aabbMaxZ = c1._aabbMaxZ > c2._aabbMaxZ ? c1._aabbMaxZ : c2._aabbMaxZ;
- let h1 = l._children[0]._height;
- let h2 = l._children[1]._height;
- l._height = (h1 > h2 ? h1 : h2) + 1;
- let c11 = node._children[0];
- let c21 = node._children[1];
- node._aabbMinX = c11._aabbMinX < c21._aabbMinX ? c11._aabbMinX : c21._aabbMinX;
- node._aabbMinY = c11._aabbMinY < c21._aabbMinY ? c11._aabbMinY : c21._aabbMinY;
- node._aabbMinZ = c11._aabbMinZ < c21._aabbMinZ ? c11._aabbMinZ : c21._aabbMinZ;
- node._aabbMaxX = c11._aabbMaxX > c21._aabbMaxX ? c11._aabbMaxX : c21._aabbMaxX;
- node._aabbMaxY = c11._aabbMaxY > c21._aabbMaxY ? c11._aabbMaxY : c21._aabbMaxY;
- node._aabbMaxZ = c11._aabbMaxZ > c21._aabbMaxZ ? c11._aabbMaxZ : c21._aabbMaxZ;
- let h11 = node._children[0]._height;
- let h21 = node._children[1]._height;
- node._height = (h11 > h21 ? h11 : h21) + 1;
- } else {
- l._children[0] = node;
- node._parent = l;
- node._childIndex = 0;
- node._children[0] = ll;
- ll._parent = node;
- ll._childIndex = 0;
- let c1 = l._children[0];
- let c2 = l._children[1];
- l._aabbMinX = c1._aabbMinX < c2._aabbMinX ? c1._aabbMinX : c2._aabbMinX;
- l._aabbMinY = c1._aabbMinY < c2._aabbMinY ? c1._aabbMinY : c2._aabbMinY;
- l._aabbMinZ = c1._aabbMinZ < c2._aabbMinZ ? c1._aabbMinZ : c2._aabbMinZ;
- l._aabbMaxX = c1._aabbMaxX > c2._aabbMaxX ? c1._aabbMaxX : c2._aabbMaxX;
- l._aabbMaxY = c1._aabbMaxY > c2._aabbMaxY ? c1._aabbMaxY : c2._aabbMaxY;
- l._aabbMaxZ = c1._aabbMaxZ > c2._aabbMaxZ ? c1._aabbMaxZ : c2._aabbMaxZ;
- let h1 = l._children[0]._height;
- let h2 = l._children[1]._height;
- l._height = (h1 > h2 ? h1 : h2) + 1;
- let c11 = node._children[0];
- let c21 = node._children[1];
- node._aabbMinX = c11._aabbMinX < c21._aabbMinX ? c11._aabbMinX : c21._aabbMinX;
- node._aabbMinY = c11._aabbMinY < c21._aabbMinY ? c11._aabbMinY : c21._aabbMinY;
- node._aabbMinZ = c11._aabbMinZ < c21._aabbMinZ ? c11._aabbMinZ : c21._aabbMinZ;
- node._aabbMaxX = c11._aabbMaxX > c21._aabbMaxX ? c11._aabbMaxX : c21._aabbMaxX;
- node._aabbMaxY = c11._aabbMaxY > c21._aabbMaxY ? c11._aabbMaxY : c21._aabbMaxY;
- node._aabbMaxZ = c11._aabbMaxZ > c21._aabbMaxZ ? c11._aabbMaxZ : c21._aabbMaxZ;
- let h11 = node._children[0]._height;
- let h21 = node._children[1]._height;
- node._height = (h11 > h21 ? h11 : h21) + 1;
- }
- if(p != null) {
- p._children[nodeIndex] = l;
- l._parent = p;
- l._childIndex = nodeIndex;
- } else {
- _this._root = l;
- l._parent = null;
- }
- node = l;
- } else if(balance < -1) {
- let rl = r._children[0];
- let rr = r._children[1];
- if(rl._height > rr._height) {
- r._children[1] = node;
- node._parent = r;
- node._childIndex = 1;
- node._children[1] = rr;
- rr._parent = node;
- rr._childIndex = 1;
- let c1 = r._children[0];
- let c2 = r._children[1];
- r._aabbMinX = c1._aabbMinX < c2._aabbMinX ? c1._aabbMinX : c2._aabbMinX;
- r._aabbMinY = c1._aabbMinY < c2._aabbMinY ? c1._aabbMinY : c2._aabbMinY;
- r._aabbMinZ = c1._aabbMinZ < c2._aabbMinZ ? c1._aabbMinZ : c2._aabbMinZ;
- r._aabbMaxX = c1._aabbMaxX > c2._aabbMaxX ? c1._aabbMaxX : c2._aabbMaxX;
- r._aabbMaxY = c1._aabbMaxY > c2._aabbMaxY ? c1._aabbMaxY : c2._aabbMaxY;
- r._aabbMaxZ = c1._aabbMaxZ > c2._aabbMaxZ ? c1._aabbMaxZ : c2._aabbMaxZ;
- let h1 = r._children[0]._height;
- let h2 = r._children[1]._height;
- r._height = (h1 > h2 ? h1 : h2) + 1;
- let c11 = node._children[0];
- let c21 = node._children[1];
- node._aabbMinX = c11._aabbMinX < c21._aabbMinX ? c11._aabbMinX : c21._aabbMinX;
- node._aabbMinY = c11._aabbMinY < c21._aabbMinY ? c11._aabbMinY : c21._aabbMinY;
- node._aabbMinZ = c11._aabbMinZ < c21._aabbMinZ ? c11._aabbMinZ : c21._aabbMinZ;
- node._aabbMaxX = c11._aabbMaxX > c21._aabbMaxX ? c11._aabbMaxX : c21._aabbMaxX;
- node._aabbMaxY = c11._aabbMaxY > c21._aabbMaxY ? c11._aabbMaxY : c21._aabbMaxY;
- node._aabbMaxZ = c11._aabbMaxZ > c21._aabbMaxZ ? c11._aabbMaxZ : c21._aabbMaxZ;
- let h11 = node._children[0]._height;
- let h21 = node._children[1]._height;
- node._height = (h11 > h21 ? h11 : h21) + 1;
- } else {
- r._children[0] = node;
- node._parent = r;
- node._childIndex = 0;
- node._children[1] = rl;
- rl._parent = node;
- rl._childIndex = 1;
- let c1 = r._children[0];
- let c2 = r._children[1];
- r._aabbMinX = c1._aabbMinX < c2._aabbMinX ? c1._aabbMinX : c2._aabbMinX;
- r._aabbMinY = c1._aabbMinY < c2._aabbMinY ? c1._aabbMinY : c2._aabbMinY;
- r._aabbMinZ = c1._aabbMinZ < c2._aabbMinZ ? c1._aabbMinZ : c2._aabbMinZ;
- r._aabbMaxX = c1._aabbMaxX > c2._aabbMaxX ? c1._aabbMaxX : c2._aabbMaxX;
- r._aabbMaxY = c1._aabbMaxY > c2._aabbMaxY ? c1._aabbMaxY : c2._aabbMaxY;
- r._aabbMaxZ = c1._aabbMaxZ > c2._aabbMaxZ ? c1._aabbMaxZ : c2._aabbMaxZ;
- let h1 = r._children[0]._height;
- let h2 = r._children[1]._height;
- r._height = (h1 > h2 ? h1 : h2) + 1;
- let c11 = node._children[0];
- let c21 = node._children[1];
- node._aabbMinX = c11._aabbMinX < c21._aabbMinX ? c11._aabbMinX : c21._aabbMinX;
- node._aabbMinY = c11._aabbMinY < c21._aabbMinY ? c11._aabbMinY : c21._aabbMinY;
- node._aabbMinZ = c11._aabbMinZ < c21._aabbMinZ ? c11._aabbMinZ : c21._aabbMinZ;
- node._aabbMaxX = c11._aabbMaxX > c21._aabbMaxX ? c11._aabbMaxX : c21._aabbMaxX;
- node._aabbMaxY = c11._aabbMaxY > c21._aabbMaxY ? c11._aabbMaxY : c21._aabbMaxY;
- node._aabbMaxZ = c11._aabbMaxZ > c21._aabbMaxZ ? c11._aabbMaxZ : c21._aabbMaxZ;
- let h11 = node._children[0]._height;
- let h21 = node._children[1]._height;
- node._height = (h11 > h21 ? h11 : h21) + 1;
- }
- if(p != null) {
- p._children[nodeIndex] = r;
- r._parent = p;
- r._childIndex = nodeIndex;
- } else {
- _this._root = r;
- r._parent = null;
- }
- node = r;
- }
- }
- }
- let h1 = node._children[0]._height;
- let h2 = node._children[1]._height;
- node._height = (h1 > h2 ? h1 : h2) + 1;
- let c1 = node._children[0];
- let c2 = node._children[1];
- node._aabbMinX = c1._aabbMinX < c2._aabbMinX ? c1._aabbMinX : c2._aabbMinX;
- node._aabbMinY = c1._aabbMinY < c2._aabbMinY ? c1._aabbMinY : c2._aabbMinY;
- node._aabbMinZ = c1._aabbMinZ < c2._aabbMinZ ? c1._aabbMinZ : c2._aabbMinZ;
- node._aabbMaxX = c1._aabbMaxX > c2._aabbMaxX ? c1._aabbMaxX : c2._aabbMaxX;
- node._aabbMaxY = c1._aabbMaxY > c2._aabbMaxY ? c1._aabbMaxY : c2._aabbMaxY;
- node._aabbMaxZ = c1._aabbMaxZ > c2._aabbMaxZ ? c1._aabbMaxZ : c2._aabbMaxZ;
- node = node._parent;
- }
- }
- if(!p._moved) {
- p._moved = true;
- if(this.movedProxies.length == this.numMovedProxies) {
- let newArray = new Array(this.numMovedProxies << 1);
- let _g = 0;
- let _g1 = this.numMovedProxies;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = this.movedProxies[i];
- this.movedProxies[i] = null;
- }
- this.movedProxies = newArray;
- }
- this.movedProxies[this.numMovedProxies++] = p;
- }
- return p;
- }
- destroyProxy(proxy) {
- this._numProxies--;
- let prev = proxy._prev;
- let next = proxy._next;
- if(prev != null) {
- prev._next = next;
- }
- if(next != null) {
- next._prev = prev;
- }
- if(proxy == this._proxyList) {
- this._proxyList = this._proxyList._next;
- }
- if(proxy == this._proxyListLast) {
- this._proxyListLast = this._proxyListLast._prev;
- }
- proxy._next = null;
- proxy._prev = null;
- let bvhProxy = proxy;
- let _this = this._tree;
- let leaf = bvhProxy._leaf;
- _this._numLeaves--;
- let prev1 = leaf._prevLeaf;
- let next1 = leaf._nextLeaf;
- if(prev1 != null) {
- prev1._nextLeaf = next1;
- }
- if(next1 != null) {
- next1._prevLeaf = prev1;
- }
- if(leaf == _this.leafList) {
- _this.leafList = _this.leafList._nextLeaf;
- }
- if(leaf == _this.leafListLast) {
- _this.leafListLast = _this.leafListLast._prevLeaf;
- }
- leaf._nextLeaf = null;
- leaf._prevLeaf = null;
- if(_this._root == leaf) {
- _this._root = null;
- } else {
- let parent = leaf._parent;
- let sibling = parent._children[leaf._childIndex ^ 1];
- let grandParent = parent._parent;
- if(grandParent == null) {
- sibling._parent = null;
- sibling._childIndex = 0;
- _this._root = sibling;
- parent._next = null;
- parent._childIndex = 0;
- parent._children[0] = null;
- parent._children[1] = null;
- parent._childIndex = 0;
- parent._parent = null;
- parent._height = 0;
- parent._proxy = null;
- parent._next = _this._nodePool;
- _this._nodePool = parent;
- } else {
- sibling._parent = grandParent;
- let index = parent._childIndex;
- grandParent._children[index] = sibling;
- sibling._parent = grandParent;
- sibling._childIndex = index;
- parent._next = null;
- parent._childIndex = 0;
- parent._children[0] = null;
- parent._children[1] = null;
- parent._childIndex = 0;
- parent._parent = null;
- parent._height = 0;
- parent._proxy = null;
- parent._next = _this._nodePool;
- _this._nodePool = parent;
- let node = grandParent;
- while(node != null) {
- if(_this._strategy._balancingEnabled) {
- if(node._height >= 2) {
- let p = node._parent;
- let l = node._children[0];
- let r = node._children[1];
- let balance = l._height - r._height;
- let nodeIndex = node._childIndex;
- if(balance > 1) {
- let ll = l._children[0];
- let lr = l._children[1];
- if(ll._height > lr._height) {
- l._children[1] = node;
- node._parent = l;
- node._childIndex = 1;
- node._children[0] = lr;
- lr._parent = node;
- lr._childIndex = 0;
- let c1 = l._children[0];
- let c2 = l._children[1];
- l._aabbMinX = c1._aabbMinX < c2._aabbMinX ? c1._aabbMinX : c2._aabbMinX;
- l._aabbMinY = c1._aabbMinY < c2._aabbMinY ? c1._aabbMinY : c2._aabbMinY;
- l._aabbMinZ = c1._aabbMinZ < c2._aabbMinZ ? c1._aabbMinZ : c2._aabbMinZ;
- l._aabbMaxX = c1._aabbMaxX > c2._aabbMaxX ? c1._aabbMaxX : c2._aabbMaxX;
- l._aabbMaxY = c1._aabbMaxY > c2._aabbMaxY ? c1._aabbMaxY : c2._aabbMaxY;
- l._aabbMaxZ = c1._aabbMaxZ > c2._aabbMaxZ ? c1._aabbMaxZ : c2._aabbMaxZ;
- let h1 = l._children[0]._height;
- let h2 = l._children[1]._height;
- l._height = (h1 > h2 ? h1 : h2) + 1;
- let c11 = node._children[0];
- let c21 = node._children[1];
- node._aabbMinX = c11._aabbMinX < c21._aabbMinX ? c11._aabbMinX : c21._aabbMinX;
- node._aabbMinY = c11._aabbMinY < c21._aabbMinY ? c11._aabbMinY : c21._aabbMinY;
- node._aabbMinZ = c11._aabbMinZ < c21._aabbMinZ ? c11._aabbMinZ : c21._aabbMinZ;
- node._aabbMaxX = c11._aabbMaxX > c21._aabbMaxX ? c11._aabbMaxX : c21._aabbMaxX;
- node._aabbMaxY = c11._aabbMaxY > c21._aabbMaxY ? c11._aabbMaxY : c21._aabbMaxY;
- node._aabbMaxZ = c11._aabbMaxZ > c21._aabbMaxZ ? c11._aabbMaxZ : c21._aabbMaxZ;
- let h11 = node._children[0]._height;
- let h21 = node._children[1]._height;
- node._height = (h11 > h21 ? h11 : h21) + 1;
- } else {
- l._children[0] = node;
- node._parent = l;
- node._childIndex = 0;
- node._children[0] = ll;
- ll._parent = node;
- ll._childIndex = 0;
- let c1 = l._children[0];
- let c2 = l._children[1];
- l._aabbMinX = c1._aabbMinX < c2._aabbMinX ? c1._aabbMinX : c2._aabbMinX;
- l._aabbMinY = c1._aabbMinY < c2._aabbMinY ? c1._aabbMinY : c2._aabbMinY;
- l._aabbMinZ = c1._aabbMinZ < c2._aabbMinZ ? c1._aabbMinZ : c2._aabbMinZ;
- l._aabbMaxX = c1._aabbMaxX > c2._aabbMaxX ? c1._aabbMaxX : c2._aabbMaxX;
- l._aabbMaxY = c1._aabbMaxY > c2._aabbMaxY ? c1._aabbMaxY : c2._aabbMaxY;
- l._aabbMaxZ = c1._aabbMaxZ > c2._aabbMaxZ ? c1._aabbMaxZ : c2._aabbMaxZ;
- let h1 = l._children[0]._height;
- let h2 = l._children[1]._height;
- l._height = (h1 > h2 ? h1 : h2) + 1;
- let c11 = node._children[0];
- let c21 = node._children[1];
- node._aabbMinX = c11._aabbMinX < c21._aabbMinX ? c11._aabbMinX : c21._aabbMinX;
- node._aabbMinY = c11._aabbMinY < c21._aabbMinY ? c11._aabbMinY : c21._aabbMinY;
- node._aabbMinZ = c11._aabbMinZ < c21._aabbMinZ ? c11._aabbMinZ : c21._aabbMinZ;
- node._aabbMaxX = c11._aabbMaxX > c21._aabbMaxX ? c11._aabbMaxX : c21._aabbMaxX;
- node._aabbMaxY = c11._aabbMaxY > c21._aabbMaxY ? c11._aabbMaxY : c21._aabbMaxY;
- node._aabbMaxZ = c11._aabbMaxZ > c21._aabbMaxZ ? c11._aabbMaxZ : c21._aabbMaxZ;
- let h11 = node._children[0]._height;
- let h21 = node._children[1]._height;
- node._height = (h11 > h21 ? h11 : h21) + 1;
- }
- if(p != null) {
- p._children[nodeIndex] = l;
- l._parent = p;
- l._childIndex = nodeIndex;
- } else {
- _this._root = l;
- l._parent = null;
- }
- node = l;
- } else if(balance < -1) {
- let rl = r._children[0];
- let rr = r._children[1];
- if(rl._height > rr._height) {
- r._children[1] = node;
- node._parent = r;
- node._childIndex = 1;
- node._children[1] = rr;
- rr._parent = node;
- rr._childIndex = 1;
- let c1 = r._children[0];
- let c2 = r._children[1];
- r._aabbMinX = c1._aabbMinX < c2._aabbMinX ? c1._aabbMinX : c2._aabbMinX;
- r._aabbMinY = c1._aabbMinY < c2._aabbMinY ? c1._aabbMinY : c2._aabbMinY;
- r._aabbMinZ = c1._aabbMinZ < c2._aabbMinZ ? c1._aabbMinZ : c2._aabbMinZ;
- r._aabbMaxX = c1._aabbMaxX > c2._aabbMaxX ? c1._aabbMaxX : c2._aabbMaxX;
- r._aabbMaxY = c1._aabbMaxY > c2._aabbMaxY ? c1._aabbMaxY : c2._aabbMaxY;
- r._aabbMaxZ = c1._aabbMaxZ > c2._aabbMaxZ ? c1._aabbMaxZ : c2._aabbMaxZ;
- let h1 = r._children[0]._height;
- let h2 = r._children[1]._height;
- r._height = (h1 > h2 ? h1 : h2) + 1;
- let c11 = node._children[0];
- let c21 = node._children[1];
- node._aabbMinX = c11._aabbMinX < c21._aabbMinX ? c11._aabbMinX : c21._aabbMinX;
- node._aabbMinY = c11._aabbMinY < c21._aabbMinY ? c11._aabbMinY : c21._aabbMinY;
- node._aabbMinZ = c11._aabbMinZ < c21._aabbMinZ ? c11._aabbMinZ : c21._aabbMinZ;
- node._aabbMaxX = c11._aabbMaxX > c21._aabbMaxX ? c11._aabbMaxX : c21._aabbMaxX;
- node._aabbMaxY = c11._aabbMaxY > c21._aabbMaxY ? c11._aabbMaxY : c21._aabbMaxY;
- node._aabbMaxZ = c11._aabbMaxZ > c21._aabbMaxZ ? c11._aabbMaxZ : c21._aabbMaxZ;
- let h11 = node._children[0]._height;
- let h21 = node._children[1]._height;
- node._height = (h11 > h21 ? h11 : h21) + 1;
- } else {
- r._children[0] = node;
- node._parent = r;
- node._childIndex = 0;
- node._children[1] = rl;
- rl._parent = node;
- rl._childIndex = 1;
- let c1 = r._children[0];
- let c2 = r._children[1];
- r._aabbMinX = c1._aabbMinX < c2._aabbMinX ? c1._aabbMinX : c2._aabbMinX;
- r._aabbMinY = c1._aabbMinY < c2._aabbMinY ? c1._aabbMinY : c2._aabbMinY;
- r._aabbMinZ = c1._aabbMinZ < c2._aabbMinZ ? c1._aabbMinZ : c2._aabbMinZ;
- r._aabbMaxX = c1._aabbMaxX > c2._aabbMaxX ? c1._aabbMaxX : c2._aabbMaxX;
- r._aabbMaxY = c1._aabbMaxY > c2._aabbMaxY ? c1._aabbMaxY : c2._aabbMaxY;
- r._aabbMaxZ = c1._aabbMaxZ > c2._aabbMaxZ ? c1._aabbMaxZ : c2._aabbMaxZ;
- let h1 = r._children[0]._height;
- let h2 = r._children[1]._height;
- r._height = (h1 > h2 ? h1 : h2) + 1;
- let c11 = node._children[0];
- let c21 = node._children[1];
- node._aabbMinX = c11._aabbMinX < c21._aabbMinX ? c11._aabbMinX : c21._aabbMinX;
- node._aabbMinY = c11._aabbMinY < c21._aabbMinY ? c11._aabbMinY : c21._aabbMinY;
- node._aabbMinZ = c11._aabbMinZ < c21._aabbMinZ ? c11._aabbMinZ : c21._aabbMinZ;
- node._aabbMaxX = c11._aabbMaxX > c21._aabbMaxX ? c11._aabbMaxX : c21._aabbMaxX;
- node._aabbMaxY = c11._aabbMaxY > c21._aabbMaxY ? c11._aabbMaxY : c21._aabbMaxY;
- node._aabbMaxZ = c11._aabbMaxZ > c21._aabbMaxZ ? c11._aabbMaxZ : c21._aabbMaxZ;
- let h11 = node._children[0]._height;
- let h21 = node._children[1]._height;
- node._height = (h11 > h21 ? h11 : h21) + 1;
- }
- if(p != null) {
- p._children[nodeIndex] = r;
- r._parent = p;
- r._childIndex = nodeIndex;
- } else {
- _this._root = r;
- r._parent = null;
- }
- node = r;
- }
- }
- }
- let h1 = node._children[0]._height;
- let h2 = node._children[1]._height;
- node._height = (h1 > h2 ? h1 : h2) + 1;
- let c1 = node._children[0];
- let c2 = node._children[1];
- node._aabbMinX = c1._aabbMinX < c2._aabbMinX ? c1._aabbMinX : c2._aabbMinX;
- node._aabbMinY = c1._aabbMinY < c2._aabbMinY ? c1._aabbMinY : c2._aabbMinY;
- node._aabbMinZ = c1._aabbMinZ < c2._aabbMinZ ? c1._aabbMinZ : c2._aabbMinZ;
- node._aabbMaxX = c1._aabbMaxX > c2._aabbMaxX ? c1._aabbMaxX : c2._aabbMaxX;
- node._aabbMaxY = c1._aabbMaxY > c2._aabbMaxY ? c1._aabbMaxY : c2._aabbMaxY;
- node._aabbMaxZ = c1._aabbMaxZ > c2._aabbMaxZ ? c1._aabbMaxZ : c2._aabbMaxZ;
- node = node._parent;
- }
- }
- }
- bvhProxy._leaf = null;
- leaf._next = null;
- leaf._childIndex = 0;
- leaf._children[0] = null;
- leaf._children[1] = null;
- leaf._childIndex = 0;
- leaf._parent = null;
- leaf._height = 0;
- leaf._proxy = null;
- leaf._next = _this._nodePool;
- _this._nodePool = leaf;
- bvhProxy.userData = null;
- bvhProxy._next = null;
- bvhProxy._prev = null;
- if(bvhProxy._moved) {
- bvhProxy._moved = false;
- }
- }
- moveProxy(proxy,aabb,displacement) {
- let p = proxy;
- if(p._aabbMinX <= aabb._minX && p._aabbMaxX >= aabb._maxX && p._aabbMinY <= aabb._minY && p._aabbMaxY >= aabb._maxY && p._aabbMinZ <= aabb._minZ && p._aabbMaxZ >= aabb._maxZ) {
- return;
- }
- p._aabbMinX = aabb._minX;
- p._aabbMinY = aabb._minY;
- p._aabbMinZ = aabb._minZ;
- p._aabbMaxX = aabb._maxX;
- p._aabbMaxY = aabb._maxY;
- p._aabbMaxZ = aabb._maxZ;
- let padding = oimo.common.Setting.bvhProxyPadding;
- p._aabbMinX -= padding;
- p._aabbMinY -= padding;
- p._aabbMinZ -= padding;
- p._aabbMaxX += padding;
- p._aabbMaxY += padding;
- p._aabbMaxZ += padding;
- if(displacement != null) {
- let dX;
- let dY;
- let dZ;
- let zeroX;
- let zeroY;
- let zeroZ;
- let addToMinX;
- let addToMinY;
- let addToMinZ;
- let addToMaxX;
- let addToMaxY;
- let addToMaxZ;
- zeroX = 0;
- zeroY = 0;
- zeroZ = 0;
- dX = displacement.x;
- dY = displacement.y;
- dZ = displacement.z;
- addToMinX = zeroX < dX ? zeroX : dX;
- addToMinY = zeroY < dY ? zeroY : dY;
- addToMinZ = zeroZ < dZ ? zeroZ : dZ;
- addToMaxX = zeroX > dX ? zeroX : dX;
- addToMaxY = zeroY > dY ? zeroY : dY;
- addToMaxZ = zeroZ > dZ ? zeroZ : dZ;
- p._aabbMinX += addToMinX;
- p._aabbMinY += addToMinY;
- p._aabbMinZ += addToMinZ;
- p._aabbMaxX += addToMaxX;
- p._aabbMaxY += addToMaxY;
- p._aabbMaxZ += addToMaxZ;
- }
- if(!p._moved) {
- p._moved = true;
- if(this.movedProxies.length == this.numMovedProxies) {
- let newArray = new Array(this.numMovedProxies << 1);
- let _g = 0;
- let _g1 = this.numMovedProxies;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = this.movedProxies[i];
- this.movedProxies[i] = null;
- }
- this.movedProxies = newArray;
- }
- this.movedProxies[this.numMovedProxies++] = p;
- }
- }
- collectPairs() {
- let p = this._proxyPairList;
- if(p != null) {
- while(true) {
- p._p1 = null;
- p._p2 = null;
- p = p._next;
- if(!(p != null)) {
- break;
- }
- }
- this._proxyPairList._next = this._proxyPairPool;
- this._proxyPairPool = this._proxyPairList;
- this._proxyPairList = null;
- }
- this._testCount = 0;
- if(this._numProxies < 2) {
- return;
- }
- let incrementalCollision = this.numMovedProxies / this._numProxies < oimo.common.Setting.bvhIncrementalCollisionThreshold;
- let _g = 0;
- let _g1 = this.numMovedProxies;
- while(_g < _g1) {
- let i = _g++;
- let p = this.movedProxies[i];
- if(p._moved) {
- let _this = this._tree;
- let leaf = p._leaf;
- _this._numLeaves--;
- let prev = leaf._prevLeaf;
- let next = leaf._nextLeaf;
- if(prev != null) {
- prev._nextLeaf = next;
- }
- if(next != null) {
- next._prevLeaf = prev;
- }
- if(leaf == _this.leafList) {
- _this.leafList = _this.leafList._nextLeaf;
- }
- if(leaf == _this.leafListLast) {
- _this.leafListLast = _this.leafListLast._prevLeaf;
- }
- leaf._nextLeaf = null;
- leaf._prevLeaf = null;
- if(_this._root == leaf) {
- _this._root = null;
- } else {
- let parent = leaf._parent;
- let sibling = parent._children[leaf._childIndex ^ 1];
- let grandParent = parent._parent;
- if(grandParent == null) {
- sibling._parent = null;
- sibling._childIndex = 0;
- _this._root = sibling;
- parent._next = null;
- parent._childIndex = 0;
- parent._children[0] = null;
- parent._children[1] = null;
- parent._childIndex = 0;
- parent._parent = null;
- parent._height = 0;
- parent._proxy = null;
- parent._next = _this._nodePool;
- _this._nodePool = parent;
- } else {
- sibling._parent = grandParent;
- let index = parent._childIndex;
- grandParent._children[index] = sibling;
- sibling._parent = grandParent;
- sibling._childIndex = index;
- parent._next = null;
- parent._childIndex = 0;
- parent._children[0] = null;
- parent._children[1] = null;
- parent._childIndex = 0;
- parent._parent = null;
- parent._height = 0;
- parent._proxy = null;
- parent._next = _this._nodePool;
- _this._nodePool = parent;
- let node = grandParent;
- while(node != null) {
- if(_this._strategy._balancingEnabled) {
- if(node._height >= 2) {
- let p = node._parent;
- let l = node._children[0];
- let r = node._children[1];
- let balance = l._height - r._height;
- let nodeIndex = node._childIndex;
- if(balance > 1) {
- let ll = l._children[0];
- let lr = l._children[1];
- if(ll._height > lr._height) {
- l._children[1] = node;
- node._parent = l;
- node._childIndex = 1;
- node._children[0] = lr;
- lr._parent = node;
- lr._childIndex = 0;
- let c1 = l._children[0];
- let c2 = l._children[1];
- l._aabbMinX = c1._aabbMinX < c2._aabbMinX ? c1._aabbMinX : c2._aabbMinX;
- l._aabbMinY = c1._aabbMinY < c2._aabbMinY ? c1._aabbMinY : c2._aabbMinY;
- l._aabbMinZ = c1._aabbMinZ < c2._aabbMinZ ? c1._aabbMinZ : c2._aabbMinZ;
- l._aabbMaxX = c1._aabbMaxX > c2._aabbMaxX ? c1._aabbMaxX : c2._aabbMaxX;
- l._aabbMaxY = c1._aabbMaxY > c2._aabbMaxY ? c1._aabbMaxY : c2._aabbMaxY;
- l._aabbMaxZ = c1._aabbMaxZ > c2._aabbMaxZ ? c1._aabbMaxZ : c2._aabbMaxZ;
- let h1 = l._children[0]._height;
- let h2 = l._children[1]._height;
- l._height = (h1 > h2 ? h1 : h2) + 1;
- let c11 = node._children[0];
- let c21 = node._children[1];
- node._aabbMinX = c11._aabbMinX < c21._aabbMinX ? c11._aabbMinX : c21._aabbMinX;
- node._aabbMinY = c11._aabbMinY < c21._aabbMinY ? c11._aabbMinY : c21._aabbMinY;
- node._aabbMinZ = c11._aabbMinZ < c21._aabbMinZ ? c11._aabbMinZ : c21._aabbMinZ;
- node._aabbMaxX = c11._aabbMaxX > c21._aabbMaxX ? c11._aabbMaxX : c21._aabbMaxX;
- node._aabbMaxY = c11._aabbMaxY > c21._aabbMaxY ? c11._aabbMaxY : c21._aabbMaxY;
- node._aabbMaxZ = c11._aabbMaxZ > c21._aabbMaxZ ? c11._aabbMaxZ : c21._aabbMaxZ;
- let h11 = node._children[0]._height;
- let h21 = node._children[1]._height;
- node._height = (h11 > h21 ? h11 : h21) + 1;
- } else {
- l._children[0] = node;
- node._parent = l;
- node._childIndex = 0;
- node._children[0] = ll;
- ll._parent = node;
- ll._childIndex = 0;
- let c1 = l._children[0];
- let c2 = l._children[1];
- l._aabbMinX = c1._aabbMinX < c2._aabbMinX ? c1._aabbMinX : c2._aabbMinX;
- l._aabbMinY = c1._aabbMinY < c2._aabbMinY ? c1._aabbMinY : c2._aabbMinY;
- l._aabbMinZ = c1._aabbMinZ < c2._aabbMinZ ? c1._aabbMinZ : c2._aabbMinZ;
- l._aabbMaxX = c1._aabbMaxX > c2._aabbMaxX ? c1._aabbMaxX : c2._aabbMaxX;
- l._aabbMaxY = c1._aabbMaxY > c2._aabbMaxY ? c1._aabbMaxY : c2._aabbMaxY;
- l._aabbMaxZ = c1._aabbMaxZ > c2._aabbMaxZ ? c1._aabbMaxZ : c2._aabbMaxZ;
- let h1 = l._children[0]._height;
- let h2 = l._children[1]._height;
- l._height = (h1 > h2 ? h1 : h2) + 1;
- let c11 = node._children[0];
- let c21 = node._children[1];
- node._aabbMinX = c11._aabbMinX < c21._aabbMinX ? c11._aabbMinX : c21._aabbMinX;
- node._aabbMinY = c11._aabbMinY < c21._aabbMinY ? c11._aabbMinY : c21._aabbMinY;
- node._aabbMinZ = c11._aabbMinZ < c21._aabbMinZ ? c11._aabbMinZ : c21._aabbMinZ;
- node._aabbMaxX = c11._aabbMaxX > c21._aabbMaxX ? c11._aabbMaxX : c21._aabbMaxX;
- node._aabbMaxY = c11._aabbMaxY > c21._aabbMaxY ? c11._aabbMaxY : c21._aabbMaxY;
- node._aabbMaxZ = c11._aabbMaxZ > c21._aabbMaxZ ? c11._aabbMaxZ : c21._aabbMaxZ;
- let h11 = node._children[0]._height;
- let h21 = node._children[1]._height;
- node._height = (h11 > h21 ? h11 : h21) + 1;
- }
- if(p != null) {
- p._children[nodeIndex] = l;
- l._parent = p;
- l._childIndex = nodeIndex;
- } else {
- _this._root = l;
- l._parent = null;
- }
- node = l;
- } else if(balance < -1) {
- let rl = r._children[0];
- let rr = r._children[1];
- if(rl._height > rr._height) {
- r._children[1] = node;
- node._parent = r;
- node._childIndex = 1;
- node._children[1] = rr;
- rr._parent = node;
- rr._childIndex = 1;
- let c1 = r._children[0];
- let c2 = r._children[1];
- r._aabbMinX = c1._aabbMinX < c2._aabbMinX ? c1._aabbMinX : c2._aabbMinX;
- r._aabbMinY = c1._aabbMinY < c2._aabbMinY ? c1._aabbMinY : c2._aabbMinY;
- r._aabbMinZ = c1._aabbMinZ < c2._aabbMinZ ? c1._aabbMinZ : c2._aabbMinZ;
- r._aabbMaxX = c1._aabbMaxX > c2._aabbMaxX ? c1._aabbMaxX : c2._aabbMaxX;
- r._aabbMaxY = c1._aabbMaxY > c2._aabbMaxY ? c1._aabbMaxY : c2._aabbMaxY;
- r._aabbMaxZ = c1._aabbMaxZ > c2._aabbMaxZ ? c1._aabbMaxZ : c2._aabbMaxZ;
- let h1 = r._children[0]._height;
- let h2 = r._children[1]._height;
- r._height = (h1 > h2 ? h1 : h2) + 1;
- let c11 = node._children[0];
- let c21 = node._children[1];
- node._aabbMinX = c11._aabbMinX < c21._aabbMinX ? c11._aabbMinX : c21._aabbMinX;
- node._aabbMinY = c11._aabbMinY < c21._aabbMinY ? c11._aabbMinY : c21._aabbMinY;
- node._aabbMinZ = c11._aabbMinZ < c21._aabbMinZ ? c11._aabbMinZ : c21._aabbMinZ;
- node._aabbMaxX = c11._aabbMaxX > c21._aabbMaxX ? c11._aabbMaxX : c21._aabbMaxX;
- node._aabbMaxY = c11._aabbMaxY > c21._aabbMaxY ? c11._aabbMaxY : c21._aabbMaxY;
- node._aabbMaxZ = c11._aabbMaxZ > c21._aabbMaxZ ? c11._aabbMaxZ : c21._aabbMaxZ;
- let h11 = node._children[0]._height;
- let h21 = node._children[1]._height;
- node._height = (h11 > h21 ? h11 : h21) + 1;
- } else {
- r._children[0] = node;
- node._parent = r;
- node._childIndex = 0;
- node._children[1] = rl;
- rl._parent = node;
- rl._childIndex = 1;
- let c1 = r._children[0];
- let c2 = r._children[1];
- r._aabbMinX = c1._aabbMinX < c2._aabbMinX ? c1._aabbMinX : c2._aabbMinX;
- r._aabbMinY = c1._aabbMinY < c2._aabbMinY ? c1._aabbMinY : c2._aabbMinY;
- r._aabbMinZ = c1._aabbMinZ < c2._aabbMinZ ? c1._aabbMinZ : c2._aabbMinZ;
- r._aabbMaxX = c1._aabbMaxX > c2._aabbMaxX ? c1._aabbMaxX : c2._aabbMaxX;
- r._aabbMaxY = c1._aabbMaxY > c2._aabbMaxY ? c1._aabbMaxY : c2._aabbMaxY;
- r._aabbMaxZ = c1._aabbMaxZ > c2._aabbMaxZ ? c1._aabbMaxZ : c2._aabbMaxZ;
- let h1 = r._children[0]._height;
- let h2 = r._children[1]._height;
- r._height = (h1 > h2 ? h1 : h2) + 1;
- let c11 = node._children[0];
- let c21 = node._children[1];
- node._aabbMinX = c11._aabbMinX < c21._aabbMinX ? c11._aabbMinX : c21._aabbMinX;
- node._aabbMinY = c11._aabbMinY < c21._aabbMinY ? c11._aabbMinY : c21._aabbMinY;
- node._aabbMinZ = c11._aabbMinZ < c21._aabbMinZ ? c11._aabbMinZ : c21._aabbMinZ;
- node._aabbMaxX = c11._aabbMaxX > c21._aabbMaxX ? c11._aabbMaxX : c21._aabbMaxX;
- node._aabbMaxY = c11._aabbMaxY > c21._aabbMaxY ? c11._aabbMaxY : c21._aabbMaxY;
- node._aabbMaxZ = c11._aabbMaxZ > c21._aabbMaxZ ? c11._aabbMaxZ : c21._aabbMaxZ;
- let h11 = node._children[0]._height;
- let h21 = node._children[1]._height;
- node._height = (h11 > h21 ? h11 : h21) + 1;
- }
- if(p != null) {
- p._children[nodeIndex] = r;
- r._parent = p;
- r._childIndex = nodeIndex;
- } else {
- _this._root = r;
- r._parent = null;
- }
- node = r;
- }
- }
- }
- let h1 = node._children[0]._height;
- let h2 = node._children[1]._height;
- node._height = (h1 > h2 ? h1 : h2) + 1;
- let c1 = node._children[0];
- let c2 = node._children[1];
- node._aabbMinX = c1._aabbMinX < c2._aabbMinX ? c1._aabbMinX : c2._aabbMinX;
- node._aabbMinY = c1._aabbMinY < c2._aabbMinY ? c1._aabbMinY : c2._aabbMinY;
- node._aabbMinZ = c1._aabbMinZ < c2._aabbMinZ ? c1._aabbMinZ : c2._aabbMinZ;
- node._aabbMaxX = c1._aabbMaxX > c2._aabbMaxX ? c1._aabbMaxX : c2._aabbMaxX;
- node._aabbMaxY = c1._aabbMaxY > c2._aabbMaxY ? c1._aabbMaxY : c2._aabbMaxY;
- node._aabbMaxZ = c1._aabbMaxZ > c2._aabbMaxZ ? c1._aabbMaxZ : c2._aabbMaxZ;
- node = node._parent;
- }
- }
- }
- p._leaf = null;
- leaf._next = null;
- leaf._childIndex = 0;
- leaf._children[0] = null;
- leaf._children[1] = null;
- leaf._childIndex = 0;
- leaf._parent = null;
- leaf._height = 0;
- leaf._proxy = null;
- leaf._next = _this._nodePool;
- _this._nodePool = leaf;
- let _this1 = this._tree;
- let first = _this1._nodePool;
- if(first != null) {
- _this1._nodePool = first._next;
- first._next = null;
- } else {
- first = new oimo.collision.broadphase.bvh.BvhNode();
- }
- let leaf1 = first;
- leaf1._proxy = p;
- p._leaf = leaf1;
- leaf1._aabbMinX = p._aabbMinX;
- leaf1._aabbMinY = p._aabbMinY;
- leaf1._aabbMinZ = p._aabbMinZ;
- leaf1._aabbMaxX = p._aabbMaxX;
- leaf1._aabbMaxY = p._aabbMaxY;
- leaf1._aabbMaxZ = p._aabbMaxZ;
- _this1._numLeaves++;
- if(_this1.leafList == null) {
- _this1.leafList = leaf1;
- _this1.leafListLast = leaf1;
- } else {
- _this1.leafListLast._nextLeaf = leaf1;
- leaf1._prevLeaf = _this1.leafListLast;
- _this1.leafListLast = leaf1;
- }
- if(_this1._root == null) {
- _this1._root = leaf1;
- } else {
- let sibling = _this1._root;
- while(sibling._height > 0) {
- let nextStep = _this1._strategy._decideInsertion(sibling,leaf1);
- if(nextStep == -1) {
- break;
- } else {
- sibling = sibling._children[nextStep];
- }
- }
- let parent = sibling._parent;
- let first = _this1._nodePool;
- if(first != null) {
- _this1._nodePool = first._next;
- first._next = null;
- } else {
- first = new oimo.collision.broadphase.bvh.BvhNode();
- }
- let node = first;
- if(parent == null) {
- _this1._root = node;
- } else {
- let index = sibling._childIndex;
- parent._children[index] = node;
- node._parent = parent;
- node._childIndex = index;
- }
- let index = sibling._childIndex;
- node._children[index] = sibling;
- sibling._parent = node;
- sibling._childIndex = index;
- let index1 = sibling._childIndex ^ 1;
- node._children[index1] = leaf1;
- leaf1._parent = node;
- leaf1._childIndex = index1;
- while(node != null) {
- if(_this1._strategy._balancingEnabled) {
- if(node._height >= 2) {
- let p = node._parent;
- let l = node._children[0];
- let r = node._children[1];
- let balance = l._height - r._height;
- let nodeIndex = node._childIndex;
- if(balance > 1) {
- let ll = l._children[0];
- let lr = l._children[1];
- if(ll._height > lr._height) {
- l._children[1] = node;
- node._parent = l;
- node._childIndex = 1;
- node._children[0] = lr;
- lr._parent = node;
- lr._childIndex = 0;
- let c1 = l._children[0];
- let c2 = l._children[1];
- l._aabbMinX = c1._aabbMinX < c2._aabbMinX ? c1._aabbMinX : c2._aabbMinX;
- l._aabbMinY = c1._aabbMinY < c2._aabbMinY ? c1._aabbMinY : c2._aabbMinY;
- l._aabbMinZ = c1._aabbMinZ < c2._aabbMinZ ? c1._aabbMinZ : c2._aabbMinZ;
- l._aabbMaxX = c1._aabbMaxX > c2._aabbMaxX ? c1._aabbMaxX : c2._aabbMaxX;
- l._aabbMaxY = c1._aabbMaxY > c2._aabbMaxY ? c1._aabbMaxY : c2._aabbMaxY;
- l._aabbMaxZ = c1._aabbMaxZ > c2._aabbMaxZ ? c1._aabbMaxZ : c2._aabbMaxZ;
- let h1 = l._children[0]._height;
- let h2 = l._children[1]._height;
- l._height = (h1 > h2 ? h1 : h2) + 1;
- let c11 = node._children[0];
- let c21 = node._children[1];
- node._aabbMinX = c11._aabbMinX < c21._aabbMinX ? c11._aabbMinX : c21._aabbMinX;
- node._aabbMinY = c11._aabbMinY < c21._aabbMinY ? c11._aabbMinY : c21._aabbMinY;
- node._aabbMinZ = c11._aabbMinZ < c21._aabbMinZ ? c11._aabbMinZ : c21._aabbMinZ;
- node._aabbMaxX = c11._aabbMaxX > c21._aabbMaxX ? c11._aabbMaxX : c21._aabbMaxX;
- node._aabbMaxY = c11._aabbMaxY > c21._aabbMaxY ? c11._aabbMaxY : c21._aabbMaxY;
- node._aabbMaxZ = c11._aabbMaxZ > c21._aabbMaxZ ? c11._aabbMaxZ : c21._aabbMaxZ;
- let h11 = node._children[0]._height;
- let h21 = node._children[1]._height;
- node._height = (h11 > h21 ? h11 : h21) + 1;
- } else {
- l._children[0] = node;
- node._parent = l;
- node._childIndex = 0;
- node._children[0] = ll;
- ll._parent = node;
- ll._childIndex = 0;
- let c1 = l._children[0];
- let c2 = l._children[1];
- l._aabbMinX = c1._aabbMinX < c2._aabbMinX ? c1._aabbMinX : c2._aabbMinX;
- l._aabbMinY = c1._aabbMinY < c2._aabbMinY ? c1._aabbMinY : c2._aabbMinY;
- l._aabbMinZ = c1._aabbMinZ < c2._aabbMinZ ? c1._aabbMinZ : c2._aabbMinZ;
- l._aabbMaxX = c1._aabbMaxX > c2._aabbMaxX ? c1._aabbMaxX : c2._aabbMaxX;
- l._aabbMaxY = c1._aabbMaxY > c2._aabbMaxY ? c1._aabbMaxY : c2._aabbMaxY;
- l._aabbMaxZ = c1._aabbMaxZ > c2._aabbMaxZ ? c1._aabbMaxZ : c2._aabbMaxZ;
- let h1 = l._children[0]._height;
- let h2 = l._children[1]._height;
- l._height = (h1 > h2 ? h1 : h2) + 1;
- let c11 = node._children[0];
- let c21 = node._children[1];
- node._aabbMinX = c11._aabbMinX < c21._aabbMinX ? c11._aabbMinX : c21._aabbMinX;
- node._aabbMinY = c11._aabbMinY < c21._aabbMinY ? c11._aabbMinY : c21._aabbMinY;
- node._aabbMinZ = c11._aabbMinZ < c21._aabbMinZ ? c11._aabbMinZ : c21._aabbMinZ;
- node._aabbMaxX = c11._aabbMaxX > c21._aabbMaxX ? c11._aabbMaxX : c21._aabbMaxX;
- node._aabbMaxY = c11._aabbMaxY > c21._aabbMaxY ? c11._aabbMaxY : c21._aabbMaxY;
- node._aabbMaxZ = c11._aabbMaxZ > c21._aabbMaxZ ? c11._aabbMaxZ : c21._aabbMaxZ;
- let h11 = node._children[0]._height;
- let h21 = node._children[1]._height;
- node._height = (h11 > h21 ? h11 : h21) + 1;
- }
- if(p != null) {
- p._children[nodeIndex] = l;
- l._parent = p;
- l._childIndex = nodeIndex;
- } else {
- _this1._root = l;
- l._parent = null;
- }
- node = l;
- } else if(balance < -1) {
- let rl = r._children[0];
- let rr = r._children[1];
- if(rl._height > rr._height) {
- r._children[1] = node;
- node._parent = r;
- node._childIndex = 1;
- node._children[1] = rr;
- rr._parent = node;
- rr._childIndex = 1;
- let c1 = r._children[0];
- let c2 = r._children[1];
- r._aabbMinX = c1._aabbMinX < c2._aabbMinX ? c1._aabbMinX : c2._aabbMinX;
- r._aabbMinY = c1._aabbMinY < c2._aabbMinY ? c1._aabbMinY : c2._aabbMinY;
- r._aabbMinZ = c1._aabbMinZ < c2._aabbMinZ ? c1._aabbMinZ : c2._aabbMinZ;
- r._aabbMaxX = c1._aabbMaxX > c2._aabbMaxX ? c1._aabbMaxX : c2._aabbMaxX;
- r._aabbMaxY = c1._aabbMaxY > c2._aabbMaxY ? c1._aabbMaxY : c2._aabbMaxY;
- r._aabbMaxZ = c1._aabbMaxZ > c2._aabbMaxZ ? c1._aabbMaxZ : c2._aabbMaxZ;
- let h1 = r._children[0]._height;
- let h2 = r._children[1]._height;
- r._height = (h1 > h2 ? h1 : h2) + 1;
- let c11 = node._children[0];
- let c21 = node._children[1];
- node._aabbMinX = c11._aabbMinX < c21._aabbMinX ? c11._aabbMinX : c21._aabbMinX;
- node._aabbMinY = c11._aabbMinY < c21._aabbMinY ? c11._aabbMinY : c21._aabbMinY;
- node._aabbMinZ = c11._aabbMinZ < c21._aabbMinZ ? c11._aabbMinZ : c21._aabbMinZ;
- node._aabbMaxX = c11._aabbMaxX > c21._aabbMaxX ? c11._aabbMaxX : c21._aabbMaxX;
- node._aabbMaxY = c11._aabbMaxY > c21._aabbMaxY ? c11._aabbMaxY : c21._aabbMaxY;
- node._aabbMaxZ = c11._aabbMaxZ > c21._aabbMaxZ ? c11._aabbMaxZ : c21._aabbMaxZ;
- let h11 = node._children[0]._height;
- let h21 = node._children[1]._height;
- node._height = (h11 > h21 ? h11 : h21) + 1;
- } else {
- r._children[0] = node;
- node._parent = r;
- node._childIndex = 0;
- node._children[1] = rl;
- rl._parent = node;
- rl._childIndex = 1;
- let c1 = r._children[0];
- let c2 = r._children[1];
- r._aabbMinX = c1._aabbMinX < c2._aabbMinX ? c1._aabbMinX : c2._aabbMinX;
- r._aabbMinY = c1._aabbMinY < c2._aabbMinY ? c1._aabbMinY : c2._aabbMinY;
- r._aabbMinZ = c1._aabbMinZ < c2._aabbMinZ ? c1._aabbMinZ : c2._aabbMinZ;
- r._aabbMaxX = c1._aabbMaxX > c2._aabbMaxX ? c1._aabbMaxX : c2._aabbMaxX;
- r._aabbMaxY = c1._aabbMaxY > c2._aabbMaxY ? c1._aabbMaxY : c2._aabbMaxY;
- r._aabbMaxZ = c1._aabbMaxZ > c2._aabbMaxZ ? c1._aabbMaxZ : c2._aabbMaxZ;
- let h1 = r._children[0]._height;
- let h2 = r._children[1]._height;
- r._height = (h1 > h2 ? h1 : h2) + 1;
- let c11 = node._children[0];
- let c21 = node._children[1];
- node._aabbMinX = c11._aabbMinX < c21._aabbMinX ? c11._aabbMinX : c21._aabbMinX;
- node._aabbMinY = c11._aabbMinY < c21._aabbMinY ? c11._aabbMinY : c21._aabbMinY;
- node._aabbMinZ = c11._aabbMinZ < c21._aabbMinZ ? c11._aabbMinZ : c21._aabbMinZ;
- node._aabbMaxX = c11._aabbMaxX > c21._aabbMaxX ? c11._aabbMaxX : c21._aabbMaxX;
- node._aabbMaxY = c11._aabbMaxY > c21._aabbMaxY ? c11._aabbMaxY : c21._aabbMaxY;
- node._aabbMaxZ = c11._aabbMaxZ > c21._aabbMaxZ ? c11._aabbMaxZ : c21._aabbMaxZ;
- let h11 = node._children[0]._height;
- let h21 = node._children[1]._height;
- node._height = (h11 > h21 ? h11 : h21) + 1;
- }
- if(p != null) {
- p._children[nodeIndex] = r;
- r._parent = p;
- r._childIndex = nodeIndex;
- } else {
- _this1._root = r;
- r._parent = null;
- }
- node = r;
- }
- }
- }
- let h1 = node._children[0]._height;
- let h2 = node._children[1]._height;
- node._height = (h1 > h2 ? h1 : h2) + 1;
- let c1 = node._children[0];
- let c2 = node._children[1];
- node._aabbMinX = c1._aabbMinX < c2._aabbMinX ? c1._aabbMinX : c2._aabbMinX;
- node._aabbMinY = c1._aabbMinY < c2._aabbMinY ? c1._aabbMinY : c2._aabbMinY;
- node._aabbMinZ = c1._aabbMinZ < c2._aabbMinZ ? c1._aabbMinZ : c2._aabbMinZ;
- node._aabbMaxX = c1._aabbMaxX > c2._aabbMaxX ? c1._aabbMaxX : c2._aabbMaxX;
- node._aabbMaxY = c1._aabbMaxY > c2._aabbMaxY ? c1._aabbMaxY : c2._aabbMaxY;
- node._aabbMaxZ = c1._aabbMaxZ > c2._aabbMaxZ ? c1._aabbMaxZ : c2._aabbMaxZ;
- node = node._parent;
- }
- }
- if(incrementalCollision) {
- this.collide(this._tree._root,p._leaf);
- }
- p._moved = false;
- }
- this.movedProxies[i] = null;
- }
- if(!incrementalCollision) {
- this.collide(this._tree._root,this._tree._root);
- }
- this.numMovedProxies = 0;
- }
- rayCast(begin,end,callback) {
- if(this._tree._root == null) {
- return;
- }
- let p1X;
- let p1Y;
- let p1Z;
- let p2X;
- let p2Y;
- let p2Z;
- p1X = begin.x;
- p1Y = begin.y;
- p1Z = begin.z;
- p2X = end.x;
- p2Y = end.y;
- p2Z = end.z;
- this.rayCastRecursive(this._tree._root,p1X,p1Y,p1Z,p2X,p2Y,p2Z,callback);
- }
- convexCast(convex,begin,translation,callback) {
- if(this._tree._root == null) {
- return;
- }
- this.convexCastRecursive(this._tree._root,convex,begin,translation,callback);
- }
- aabbTest(aabb,callback) {
- if(this._tree._root == null) {
- return;
- }
- this.aabbTestRecursive(this._tree._root,aabb,callback);
- }
- getTreeBalance() {
- return this._tree._getBalance();
- }
- }
- oimo.collision.broadphase.bvh.BvhInsertionStrategy = class oimo_collision_broadphase_bvh_BvhInsertionStrategy {
- }
- oimo.collision.broadphase.bvh.BvhNode = class oimo_collision_broadphase_bvh_BvhNode {
- constructor() {
- this._next = null;
- this._prevLeaf = null;
- this._nextLeaf = null;
- this._children = new Array(2);
- this._childIndex = 0;
- this._parent = null;
- this._height = 0;
- this._proxy = null;
- this._aabbMinX = 0;
- this._aabbMinY = 0;
- this._aabbMinZ = 0;
- this._aabbMaxX = 0;
- this._aabbMaxY = 0;
- this._aabbMaxZ = 0;
- }
- }
- oimo.collision.broadphase.bvh.BvhProxy = class oimo_collision_broadphase_bvh_BvhProxy extends oimo.collision.broadphase.Proxy {
- constructor(userData,id) {
- super(userData,id);
- this._leaf = null;
- this._moved = false;
- }
- }
- oimo.collision.broadphase.bvh.BvhStrategy = class oimo_collision_broadphase_bvh_BvhStrategy {
- constructor() {
- this._insertionStrategy = 0;
- this._balancingEnabled = false;
- }
- _decideInsertion(currentNode,leaf) {
- switch(this._insertionStrategy) {
- case 0:
- let centerX;
- let centerY;
- let centerZ;
- centerX = leaf._aabbMinX + leaf._aabbMaxX;
- centerY = leaf._aabbMinY + leaf._aabbMaxY;
- centerZ = leaf._aabbMinZ + leaf._aabbMaxZ;
- let c1 = currentNode._children[0];
- let c2 = currentNode._children[1];
- let diff1X;
- let diff1Y;
- let diff1Z;
- let diff2X;
- let diff2Y;
- let diff2Z;
- diff1X = c1._aabbMinX + c1._aabbMaxX;
- diff1Y = c1._aabbMinY + c1._aabbMaxY;
- diff1Z = c1._aabbMinZ + c1._aabbMaxZ;
- diff2X = c2._aabbMinX + c2._aabbMaxX;
- diff2Y = c2._aabbMinY + c2._aabbMaxY;
- diff2Z = c2._aabbMinZ + c2._aabbMaxZ;
- diff1X -= centerX;
- diff1Y -= centerY;
- diff1Z -= centerZ;
- diff2X -= centerX;
- diff2Y -= centerY;
- diff2Z -= centerZ;
- if(diff1X * diff1X + diff1Y * diff1Y + diff1Z * diff1Z < diff2X * diff2X + diff2Y * diff2Y + diff2Z * diff2Z) {
- return 0;
- } else {
- return 1;
- }
- break;
- case 1:
- let c11 = currentNode._children[0];
- let c21 = currentNode._children[1];
- let ey = currentNode._aabbMaxY - currentNode._aabbMinY;
- let ez = currentNode._aabbMaxZ - currentNode._aabbMinZ;
- let combinedMinX;
- let combinedMinY;
- let combinedMinZ;
- let combinedMaxX;
- let combinedMaxY;
- let combinedMaxZ;
- combinedMinX = currentNode._aabbMinX < leaf._aabbMinX ? currentNode._aabbMinX : leaf._aabbMinX;
- combinedMinY = currentNode._aabbMinY < leaf._aabbMinY ? currentNode._aabbMinY : leaf._aabbMinY;
- combinedMinZ = currentNode._aabbMinZ < leaf._aabbMinZ ? currentNode._aabbMinZ : leaf._aabbMinZ;
- combinedMaxX = currentNode._aabbMaxX > leaf._aabbMaxX ? currentNode._aabbMaxX : leaf._aabbMaxX;
- combinedMaxY = currentNode._aabbMaxY > leaf._aabbMaxY ? currentNode._aabbMaxY : leaf._aabbMaxY;
- combinedMaxZ = currentNode._aabbMaxZ > leaf._aabbMaxZ ? currentNode._aabbMaxZ : leaf._aabbMaxZ;
- let ey1 = combinedMaxY - combinedMinY;
- let ez1 = combinedMaxZ - combinedMinZ;
- let newArea = ((combinedMaxX - combinedMinX) * (ey1 + ez1) + ey1 * ez1) * 2;
- let creatingCost = newArea * 2;
- let incrementalCost = (newArea - ((currentNode._aabbMaxX - currentNode._aabbMinX) * (ey + ez) + ey * ez) * 2) * 2;
- let descendingCost1;
- combinedMinX = c11._aabbMinX < leaf._aabbMinX ? c11._aabbMinX : leaf._aabbMinX;
- combinedMinY = c11._aabbMinY < leaf._aabbMinY ? c11._aabbMinY : leaf._aabbMinY;
- combinedMinZ = c11._aabbMinZ < leaf._aabbMinZ ? c11._aabbMinZ : leaf._aabbMinZ;
- combinedMaxX = c11._aabbMaxX > leaf._aabbMaxX ? c11._aabbMaxX : leaf._aabbMaxX;
- combinedMaxY = c11._aabbMaxY > leaf._aabbMaxY ? c11._aabbMaxY : leaf._aabbMaxY;
- combinedMaxZ = c11._aabbMaxZ > leaf._aabbMaxZ ? c11._aabbMaxZ : leaf._aabbMaxZ;
- if(c11._height == 0) {
- let ey = combinedMaxY - combinedMinY;
- let ez = combinedMaxZ - combinedMinZ;
- descendingCost1 = incrementalCost + ((combinedMaxX - combinedMinX) * (ey + ez) + ey * ez) * 2;
- } else {
- let ey = combinedMaxY - combinedMinY;
- let ez = combinedMaxZ - combinedMinZ;
- let ey1 = c11._aabbMaxY - c11._aabbMinY;
- let ez1 = c11._aabbMaxZ - c11._aabbMinZ;
- descendingCost1 = incrementalCost + (((combinedMaxX - combinedMinX) * (ey + ez) + ey * ez) * 2 - ((c11._aabbMaxX - c11._aabbMinX) * (ey1 + ez1) + ey1 * ez1) * 2);
- }
- let descendingCost2;
- combinedMinX = c21._aabbMinX < leaf._aabbMinX ? c21._aabbMinX : leaf._aabbMinX;
- combinedMinY = c21._aabbMinY < leaf._aabbMinY ? c21._aabbMinY : leaf._aabbMinY;
- combinedMinZ = c21._aabbMinZ < leaf._aabbMinZ ? c21._aabbMinZ : leaf._aabbMinZ;
- combinedMaxX = c21._aabbMaxX > leaf._aabbMaxX ? c21._aabbMaxX : leaf._aabbMaxX;
- combinedMaxY = c21._aabbMaxY > leaf._aabbMaxY ? c21._aabbMaxY : leaf._aabbMaxY;
- combinedMaxZ = c21._aabbMaxZ > leaf._aabbMaxZ ? c21._aabbMaxZ : leaf._aabbMaxZ;
- if(c21._height == 0) {
- let ey = combinedMaxY - combinedMinY;
- let ez = combinedMaxZ - combinedMinZ;
- descendingCost2 = incrementalCost + ((combinedMaxX - combinedMinX) * (ey + ez) + ey * ez) * 2;
- } else {
- let ey = combinedMaxY - combinedMinY;
- let ez = combinedMaxZ - combinedMinZ;
- let ey1 = c21._aabbMaxY - c21._aabbMinY;
- let ez1 = c21._aabbMaxZ - c21._aabbMinZ;
- descendingCost2 = incrementalCost + (((combinedMaxX - combinedMinX) * (ey + ez) + ey * ez) * 2 - ((c21._aabbMaxX - c21._aabbMinX) * (ey1 + ez1) + ey1 * ez1) * 2);
- }
- if(creatingCost < descendingCost1) {
- if(creatingCost < descendingCost2) {
- return -1;
- } else {
- return 1;
- }
- } else if(descendingCost1 < descendingCost2) {
- return 0;
- } else {
- return 1;
- }
- break;
- default:
- console.log("src/oimo/collision/broadphase/bvh/BvhStrategy.hx:37:","invalid BVH insertion strategy: " + this._insertionStrategy);
- return -1;
- }
- }
- _splitLeaves(leaves,from,until) {
- let invN = 1.0 / (until - from);
- let centerMeanX;
- let centerMeanY;
- let centerMeanZ;
- centerMeanX = 0;
- centerMeanY = 0;
- centerMeanZ = 0;
- let _g = from;
- while(_g < until) {
- let leaf = leaves[_g++];
- leaf._tmpX = leaf._aabbMaxX + leaf._aabbMinX;
- leaf._tmpY = leaf._aabbMaxY + leaf._aabbMinY;
- leaf._tmpZ = leaf._aabbMaxZ + leaf._aabbMinZ;
- centerMeanX += leaf._tmpX;
- centerMeanY += leaf._tmpY;
- centerMeanZ += leaf._tmpZ;
- }
- centerMeanX *= invN;
- centerMeanY *= invN;
- centerMeanZ *= invN;
- let varianceX;
- let varianceY;
- let varianceZ;
- varianceX = 0;
- varianceY = 0;
- varianceZ = 0;
- let _g1 = from;
- while(_g1 < until) {
- let leaf = leaves[_g1++];
- let diffX;
- let diffY;
- let diffZ;
- diffX = leaf._tmpX - centerMeanX;
- diffY = leaf._tmpY - centerMeanY;
- diffZ = leaf._tmpZ - centerMeanZ;
- diffX *= diffX;
- diffY *= diffY;
- diffZ *= diffZ;
- varianceX += diffX;
- varianceY += diffY;
- varianceZ += diffZ;
- }
- let varX = varianceX;
- let varY = varianceY;
- let varZ = varianceZ;
- let l = from;
- let r = until - 1;
- if(varX > varY) {
- if(varX > varZ) {
- let mean = centerMeanX;
- while(true) {
- while(!(leaves[l]._tmpX <= mean)) ++l;
- while(!(leaves[r]._tmpX >= mean)) --r;
- if(l >= r) {
- break;
- }
- let tmp = leaves[l];
- leaves[l] = leaves[r];
- leaves[r] = tmp;
- ++l;
- --r;
- }
- } else {
- let mean = centerMeanZ;
- while(true) {
- while(!(leaves[l]._tmpZ <= mean)) ++l;
- while(!(leaves[r]._tmpZ >= mean)) --r;
- if(l >= r) {
- break;
- }
- let tmp = leaves[l];
- leaves[l] = leaves[r];
- leaves[r] = tmp;
- ++l;
- --r;
- }
- }
- } else if(varY > varZ) {
- let mean = centerMeanY;
- while(true) {
- while(!(leaves[l]._tmpY <= mean)) ++l;
- while(!(leaves[r]._tmpY >= mean)) --r;
- if(l >= r) {
- break;
- }
- let tmp = leaves[l];
- leaves[l] = leaves[r];
- leaves[r] = tmp;
- ++l;
- --r;
- }
- } else {
- let mean = centerMeanZ;
- while(true) {
- while(!(leaves[l]._tmpZ <= mean)) ++l;
- while(!(leaves[r]._tmpZ >= mean)) --r;
- if(l >= r) {
- break;
- }
- let tmp = leaves[l];
- leaves[l] = leaves[r];
- leaves[r] = tmp;
- ++l;
- --r;
- }
- }
- return l;
- }
- }
- oimo.collision.broadphase.bvh.BvhTree = class oimo_collision_broadphase_bvh_BvhTree {
- constructor() {
- this._root = null;
- this._numLeaves = 0;
- this._strategy = new oimo.collision.broadphase.bvh.BvhStrategy();
- this._nodePool = null;
- this.leafList = null;
- this.leafListLast = null;
- this.tmp = new Array(1024);
- }
- _print(root,indent) {
- if(indent == null) {
- indent = "";
- }
- if(root == null) {
- return;
- }
- if(root._height == 0) {
- console.log("src/oimo/collision/broadphase/bvh/BvhTree.hx:39:",indent + root._proxy._id);
- } else {
- this._print(root._children[0],indent + " ");
- let tmp;
- let sizeX;
- let sizeY;
- let sizeZ;
- sizeX = root._aabbMaxX - root._aabbMinX;
- sizeY = root._aabbMaxY - root._aabbMinY;
- sizeZ = root._aabbMaxZ - root._aabbMinZ;
- let y = sizeY;
- let z = sizeZ;
- if(sizeX * (y + z) + y * z > 0) {
- let sizeX;
- let sizeY;
- let sizeZ;
- sizeX = root._aabbMaxX - root._aabbMinX;
- sizeY = root._aabbMaxY - root._aabbMinY;
- sizeZ = root._aabbMaxZ - root._aabbMinZ;
- let y = sizeY;
- let z = sizeZ;
- tmp = ((sizeX * (y + z) + y * z) * 1000 + 0.5 | 0) / 1000;
- } else {
- let sizeX;
- let sizeY;
- let sizeZ;
- sizeX = root._aabbMaxX - root._aabbMinX;
- sizeY = root._aabbMaxY - root._aabbMinY;
- sizeZ = root._aabbMaxZ - root._aabbMinZ;
- let y = sizeY;
- let z = sizeZ;
- tmp = ((sizeX * (y + z) + y * z) * 1000 - 0.5 | 0) / 1000;
- }
- console.log("src/oimo/collision/broadphase/bvh/BvhTree.hx:42:",indent + "#" + root._height + ", " + tmp);
- this._print(root._children[1],indent + " ");
- }
- }
- _getBalance() {
- return this.getBalanceRecursive(this._root);
- }
- deleteRecursive(root) {
- if(root._height == 0) {
- let prev = root._prevLeaf;
- let next = root._nextLeaf;
- if(prev != null) {
- prev._nextLeaf = next;
- }
- if(next != null) {
- next._prevLeaf = prev;
- }
- if(root == this.leafList) {
- this.leafList = this.leafList._nextLeaf;
- }
- if(root == this.leafListLast) {
- this.leafListLast = this.leafListLast._prevLeaf;
- }
- root._nextLeaf = null;
- root._prevLeaf = null;
- root._proxy._leaf = null;
- root._next = null;
- root._childIndex = 0;
- root._children[0] = null;
- root._children[1] = null;
- root._childIndex = 0;
- root._parent = null;
- root._height = 0;
- root._proxy = null;
- root._next = this._nodePool;
- this._nodePool = root;
- return;
- }
- this.deleteRecursive(root._children[0]);
- this.deleteRecursive(root._children[1]);
- root._next = null;
- root._childIndex = 0;
- root._children[0] = null;
- root._children[1] = null;
- root._childIndex = 0;
- root._parent = null;
- root._height = 0;
- root._proxy = null;
- root._next = this._nodePool;
- this._nodePool = root;
- }
- decomposeRecursive(root) {
- if(root._height == 0) {
- root._childIndex = 0;
- root._parent = null;
- return;
- }
- this.decomposeRecursive(root._children[0]);
- this.decomposeRecursive(root._children[1]);
- root._next = null;
- root._childIndex = 0;
- root._children[0] = null;
- root._children[1] = null;
- root._childIndex = 0;
- root._parent = null;
- root._height = 0;
- root._proxy = null;
- root._next = this._nodePool;
- this._nodePool = root;
- }
- buildTopDownRecursive(leaves,from,until) {
- if(until - from == 1) {
- let leaf = leaves[from];
- let proxy = leaf._proxy;
- leaf._aabbMinX = proxy._aabbMinX;
- leaf._aabbMinY = proxy._aabbMinY;
- leaf._aabbMinZ = proxy._aabbMinZ;
- leaf._aabbMaxX = proxy._aabbMaxX;
- leaf._aabbMaxY = proxy._aabbMaxY;
- leaf._aabbMaxZ = proxy._aabbMaxZ;
- return leaf;
- }
- let splitAt = this._strategy._splitLeaves(leaves,from,until);
- let child1 = this.buildTopDownRecursive(leaves,from,splitAt);
- let child2 = this.buildTopDownRecursive(leaves,splitAt,until);
- let first = this._nodePool;
- if(first != null) {
- this._nodePool = first._next;
- first._next = null;
- } else {
- first = new oimo.collision.broadphase.bvh.BvhNode();
- }
- let parent = first;
- parent._children[0] = child1;
- child1._parent = parent;
- child1._childIndex = 0;
- parent._children[1] = child2;
- child2._parent = parent;
- child2._childIndex = 1;
- let c1 = parent._children[0];
- let c2 = parent._children[1];
- parent._aabbMinX = c1._aabbMinX < c2._aabbMinX ? c1._aabbMinX : c2._aabbMinX;
- parent._aabbMinY = c1._aabbMinY < c2._aabbMinY ? c1._aabbMinY : c2._aabbMinY;
- parent._aabbMinZ = c1._aabbMinZ < c2._aabbMinZ ? c1._aabbMinZ : c2._aabbMinZ;
- parent._aabbMaxX = c1._aabbMaxX > c2._aabbMaxX ? c1._aabbMaxX : c2._aabbMaxX;
- parent._aabbMaxY = c1._aabbMaxY > c2._aabbMaxY ? c1._aabbMaxY : c2._aabbMaxY;
- parent._aabbMaxZ = c1._aabbMaxZ > c2._aabbMaxZ ? c1._aabbMaxZ : c2._aabbMaxZ;
- let h1 = parent._children[0]._height;
- let h2 = parent._children[1]._height;
- parent._height = (h1 > h2 ? h1 : h2) + 1;
- return parent;
- }
- getBalanceRecursive(root) {
- if(root == null || root._height == 0) {
- return 0;
- }
- let balance = root._children[0]._height - root._children[1]._height;
- if(balance < 0) {
- balance = -balance;
- }
- return balance + this.getBalanceRecursive(root._children[0]) + this.getBalanceRecursive(root._children[1]);
- }
- }
- oimo.collision.geometry.Aabb = class oimo_collision_geometry_Aabb {
- constructor() {
- this._minX = 0;
- this._minY = 0;
- this._minZ = 0;
- this._maxX = 0;
- this._maxY = 0;
- this._maxZ = 0;
- }
- init(min,max) {
- this._minX = min.x;
- this._minY = min.y;
- this._minZ = min.z;
- this._maxX = max.x;
- this._maxY = max.y;
- this._maxZ = max.z;
- return this;
- }
- getMin() {
- let min = new oimo.common.Vec3();
- min.x = this._minX;
- min.y = this._minY;
- min.z = this._minZ;
- return min;
- }
- getMinTo(min) {
- min.x = this._minX;
- min.y = this._minY;
- min.z = this._minZ;
- }
- setMin(min) {
- this._minX = min.x;
- this._minY = min.y;
- this._minZ = min.z;
- return this;
- }
- getMax() {
- let max = new oimo.common.Vec3();
- max.x = this._maxX;
- max.y = this._maxY;
- max.z = this._maxZ;
- return max;
- }
- getMaxTo(max) {
- max.x = this._maxX;
- max.y = this._maxY;
- max.z = this._maxZ;
- }
- setMax(max) {
- this._maxX = max.x;
- this._maxY = max.y;
- this._maxZ = max.z;
- return this;
- }
- getCenter() {
- let v = new oimo.common.Vec3();
- let cX;
- let cY;
- let cZ;
- cX = this._minX + this._maxX;
- cY = this._minY + this._maxY;
- cZ = this._minZ + this._maxZ;
- cX *= 0.5;
- cY *= 0.5;
- cZ *= 0.5;
- v.x = cX;
- v.y = cY;
- v.z = cZ;
- return v;
- }
- getCenterTo(center) {
- let cX;
- let cY;
- let cZ;
- cX = this._minX + this._maxX;
- cY = this._minY + this._maxY;
- cZ = this._minZ + this._maxZ;
- cX *= 0.5;
- cY *= 0.5;
- cZ *= 0.5;
- center.x = cX;
- center.y = cY;
- center.z = cZ;
- }
- getExtents() {
- let v = new oimo.common.Vec3();
- let cX;
- let cY;
- let cZ;
- cX = this._maxX - this._minX;
- cY = this._maxY - this._minY;
- cZ = this._maxZ - this._minZ;
- cX *= 0.5;
- cY *= 0.5;
- cZ *= 0.5;
- v.x = cX;
- v.y = cY;
- v.z = cZ;
- return v;
- }
- getExtentsTo(halfExtents) {
- let cX;
- let cY;
- let cZ;
- cX = this._maxX - this._minX;
- cY = this._maxY - this._minY;
- cZ = this._maxZ - this._minZ;
- cX *= 0.5;
- cY *= 0.5;
- cZ *= 0.5;
- halfExtents.x = cX;
- halfExtents.y = cY;
- halfExtents.z = cZ;
- }
- combine(other) {
- this._minX = this._minX < other._minX ? this._minX : other._minX;
- this._minY = this._minY < other._minY ? this._minY : other._minY;
- this._minZ = this._minZ < other._minZ ? this._minZ : other._minZ;
- this._maxX = this._maxX > other._maxX ? this._maxX : other._maxX;
- this._maxY = this._maxY > other._maxY ? this._maxY : other._maxY;
- this._maxZ = this._maxZ > other._maxZ ? this._maxZ : other._maxZ;
- return this;
- }
- combined(other) {
- let aabb = new oimo.collision.geometry.Aabb();
- aabb._minX = this._minX < other._minX ? this._minX : other._minX;
- aabb._minY = this._minY < other._minY ? this._minY : other._minY;
- aabb._minZ = this._minZ < other._minZ ? this._minZ : other._minZ;
- aabb._maxX = this._maxX > other._maxX ? this._maxX : other._maxX;
- aabb._maxY = this._maxY > other._maxY ? this._maxY : other._maxY;
- aabb._maxZ = this._maxZ > other._maxZ ? this._maxZ : other._maxZ;
- return aabb;
- }
- overlap(other) {
- if(this._minX < other._maxX && this._maxX > other._minX && this._minY < other._maxY && this._maxY > other._minY && this._minZ < other._maxZ) {
- return this._maxZ > other._minZ;
- } else {
- return false;
- }
- }
- getIntersection(other) {
- let aabb = new oimo.collision.geometry.Aabb();
- aabb._minX = this._minX > other._minX ? this._minX : other._minX;
- aabb._minY = this._minY > other._minY ? this._minY : other._minY;
- aabb._minZ = this._minZ > other._minZ ? this._minZ : other._minZ;
- aabb._maxX = this._maxX < other._maxX ? this._maxX : other._maxX;
- aabb._maxY = this._maxY < other._maxY ? this._maxY : other._maxY;
- aabb._maxZ = this._maxZ < other._maxZ ? this._maxZ : other._maxZ;
- return aabb;
- }
- getIntersectionTo(other,intersection) {
- intersection._minX = this._minX > other._minX ? this._minX : other._minX;
- intersection._minY = this._minY > other._minY ? this._minY : other._minY;
- intersection._minZ = this._minZ > other._minZ ? this._minZ : other._minZ;
- intersection._maxX = this._maxX < other._maxX ? this._maxX : other._maxX;
- intersection._maxY = this._maxY < other._maxY ? this._maxY : other._maxY;
- intersection._maxZ = this._maxZ < other._maxZ ? this._maxZ : other._maxZ;
- }
- copyFrom(aabb) {
- this._minX = aabb._minX;
- this._minY = aabb._minY;
- this._minZ = aabb._minZ;
- this._maxX = aabb._maxX;
- this._maxY = aabb._maxY;
- this._maxZ = aabb._maxZ;
- return this;
- }
- clone() {
- let aabb = new oimo.collision.geometry.Aabb();
- aabb._minX = this._minX;
- aabb._minY = this._minY;
- aabb._minZ = this._minZ;
- aabb._maxX = this._maxX;
- aabb._maxY = this._maxY;
- aabb._maxZ = this._maxZ;
- return aabb;
- }
- }
- oimo.collision.geometry.BoxGeometry = class oimo_collision_geometry_BoxGeometry extends oimo.collision.geometry.ConvexGeometry {
- constructor(halfExtents) {
- super(1);
- this._halfExtentsX = halfExtents.x;
- this._halfExtentsY = halfExtents.y;
- this._halfExtentsZ = halfExtents.z;
- this._halfAxisXX = halfExtents.x;
- this._halfAxisXY = 0;
- this._halfAxisXZ = 0;
- this._halfAxisYX = 0;
- this._halfAxisYY = halfExtents.y;
- this._halfAxisYZ = 0;
- this._halfAxisZX = 0;
- this._halfAxisZY = 0;
- this._halfAxisZZ = halfExtents.z;
- this._updateMass();
- let minHalfExtents = halfExtents.x < halfExtents.y ? halfExtents.z < halfExtents.x ? halfExtents.z : halfExtents.x : halfExtents.z < halfExtents.y ? halfExtents.z : halfExtents.y;
- if(this._gjkMargin > minHalfExtents * 0.2) {
- this._gjkMargin = minHalfExtents * 0.2;
- }
- }
- getHalfExtents() {
- let v = new oimo.common.Vec3();
- v.x = this._halfExtentsX;
- v.y = this._halfExtentsY;
- v.z = this._halfExtentsZ;
- return v;
- }
- getHalfExtentsTo(halfExtents) {
- halfExtents.x = this._halfExtentsX;
- halfExtents.y = this._halfExtentsY;
- halfExtents.z = this._halfExtentsZ;
- }
- _updateMass() {
- this._volume = 8 * (this._halfExtentsX * this._halfExtentsY * this._halfExtentsZ);
- let sqX;
- let sqY;
- let sqZ;
- sqX = this._halfExtentsX * this._halfExtentsX;
- sqY = this._halfExtentsY * this._halfExtentsY;
- sqZ = this._halfExtentsZ * this._halfExtentsZ;
- this._inertiaCoeff00 = 0.33333333333333331 * (sqY + sqZ);
- this._inertiaCoeff01 = 0;
- this._inertiaCoeff02 = 0;
- this._inertiaCoeff10 = 0;
- this._inertiaCoeff11 = 0.33333333333333331 * (sqZ + sqX);
- this._inertiaCoeff12 = 0;
- this._inertiaCoeff20 = 0;
- this._inertiaCoeff21 = 0;
- this._inertiaCoeff22 = 0.33333333333333331 * (sqX + sqY);
- }
- _computeAabb(aabb,tf) {
- let tfxX;
- let tfxY;
- let tfxZ;
- let tfyX;
- let tfyY;
- let tfyZ;
- let tfzX;
- let tfzY;
- let tfzZ;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = tf._rotation00 * this._halfAxisXX + tf._rotation01 * this._halfAxisXY + tf._rotation02 * this._halfAxisXZ;
- __tmp__Y = tf._rotation10 * this._halfAxisXX + tf._rotation11 * this._halfAxisXY + tf._rotation12 * this._halfAxisXZ;
- __tmp__Z = tf._rotation20 * this._halfAxisXX + tf._rotation21 * this._halfAxisXY + tf._rotation22 * this._halfAxisXZ;
- tfxX = __tmp__X;
- tfxY = __tmp__Y;
- tfxZ = __tmp__Z;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = tf._rotation00 * this._halfAxisYX + tf._rotation01 * this._halfAxisYY + tf._rotation02 * this._halfAxisYZ;
- __tmp__Y1 = tf._rotation10 * this._halfAxisYX + tf._rotation11 * this._halfAxisYY + tf._rotation12 * this._halfAxisYZ;
- __tmp__Z1 = tf._rotation20 * this._halfAxisYX + tf._rotation21 * this._halfAxisYY + tf._rotation22 * this._halfAxisYZ;
- tfyX = __tmp__X1;
- tfyY = __tmp__Y1;
- tfyZ = __tmp__Z1;
- let __tmp__X2;
- let __tmp__Y2;
- let __tmp__Z2;
- __tmp__X2 = tf._rotation00 * this._halfAxisZX + tf._rotation01 * this._halfAxisZY + tf._rotation02 * this._halfAxisZZ;
- __tmp__Y2 = tf._rotation10 * this._halfAxisZX + tf._rotation11 * this._halfAxisZY + tf._rotation12 * this._halfAxisZZ;
- __tmp__Z2 = tf._rotation20 * this._halfAxisZX + tf._rotation21 * this._halfAxisZY + tf._rotation22 * this._halfAxisZZ;
- tfzX = __tmp__X2;
- tfzY = __tmp__Y2;
- tfzZ = __tmp__Z2;
- if(tfxX < 0) {
- tfxX = -tfxX;
- }
- if(tfxY < 0) {
- tfxY = -tfxY;
- }
- if(tfxZ < 0) {
- tfxZ = -tfxZ;
- }
- if(tfyX < 0) {
- tfyX = -tfyX;
- }
- if(tfyY < 0) {
- tfyY = -tfyY;
- }
- if(tfyZ < 0) {
- tfyZ = -tfyZ;
- }
- if(tfzX < 0) {
- tfzX = -tfzX;
- }
- if(tfzY < 0) {
- tfzY = -tfzY;
- }
- if(tfzZ < 0) {
- tfzZ = -tfzZ;
- }
- let tfsX;
- let tfsY;
- let tfsZ;
- tfsX = tfxX + tfyX;
- tfsY = tfxY + tfyY;
- tfsZ = tfxZ + tfyZ;
- tfsX += tfzX;
- tfsY += tfzY;
- tfsZ += tfzZ;
- aabb._minX = tf._positionX - tfsX;
- aabb._minY = tf._positionY - tfsY;
- aabb._minZ = tf._positionZ - tfsZ;
- aabb._maxX = tf._positionX + tfsX;
- aabb._maxY = tf._positionY + tfsY;
- aabb._maxZ = tf._positionZ + tfsZ;
- }
- computeLocalSupportingVertex(dir,out) {
- let gjkMarginsX;
- let gjkMarginsY;
- let gjkMarginsZ;
- let coreExtentsX;
- let coreExtentsY;
- let coreExtentsZ;
- gjkMarginsX = this._gjkMargin;
- gjkMarginsY = this._gjkMargin;
- gjkMarginsZ = this._gjkMargin;
- if(!(gjkMarginsX < this._halfExtentsX)) {
- gjkMarginsX = this._halfExtentsX;
- }
- if(!(gjkMarginsY < this._halfExtentsY)) {
- gjkMarginsY = this._halfExtentsY;
- }
- if(!(gjkMarginsZ < this._halfExtentsZ)) {
- gjkMarginsZ = this._halfExtentsZ;
- }
- coreExtentsX = this._halfExtentsX - gjkMarginsX;
- coreExtentsY = this._halfExtentsY - gjkMarginsY;
- coreExtentsZ = this._halfExtentsZ - gjkMarginsZ;
- out.x = dir.x > 0 ? coreExtentsX : -coreExtentsX;
- out.y = dir.y > 0 ? coreExtentsY : -coreExtentsY;
- out.z = dir.z > 0 ? coreExtentsZ : -coreExtentsZ;
- }
- _rayCastLocal(beginX,beginY,beginZ,endX,endY,endZ,hit) {
- let halfW = this._halfExtentsX;
- let halfH = this._halfExtentsY;
- let halfD = this._halfExtentsZ;
- let dx = endX - beginX;
- let dy = endY - beginY;
- let dz = endZ - beginZ;
- let tminx = 0;
- let tminy = 0;
- let tminz = 0;
- let tmaxx = 1;
- let tmaxy = 1;
- let tmaxz = 1;
- if(dx > -1e-6 && dx < 1e-6) {
- if(beginX <= -halfW || beginX >= halfW) {
- return false;
- }
- } else {
- let invDx = 1 / dx;
- let t1 = (-halfW - beginX) * invDx;
- let t2 = (halfW - beginX) * invDx;
- if(t1 > t2) {
- let tmp = t1;
- t1 = t2;
- t2 = tmp;
- }
- if(t1 > 0) {
- tminx = t1;
- }
- if(t2 < 1) {
- tmaxx = t2;
- }
- }
- if(dy > -1e-6 && dy < 1e-6) {
- if(beginY <= -halfH || beginY >= halfH) {
- return false;
- }
- } else {
- let invDy = 1 / dy;
- let t1 = (-halfH - beginY) * invDy;
- let t2 = (halfH - beginY) * invDy;
- if(t1 > t2) {
- let tmp = t1;
- t1 = t2;
- t2 = tmp;
- }
- if(t1 > 0) {
- tminy = t1;
- }
- if(t2 < 1) {
- tmaxy = t2;
- }
- }
- if(dz > -1e-6 && dz < 1e-6) {
- if(beginZ <= -halfD || beginZ >= halfD) {
- return false;
- }
- } else {
- let invDz = 1 / dz;
- let t1 = (-halfD - beginZ) * invDz;
- let t2 = (halfD - beginZ) * invDz;
- if(t1 > t2) {
- let tmp = t1;
- t1 = t2;
- t2 = tmp;
- }
- if(t1 > 0) {
- tminz = t1;
- }
- if(t2 < 1) {
- tmaxz = t2;
- }
- }
- if(tminx >= 1 || tminy >= 1 || tminz >= 1 || tmaxx <= 0 || tmaxy <= 0 || tmaxz <= 0) {
- return false;
- }
- let min = tminx;
- let max = tmaxx;
- let hitDirection = 0;
- if(tminy > min) {
- min = tminy;
- hitDirection = 1;
- }
- if(tminz > min) {
- min = tminz;
- hitDirection = 2;
- }
- if(tmaxy < max) {
- max = tmaxy;
- }
- if(tmaxz < max) {
- max = tmaxz;
- }
- if(min > max) {
- return false;
- }
- if(min == 0) {
- return false;
- }
- switch(hitDirection) {
- case 0:
- hit.normal.init(dx > 0 ? -1 : 1,0,0);
- break;
- case 1:
- hit.normal.init(0,dy > 0 ? -1 : 1,0);
- break;
- case 2:
- hit.normal.init(0,0,dz > 0 ? -1 : 1);
- break;
- }
- hit.position.init(beginX + min * dx,beginY + min * dy,beginZ + min * dz);
- hit.fraction = min;
- return true;
- }
- }
- oimo.collision.geometry.CapsuleGeometry = class oimo_collision_geometry_CapsuleGeometry extends oimo.collision.geometry.ConvexGeometry {
- constructor(radius,halfHeight) {
- super(4);
- this._radius = radius;
- this._halfHeight = halfHeight;
- this._gjkMargin = this._radius;
- this._updateMass();
- }
- getRadius() {
- return this._radius;
- }
- getHalfHeight() {
- return this._halfHeight;
- }
- _updateMass() {
- let r2 = this._radius * this._radius;
- let hh2 = this._halfHeight * this._halfHeight;
- let cylinderVolume = 6.28318530717958 * r2 * this._halfHeight;
- let sphereVolume = 3.14159265358979 * r2 * this._radius * 4 / 3;
- this._volume = cylinderVolume + sphereVolume;
- let invVolume = this._volume == 0 ? 0 : 1 / this._volume;
- let inertiaXZ = invVolume * (cylinderVolume * (r2 * 0.25 + hh2 / 3) + sphereVolume * (r2 * 0.4 + this._halfHeight * this._radius * 0.75 + hh2));
- this._inertiaCoeff00 = inertiaXZ;
- this._inertiaCoeff01 = 0;
- this._inertiaCoeff02 = 0;
- this._inertiaCoeff10 = 0;
- this._inertiaCoeff11 = invVolume * (cylinderVolume * r2 * 0.5 + sphereVolume * r2 * 0.4);
- this._inertiaCoeff12 = 0;
- this._inertiaCoeff20 = 0;
- this._inertiaCoeff21 = 0;
- this._inertiaCoeff22 = inertiaXZ;
- }
- _computeAabb(aabb,tf) {
- let radVecX;
- let radVecY;
- let radVecZ;
- radVecX = this._radius;
- radVecY = this._radius;
- radVecZ = this._radius;
- let axisX;
- let axisY;
- let axisZ;
- axisX = tf._rotation01;
- axisY = tf._rotation11;
- axisZ = tf._rotation21;
- if(axisX < 0) {
- axisX = -axisX;
- }
- if(axisY < 0) {
- axisY = -axisY;
- }
- if(axisZ < 0) {
- axisZ = -axisZ;
- }
- axisX *= this._halfHeight;
- axisY *= this._halfHeight;
- axisZ *= this._halfHeight;
- radVecX += axisX;
- radVecY += axisY;
- radVecZ += axisZ;
- aabb._minX = tf._positionX - radVecX;
- aabb._minY = tf._positionY - radVecY;
- aabb._minZ = tf._positionZ - radVecZ;
- aabb._maxX = tf._positionX + radVecX;
- aabb._maxY = tf._positionY + radVecY;
- aabb._maxZ = tf._positionZ + radVecZ;
- }
- computeLocalSupportingVertex(dir,out) {
- if(dir.y > 0) {
- out.init(0,this._halfHeight,0);
- } else {
- out.init(0,-this._halfHeight,0);
- }
- }
- _rayCastLocal(beginX,beginY,beginZ,endX,endY,endZ,hit) {
- let halfH = this._halfHeight;
- let dx = endX - beginX;
- let dz = endZ - beginZ;
- let tminxz = 0;
- let tmaxxz;
- let a = dx * dx + dz * dz;
- let b = beginX * dx + beginZ * dz;
- let c = beginX * beginX + beginZ * beginZ - this._radius * this._radius;
- let D = b * b - a * c;
- if(D < 0) {
- return false;
- }
- if(a > 0) {
- let sqrtD = Math.sqrt(D);
- tminxz = (-b - sqrtD) / a;
- tmaxxz = (-b + sqrtD) / a;
- if(tminxz >= 1 || tmaxxz <= 0) {
- return false;
- }
- } else {
- if(c >= 0) {
- return false;
- }
- tminxz = 0;
- }
- let crossY = beginY + (endY - beginY) * tminxz;
- let min;
- if(crossY > -halfH && crossY < halfH) {
- if(tminxz > 0) {
- min = tminxz;
- let _this = hit.normal.init(beginX + dx * min,0,beginZ + dz * min);
- let invLen = Math.sqrt(_this.x * _this.x + _this.y * _this.y + _this.z * _this.z);
- if(invLen > 0) {
- invLen = 1 / invLen;
- }
- _this.x *= invLen;
- _this.y *= invLen;
- _this.z *= invLen;
- hit.position.init(beginX + min * dx,crossY,beginZ + min * dz);
- hit.fraction = min;
- return true;
- }
- return false;
- }
- let spherePosX;
- let spherePosY;
- let spherePosZ;
- let sphereToBeginX;
- let sphereToBeginY;
- let sphereToBeginZ;
- spherePosX = 0;
- spherePosY = crossY < 0 ? -halfH : halfH;
- spherePosZ = 0;
- sphereToBeginX = beginX - spherePosX;
- sphereToBeginY = beginY - spherePosY;
- sphereToBeginZ = beginZ - spherePosZ;
- let dX;
- let dY;
- let dZ;
- dX = endX - beginX;
- dY = endY - beginY;
- dZ = endZ - beginZ;
- a = dX * dX + dY * dY + dZ * dZ;
- b = sphereToBeginX * dX + sphereToBeginY * dY + sphereToBeginZ * dZ;
- c = sphereToBeginX * sphereToBeginX + sphereToBeginY * sphereToBeginY + sphereToBeginZ * sphereToBeginZ - this._radius * this._radius;
- D = b * b - a * c;
- if(D < 0) {
- return false;
- }
- let t = (-b - Math.sqrt(D)) / a;
- if(t < 0 || t > 1) {
- return false;
- }
- let hitPosX;
- let hitPosY;
- let hitPosZ;
- let hitNormalX;
- let hitNormalY;
- let hitNormalZ;
- hitPosX = sphereToBeginX + dX * t;
- hitPosY = sphereToBeginY + dY * t;
- hitPosZ = sphereToBeginZ + dZ * t;
- let l = hitPosX * hitPosX + hitPosY * hitPosY + hitPosZ * hitPosZ;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- hitNormalX = hitPosX * l;
- hitNormalY = hitPosY * l;
- hitNormalZ = hitPosZ * l;
- hitPosX += spherePosX;
- hitPosY += spherePosY;
- hitPosZ += spherePosZ;
- let v = hit.position;
- v.x = hitPosX;
- v.y = hitPosY;
- v.z = hitPosZ;
- let v1 = hit.normal;
- v1.x = hitNormalX;
- v1.y = hitNormalY;
- v1.z = hitNormalZ;
- hit.fraction = t;
- return true;
- }
- }
- oimo.collision.geometry.ConeGeometry = class oimo_collision_geometry_ConeGeometry extends oimo.collision.geometry.ConvexGeometry {
- constructor(radius,halfHeight) {
- super(3);
- this._radius = radius;
- this._halfHeight = halfHeight;
- this.sinTheta = radius / Math.sqrt(radius * radius + 4 * halfHeight * halfHeight);
- this.cosTheta = 2 * halfHeight / Math.sqrt(radius * radius + 4 * halfHeight * halfHeight);
- this._updateMass();
- }
- getRadius() {
- return this._radius;
- }
- getHalfHeight() {
- return this._halfHeight;
- }
- _updateMass() {
- let r2 = this._radius * this._radius;
- let h2 = this._halfHeight * this._halfHeight * 4;
- this._volume = 3.14159265358979 * r2 * this._halfHeight * 2 / 3;
- this._inertiaCoeff00 = 0.05 * (3 * r2 + 2 * h2);
- this._inertiaCoeff01 = 0;
- this._inertiaCoeff02 = 0;
- this._inertiaCoeff10 = 0;
- this._inertiaCoeff11 = 0.3 * r2;
- this._inertiaCoeff12 = 0;
- this._inertiaCoeff20 = 0;
- this._inertiaCoeff21 = 0;
- this._inertiaCoeff22 = 0.05 * (3 * r2 + 2 * h2);
- }
- _computeAabb(aabb,tf) {
- let axisX;
- let axisY;
- let axisZ;
- let axis2X;
- let axis2Y;
- let axis2Z;
- let ehX;
- let ehY;
- let ehZ;
- let erX;
- let erY;
- let erZ;
- axisX = tf._rotation01;
- axisY = tf._rotation11;
- axisZ = tf._rotation21;
- axis2X = axisX * axisX;
- axis2Y = axisY * axisY;
- axis2Z = axisZ * axisZ;
- erX = Math.sqrt(1 - axis2X);
- erY = Math.sqrt(1 - axis2Y);
- erZ = Math.sqrt(1 - axis2Z);
- erX *= this._radius;
- erY *= this._radius;
- erZ *= this._radius;
- ehX = axisX * this._halfHeight;
- ehY = axisY * this._halfHeight;
- ehZ = axisZ * this._halfHeight;
- let rminX;
- let rminY;
- let rminZ;
- let rmaxX;
- let rmaxY;
- let rmaxZ;
- rminX = -ehX;
- rminY = -ehY;
- rminZ = -ehZ;
- rminX -= erX;
- rminY -= erY;
- rminZ -= erZ;
- rmaxX = -ehX;
- rmaxY = -ehY;
- rmaxZ = -ehZ;
- rmaxX += erX;
- rmaxY += erY;
- rmaxZ += erZ;
- let maxX;
- let maxY;
- let maxZ;
- let minX;
- let minY;
- let minZ;
- maxX = rminX > rmaxX ? rminX : rmaxX;
- maxY = rminY > rmaxY ? rminY : rmaxY;
- maxZ = rminZ > rmaxZ ? rminZ : rmaxZ;
- if(!(maxX > ehX)) {
- maxX = ehX;
- }
- if(!(maxY > ehY)) {
- maxY = ehY;
- }
- if(!(maxZ > ehZ)) {
- maxZ = ehZ;
- }
- minX = rminX < rmaxX ? rminX : rmaxX;
- minY = rminY < rmaxY ? rminY : rmaxY;
- minZ = rminZ < rmaxZ ? rminZ : rmaxZ;
- if(!(minX < ehX)) {
- minX = ehX;
- }
- if(!(minY < ehY)) {
- minY = ehY;
- }
- if(!(minZ < ehZ)) {
- minZ = ehZ;
- }
- aabb._minX = tf._positionX + minX;
- aabb._minY = tf._positionY + minY;
- aabb._minZ = tf._positionZ + minZ;
- aabb._maxX = tf._positionX + maxX;
- aabb._maxY = tf._positionY + maxY;
- aabb._maxZ = tf._positionZ + maxZ;
- }
- computeLocalSupportingVertex(dir,out) {
- let dx = dir.x;
- let dy = dir.y;
- let dz = dir.z;
- if(dy > 0 && dy * dy > this.sinTheta * this.sinTheta * (dx * dx + dy * dy + dz * dz)) {
- out.init(0,this._halfHeight - this._gjkMargin / this.sinTheta,0);
- if(out.y < 0) {
- out.y = 0;
- }
- return;
- }
- let rx = dir.x;
- let rz = dir.z;
- let len = rx * rx + rz * rz;
- let height = 2 * this._halfHeight;
- let coreRadius = (height - this._gjkMargin) / height * this._radius - this._gjkMargin / this.cosTheta;
- if(coreRadius < 0) {
- coreRadius = 0;
- }
- let invLen = len > 0 ? coreRadius / Math.sqrt(len) : 0;
- let coreHalfHeight = this._halfHeight - this._gjkMargin;
- if(coreHalfHeight < 0) {
- coreHalfHeight = 0;
- }
- out.x = rx * invLen;
- out.y = -coreHalfHeight;
- out.z = rz * invLen;
- }
- _rayCastLocal(beginX,beginY,beginZ,endX,endY,endZ,hit) {
- let p1y;
- let halfH = this._halfHeight;
- let dx = endX - beginX;
- let dy = endY - beginY;
- let dz = endZ - beginZ;
- let tminy = 0;
- let tmaxy = 1;
- if(dy > -1e-6 && dy < 1e-6) {
- if(beginY <= -halfH || beginY >= halfH) {
- return false;
- }
- } else {
- let invDy = 1 / dy;
- let t1 = (-halfH - beginY) * invDy;
- let t2 = (halfH - beginY) * invDy;
- if(t1 > t2) {
- let tmp = t1;
- t1 = t2;
- t2 = tmp;
- }
- if(t1 > 0) {
- tminy = t1;
- }
- if(t2 < 1) {
- tmaxy = t2;
- }
- }
- if(tminy >= 1 || tmaxy <= 0) {
- return false;
- }
- let tminxz = 0;
- let tmaxxz = 0;
- p1y = beginY - halfH;
- let cos2 = this.cosTheta * this.cosTheta;
- let a = cos2 * (dx * dx + dy * dy + dz * dz) - dy * dy;
- let b = cos2 * (beginX * dx + p1y * dy + beginZ * dz) - p1y * dy;
- let c = cos2 * (beginX * beginX + p1y * p1y + beginZ * beginZ) - p1y * p1y;
- let D = b * b - a * c;
- if(a != 0) {
- if(D < 0) {
- return false;
- }
- let sqrtD = Math.sqrt(D);
- if(a < 0) {
- if(dy > 0) {
- tminxz = 0;
- tmaxxz = (-b + sqrtD) / a;
- if(tmaxxz <= 0) {
- return false;
- }
- } else {
- tminxz = (-b - sqrtD) / a;
- tmaxxz = 1;
- if(tminxz >= 1) {
- return false;
- }
- }
- } else {
- tminxz = (-b - sqrtD) / a;
- tmaxxz = (-b + sqrtD) / a;
- if(tminxz >= 1 || tmaxxz <= 0) {
- return false;
- }
- }
- } else {
- let t = -c / (2 * b);
- if(b > 0) {
- tminxz = 0;
- tmaxxz = t;
- if(t <= 0) {
- return false;
- }
- } else {
- tminxz = t;
- tmaxxz = 1;
- if(t >= 1) {
- return false;
- }
- }
- }
- p1y += halfH;
- let min;
- if(tmaxxz <= tminy || tmaxy <= tminxz) {
- return false;
- }
- if(tminxz < tminy) {
- min = tminy;
- if(min == 0) {
- return false;
- }
- hit.normal.init(0,dy > 0 ? -1 : 1,0);
- } else {
- min = tminxz;
- if(min == 0) {
- return false;
- }
- let _this = hit.normal.init(beginX + dx * min,0,beginZ + dz * min);
- let invLen = Math.sqrt(_this.x * _this.x + _this.y * _this.y + _this.z * _this.z);
- if(invLen > 0) {
- invLen = 1 / invLen;
- }
- _this.x *= invLen;
- _this.y *= invLen;
- _this.z *= invLen;
- let s = this.cosTheta;
- _this.x *= s;
- _this.y *= s;
- _this.z *= s;
- hit.normal.y += this.sinTheta;
- }
- hit.position.init(beginX + min * dx,p1y + min * dy,beginZ + min * dz);
- hit.fraction = min;
- return true;
- }
- }
- oimo.collision.geometry.ConvexHullGeometry = class oimo_collision_geometry_ConvexHullGeometry extends oimo.collision.geometry.ConvexGeometry {
- constructor(vertices) {
- super(5);
- this._numVertices = vertices.length;
- this._vertices = new Array(this._numVertices);
- this._tmpVertices = new Array(this._numVertices);
- let _g = 0;
- let _g1 = this._numVertices;
- while(_g < _g1) {
- let i = _g++;
- this._vertices[i] = vertices[i];
- this._tmpVertices[i] = new oimo.common.Vec3();
- }
- this._useGjkRayCast = true;
- this._updateMass();
- }
- getVertices() {
- return this._vertices;
- }
- _updateMass() {
- this._volume = 1;
- this._inertiaCoeff00 = 1;
- this._inertiaCoeff01 = 0;
- this._inertiaCoeff02 = 0;
- this._inertiaCoeff10 = 0;
- this._inertiaCoeff11 = 1;
- this._inertiaCoeff12 = 0;
- this._inertiaCoeff20 = 0;
- this._inertiaCoeff21 = 0;
- this._inertiaCoeff22 = 1;
- let minx = this._vertices[0].x;
- let miny = this._vertices[0].y;
- let minz = this._vertices[0].z;
- let maxx = this._vertices[0].x;
- let maxy = this._vertices[0].y;
- let maxz = this._vertices[0].z;
- let _g = 1;
- let _g1 = this._numVertices;
- while(_g < _g1) {
- let i = _g++;
- let vx = this._vertices[i].x;
- let vy = this._vertices[i].y;
- let vz = this._vertices[i].z;
- if(vx < minx) {
- minx = vx;
- } else if(vx > maxx) {
- maxx = vx;
- }
- if(vy < miny) {
- miny = vy;
- } else if(vy > maxy) {
- maxy = vy;
- }
- if(vz < minz) {
- minz = vz;
- } else if(vz > maxz) {
- maxz = vz;
- }
- }
- let sizex = maxx - minx;
- let sizey = maxy - miny;
- let sizez = maxz - minz;
- this._volume = sizex * sizey * sizez;
- let diffCog = ((minx + maxx) * (minx + maxx) + (miny + maxy) * (miny + maxy) + (minz + maxz) * (minz + maxz)) * 0.25;
- sizex = sizex * sizex * 0.25;
- sizey = sizey * sizey * 0.25;
- sizez = sizez * sizez * 0.25;
- this._inertiaCoeff00 = 0.33333333333333331 * (sizey + sizez) + diffCog;
- this._inertiaCoeff01 = 0;
- this._inertiaCoeff02 = 0;
- this._inertiaCoeff10 = 0;
- this._inertiaCoeff11 = 0.33333333333333331 * (sizez + sizex) + diffCog;
- this._inertiaCoeff12 = 0;
- this._inertiaCoeff20 = 0;
- this._inertiaCoeff21 = 0;
- this._inertiaCoeff22 = 0.33333333333333331 * (sizex + sizey) + diffCog;
- }
- _computeAabb(aabb,tf) {
- let minX;
- let minY;
- let minZ;
- let maxX;
- let maxY;
- let maxZ;
- let marginX;
- let marginY;
- let marginZ;
- marginX = this._gjkMargin;
- marginY = this._gjkMargin;
- marginZ = this._gjkMargin;
- let localVX;
- let localVY;
- let localVZ;
- let v = this._vertices[0];
- localVX = v.x;
- localVY = v.y;
- localVZ = v.z;
- let worldVX;
- let worldVY;
- let worldVZ;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = tf._rotation00 * localVX + tf._rotation01 * localVY + tf._rotation02 * localVZ;
- __tmp__Y = tf._rotation10 * localVX + tf._rotation11 * localVY + tf._rotation12 * localVZ;
- __tmp__Z = tf._rotation20 * localVX + tf._rotation21 * localVY + tf._rotation22 * localVZ;
- worldVX = __tmp__X;
- worldVY = __tmp__Y;
- worldVZ = __tmp__Z;
- worldVX += tf._positionX;
- worldVY += tf._positionY;
- worldVZ += tf._positionZ;
- minX = worldVX;
- minY = worldVY;
- minZ = worldVZ;
- maxX = worldVX;
- maxY = worldVY;
- maxZ = worldVZ;
- let _g = 1;
- let _g1 = this._numVertices;
- while(_g < _g1) {
- let v = this._vertices[_g++];
- localVX = v.x;
- localVY = v.y;
- localVZ = v.z;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = tf._rotation00 * localVX + tf._rotation01 * localVY + tf._rotation02 * localVZ;
- __tmp__Y = tf._rotation10 * localVX + tf._rotation11 * localVY + tf._rotation12 * localVZ;
- __tmp__Z = tf._rotation20 * localVX + tf._rotation21 * localVY + tf._rotation22 * localVZ;
- worldVX = __tmp__X;
- worldVY = __tmp__Y;
- worldVZ = __tmp__Z;
- worldVX += tf._positionX;
- worldVY += tf._positionY;
- worldVZ += tf._positionZ;
- if(!(minX < worldVX)) {
- minX = worldVX;
- }
- if(!(minY < worldVY)) {
- minY = worldVY;
- }
- if(!(minZ < worldVZ)) {
- minZ = worldVZ;
- }
- if(!(maxX > worldVX)) {
- maxX = worldVX;
- }
- if(!(maxY > worldVY)) {
- maxY = worldVY;
- }
- if(!(maxZ > worldVZ)) {
- maxZ = worldVZ;
- }
- }
- aabb._minX = minX - marginX;
- aabb._minY = minY - marginY;
- aabb._minZ = minZ - marginZ;
- aabb._maxX = maxX + marginX;
- aabb._maxY = maxY + marginY;
- aabb._maxZ = maxZ + marginZ;
- }
- computeLocalSupportingVertex(dir,out) {
- let _this = this._vertices[0];
- let maxDot = _this.x * dir.x + _this.y * dir.y + _this.z * dir.z;
- let maxIndex = 0;
- let _g = 1;
- let _g1 = this._numVertices;
- while(_g < _g1) {
- let i = _g++;
- let _this = this._vertices[i];
- let dot = _this.x * dir.x + _this.y * dir.y + _this.z * dir.z;
- if(dot > maxDot) {
- maxDot = dot;
- maxIndex = i;
- }
- }
- let v = this._vertices[maxIndex];
- out.x = v.x;
- out.y = v.y;
- out.z = v.z;
- }
- }
- oimo.collision.geometry.CylinderGeometry = class oimo_collision_geometry_CylinderGeometry extends oimo.collision.geometry.ConvexGeometry {
- constructor(radius,halfHeight) {
- super(2);
- this._radius = radius;
- this._halfHeight = halfHeight;
- this._updateMass();
- }
- getRadius() {
- return this._radius;
- }
- getHalfHeight() {
- return this._halfHeight;
- }
- _updateMass() {
- let r2 = this._radius * this._radius;
- let h2 = this._halfHeight * this._halfHeight * 4;
- this._volume = 3.14159265358979 * r2 * this._halfHeight * 2;
- this._inertiaCoeff00 = 0.083333333333333329 * (3 * r2 + h2);
- this._inertiaCoeff01 = 0;
- this._inertiaCoeff02 = 0;
- this._inertiaCoeff10 = 0;
- this._inertiaCoeff11 = 0.5 * r2;
- this._inertiaCoeff12 = 0;
- this._inertiaCoeff20 = 0;
- this._inertiaCoeff21 = 0;
- this._inertiaCoeff22 = 0.083333333333333329 * (3 * r2 + h2);
- }
- _computeAabb(aabb,tf) {
- let axisX;
- let axisY;
- let axisZ;
- let axis2X;
- let axis2Y;
- let axis2Z;
- let ehX;
- let ehY;
- let ehZ;
- let erX;
- let erY;
- let erZ;
- axisX = tf._rotation01;
- axisY = tf._rotation11;
- axisZ = tf._rotation21;
- if(axisX < 0) {
- axisX = -axisX;
- }
- if(axisY < 0) {
- axisY = -axisY;
- }
- if(axisZ < 0) {
- axisZ = -axisZ;
- }
- axis2X = axisX * axisX;
- axis2Y = axisY * axisY;
- axis2Z = axisZ * axisZ;
- erX = Math.sqrt(1 - axis2X);
- erY = Math.sqrt(1 - axis2Y);
- erZ = Math.sqrt(1 - axis2Z);
- erX *= this._radius;
- erY *= this._radius;
- erZ *= this._radius;
- ehX = axisX * this._halfHeight;
- ehY = axisY * this._halfHeight;
- ehZ = axisZ * this._halfHeight;
- let maxX;
- let maxY;
- let maxZ;
- maxX = erX + ehX;
- maxY = erY + ehY;
- maxZ = erZ + ehZ;
- aabb._minX = tf._positionX - maxX;
- aabb._minY = tf._positionY - maxY;
- aabb._minZ = tf._positionZ - maxZ;
- aabb._maxX = tf._positionX + maxX;
- aabb._maxY = tf._positionY + maxY;
- aabb._maxZ = tf._positionZ + maxZ;
- }
- computeLocalSupportingVertex(dir,out) {
- let rx = dir.x;
- let rz = dir.z;
- let len = rx * rx + rz * rz;
- let coreRadius = this._radius - this._gjkMargin;
- if(coreRadius < 0) {
- coreRadius = 0;
- }
- let invLen = len > 0 ? coreRadius / Math.sqrt(len) : 0;
- let coreHeight = this._halfHeight - this._gjkMargin;
- if(coreHeight < 0) {
- coreHeight = 0;
- }
- out.x = rx * invLen;
- out.y = dir.y > 0 ? coreHeight : -coreHeight;
- out.z = rz * invLen;
- }
- _rayCastLocal(beginX,beginY,beginZ,endX,endY,endZ,hit) {
- let halfH = this._halfHeight;
- let dx = endX - beginX;
- let dy = endY - beginY;
- let dz = endZ - beginZ;
- let tminy = 0;
- let tmaxy = 1;
- if(dy > -1e-6 && dy < 1e-6) {
- if(beginY <= -halfH || beginY >= halfH) {
- return false;
- }
- } else {
- let invDy = 1 / dy;
- let t1 = (-halfH - beginY) * invDy;
- let t2 = (halfH - beginY) * invDy;
- if(t1 > t2) {
- let tmp = t1;
- t1 = t2;
- t2 = tmp;
- }
- if(t1 > 0) {
- tminy = t1;
- }
- if(t2 < 1) {
- tmaxy = t2;
- }
- }
- if(tminy >= 1 || tmaxy <= 0) {
- return false;
- }
- let tminxz = 0;
- let tmaxxz;
- let a = dx * dx + dz * dz;
- let b = beginX * dx + beginZ * dz;
- let c = beginX * beginX + beginZ * beginZ - this._radius * this._radius;
- let D = b * b - a * c;
- if(D < 0) {
- return false;
- }
- if(a > 0) {
- let sqrtD = Math.sqrt(D);
- tminxz = (-b - sqrtD) / a;
- tmaxxz = (-b + sqrtD) / a;
- if(tminxz >= 1 || tmaxxz <= 0) {
- return false;
- }
- } else {
- if(c >= 0) {
- return false;
- }
- tminxz = 0;
- tmaxxz = 1;
- }
- let min;
- if(tmaxxz <= tminy || tmaxy <= tminxz) {
- return false;
- }
- if(tminxz < tminy) {
- min = tminy;
- if(min == 0) {
- return false;
- }
- hit.normal.init(0,dy > 0 ? -1 : 1,0);
- } else {
- min = tminxz;
- if(min == 0) {
- return false;
- }
- let _this = hit.normal.init(beginX + dx * min,0,beginZ + dz * min);
- let invLen = Math.sqrt(_this.x * _this.x + _this.y * _this.y + _this.z * _this.z);
- if(invLen > 0) {
- invLen = 1 / invLen;
- }
- _this.x *= invLen;
- _this.y *= invLen;
- _this.z *= invLen;
- }
- hit.position.init(beginX + min * dx,beginY + min * dy,beginZ + min * dz);
- hit.fraction = min;
- return true;
- }
- }
- oimo.collision.geometry.GeometryType = class oimo_collision_geometry_GeometryType {
- }
- oimo.collision.geometry.RayCastHit = class oimo_collision_geometry_RayCastHit {
- constructor() {
- this.position = new oimo.common.Vec3();
- this.normal = new oimo.common.Vec3();
- this.fraction = 0;
- }
- }
- oimo.collision.geometry.SphereGeometry = class oimo_collision_geometry_SphereGeometry extends oimo.collision.geometry.ConvexGeometry {
- constructor(radius) {
- super(0);
- this._radius = radius;
- this._gjkMargin = this._radius;
- this._updateMass();
- }
- getRadius() {
- return this._radius;
- }
- _updateMass() {
- this._volume = 4.1887902047863861 * this._radius * this._radius * this._radius;
- this._inertiaCoeff00 = 0.4 * this._radius * this._radius;
- this._inertiaCoeff01 = 0;
- this._inertiaCoeff02 = 0;
- this._inertiaCoeff10 = 0;
- this._inertiaCoeff11 = 0.4 * this._radius * this._radius;
- this._inertiaCoeff12 = 0;
- this._inertiaCoeff20 = 0;
- this._inertiaCoeff21 = 0;
- this._inertiaCoeff22 = 0.4 * this._radius * this._radius;
- }
- _computeAabb(aabb,tf) {
- let radVecX;
- let radVecY;
- let radVecZ;
- radVecX = this._radius;
- radVecY = this._radius;
- radVecZ = this._radius;
- aabb._minX = tf._positionX - radVecX;
- aabb._minY = tf._positionY - radVecY;
- aabb._minZ = tf._positionZ - radVecZ;
- aabb._maxX = tf._positionX + radVecX;
- aabb._maxY = tf._positionY + radVecY;
- aabb._maxZ = tf._positionZ + radVecZ;
- }
- computeLocalSupportingVertex(dir,out) {
- out.zero();
- }
- _rayCastLocal(beginX,beginY,beginZ,endX,endY,endZ,hit) {
- let dX;
- let dY;
- let dZ;
- dX = endX - beginX;
- dY = endY - beginY;
- dZ = endZ - beginZ;
- let a = dX * dX + dY * dY + dZ * dZ;
- let b = beginX * dX + beginY * dY + beginZ * dZ;
- let D = b * b - a * (beginX * beginX + beginY * beginY + beginZ * beginZ - this._radius * this._radius);
- if(D < 0) {
- return false;
- }
- let t = (-b - Math.sqrt(D)) / a;
- if(t < 0 || t > 1) {
- return false;
- }
- let hitPosX;
- let hitPosY;
- let hitPosZ;
- let hitNormalX;
- let hitNormalY;
- let hitNormalZ;
- hitPosX = beginX + dX * t;
- hitPosY = beginY + dY * t;
- hitPosZ = beginZ + dZ * t;
- let l = hitPosX * hitPosX + hitPosY * hitPosY + hitPosZ * hitPosZ;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- hitNormalX = hitPosX * l;
- hitNormalY = hitPosY * l;
- hitNormalZ = hitPosZ * l;
- let v = hit.position;
- v.x = hitPosX;
- v.y = hitPosY;
- v.z = hitPosZ;
- let v1 = hit.normal;
- v1.x = hitNormalX;
- v1.y = hitNormalY;
- v1.z = hitNormalZ;
- hit.fraction = t;
- return true;
- }
- }
- if(!oimo.collision.narrowphase) oimo.collision.narrowphase = {};
- oimo.collision.narrowphase.CollisionMatrix = class oimo_collision_narrowphase_CollisionMatrix {
- constructor() {
- this.detectors = new Array(8);
- this.detectors[0] = new Array(8);
- this.detectors[1] = new Array(8);
- this.detectors[2] = new Array(8);
- this.detectors[3] = new Array(8);
- this.detectors[4] = new Array(8);
- this.detectors[5] = new Array(8);
- let gjkEpaDetector = new oimo.collision.narrowphase.detector.GjkEpaDetector();
- this.detectors[0][0] = new oimo.collision.narrowphase.detector.SphereSphereDetector();
- this.detectors[0][1] = new oimo.collision.narrowphase.detector.SphereBoxDetector(false);
- this.detectors[0][2] = gjkEpaDetector;
- this.detectors[0][3] = gjkEpaDetector;
- this.detectors[0][4] = new oimo.collision.narrowphase.detector.SphereCapsuleDetector(false);
- this.detectors[0][5] = gjkEpaDetector;
- this.detectors[1][0] = new oimo.collision.narrowphase.detector.SphereBoxDetector(true);
- this.detectors[1][1] = new oimo.collision.narrowphase.detector.BoxBoxDetector();
- this.detectors[1][2] = gjkEpaDetector;
- this.detectors[1][3] = gjkEpaDetector;
- this.detectors[1][4] = gjkEpaDetector;
- this.detectors[1][5] = gjkEpaDetector;
- this.detectors[2][0] = gjkEpaDetector;
- this.detectors[2][1] = gjkEpaDetector;
- this.detectors[2][2] = gjkEpaDetector;
- this.detectors[2][3] = gjkEpaDetector;
- this.detectors[2][4] = gjkEpaDetector;
- this.detectors[2][5] = gjkEpaDetector;
- this.detectors[3][0] = gjkEpaDetector;
- this.detectors[3][1] = gjkEpaDetector;
- this.detectors[3][2] = gjkEpaDetector;
- this.detectors[3][3] = gjkEpaDetector;
- this.detectors[3][4] = gjkEpaDetector;
- this.detectors[3][5] = gjkEpaDetector;
- this.detectors[4][0] = new oimo.collision.narrowphase.detector.SphereCapsuleDetector(true);
- this.detectors[4][1] = gjkEpaDetector;
- this.detectors[4][2] = gjkEpaDetector;
- this.detectors[4][3] = gjkEpaDetector;
- this.detectors[4][4] = new oimo.collision.narrowphase.detector.CapsuleCapsuleDetector();
- this.detectors[4][5] = gjkEpaDetector;
- this.detectors[5][0] = gjkEpaDetector;
- this.detectors[5][1] = gjkEpaDetector;
- this.detectors[5][2] = gjkEpaDetector;
- this.detectors[5][3] = gjkEpaDetector;
- this.detectors[5][4] = gjkEpaDetector;
- this.detectors[5][5] = gjkEpaDetector;
- }
- getDetector(geomType1,geomType2) {
- return this.detectors[geomType1][geomType2];
- }
- }
- oimo.collision.narrowphase.DetectorResult = class oimo_collision_narrowphase_DetectorResult {
- constructor() {
- this.numPoints = 0;
- this.normal = new oimo.common.Vec3();
- this.points = new Array(oimo.common.Setting.maxManifoldPoints);
- this.incremental = false;
- let _g = 0;
- let _g1 = oimo.common.Setting.maxManifoldPoints;
- while(_g < _g1) this.points[_g++] = new oimo.collision.narrowphase.DetectorResultPoint();
- }
- getMaxDepth() {
- let max = 0;
- let _g = 0;
- let _g1 = this.numPoints;
- while(_g < _g1) {
- let i = _g++;
- if(this.points[i].depth > max) {
- max = this.points[i].depth;
- }
- }
- return max;
- }
- clear() {
- this.numPoints = 0;
- let _g = 0;
- let _g1 = this.points;
- while(_g < _g1.length) {
- let p = _g1[_g];
- ++_g;
- p.position1.zero();
- p.position2.zero();
- p.depth = 0;
- p.id = 0;
- }
- this.normal.zero();
- }
- }
- oimo.collision.narrowphase.DetectorResultPoint = class oimo_collision_narrowphase_DetectorResultPoint {
- constructor() {
- this.position1 = new oimo.common.Vec3();
- this.position2 = new oimo.common.Vec3();
- this.depth = 0;
- this.id = 0;
- }
- }
- if(!oimo.collision.narrowphase.detector) oimo.collision.narrowphase.detector = {};
- oimo.collision.narrowphase.detector.Detector = class oimo_collision_narrowphase_detector_Detector {
- constructor(swapped) {
- this.swapped = swapped;
- }
- setNormal(result,nX,nY,nZ) {
- let v = result.normal;
- v.x = nX;
- v.y = nY;
- v.z = nZ;
- if(this.swapped) {
- let _this = result.normal;
- _this.x = -_this.x;
- _this.y = -_this.y;
- _this.z = -_this.z;
- }
- }
- addPoint(result,pos1X,pos1Y,pos1Z,pos2X,pos2Y,pos2Z,depth,id) {
- let p = result.points[result.numPoints++];
- p.depth = depth;
- p.id = id;
- if(this.swapped) {
- let v = p.position1;
- v.x = pos2X;
- v.y = pos2Y;
- v.z = pos2Z;
- let v1 = p.position2;
- v1.x = pos1X;
- v1.y = pos1Y;
- v1.z = pos1Z;
- } else {
- let v = p.position1;
- v.x = pos1X;
- v.y = pos1Y;
- v.z = pos1Z;
- let v1 = p.position2;
- v1.x = pos2X;
- v1.y = pos2Y;
- v1.z = pos2Z;
- }
- }
- detectImpl(result,geom1,geom2,tf1,tf2,cachedData) {
- }
- detect(result,geom1,geom2,transform1,transform2,cachedData) {
- result.numPoints = 0;
- let _g = 0;
- let _g1 = result.points;
- while(_g < _g1.length) {
- let p = _g1[_g];
- ++_g;
- p.position1.zero();
- p.position2.zero();
- p.depth = 0;
- p.id = 0;
- }
- result.normal.zero();
- if(this.swapped) {
- this.detectImpl(result,geom2,geom1,transform2,transform1,cachedData);
- } else {
- this.detectImpl(result,geom1,geom2,transform1,transform2,cachedData);
- }
- }
- }
- oimo.collision.narrowphase.detector.BoxBoxDetector = class oimo_collision_narrowphase_detector_BoxBoxDetector extends oimo.collision.narrowphase.detector.Detector {
- constructor() {
- super(false);
- this.clipper = new oimo.collision.narrowphase.detector._BoxBoxDetector.FaceClipper();
- }
- detectImpl(result,geom1,geom2,tf1,tf2,cachedData) {
- let b1 = geom1;
- let b2 = geom2;
- result.incremental = false;
- let c1X;
- let c1Y;
- let c1Z;
- let c2X;
- let c2Y;
- let c2Z;
- let c12X;
- let c12Y;
- let c12Z;
- c1X = tf1._positionX;
- c1Y = tf1._positionY;
- c1Z = tf1._positionZ;
- c2X = tf2._positionX;
- c2Y = tf2._positionY;
- c2Z = tf2._positionZ;
- c12X = c2X - c1X;
- c12Y = c2Y - c1Y;
- c12Z = c2Z - c1Z;
- let x1X;
- let x1Y;
- let x1Z;
- let y1X;
- let y1Y;
- let y1Z;
- let z1X;
- let z1Y;
- let z1Z;
- let x2X;
- let x2Y;
- let x2Z;
- let y2X;
- let y2Y;
- let y2Z;
- let z2X;
- let z2Y;
- let z2Z;
- x1X = tf1._rotation00;
- x1Y = tf1._rotation10;
- x1Z = tf1._rotation20;
- y1X = tf1._rotation01;
- y1Y = tf1._rotation11;
- y1Z = tf1._rotation21;
- z1X = tf1._rotation02;
- z1Y = tf1._rotation12;
- z1Z = tf1._rotation22;
- x2X = tf2._rotation00;
- x2Y = tf2._rotation10;
- x2Z = tf2._rotation20;
- y2X = tf2._rotation01;
- y2Y = tf2._rotation11;
- y2Z = tf2._rotation21;
- z2X = tf2._rotation02;
- z2Y = tf2._rotation12;
- z2Z = tf2._rotation22;
- let w1 = b1._halfExtentsX;
- let h1 = b1._halfExtentsY;
- let d1 = b1._halfExtentsZ;
- let w2 = b2._halfExtentsX;
- let h2 = b2._halfExtentsY;
- let d2 = b2._halfExtentsZ;
- let sx1X;
- let sx1Y;
- let sx1Z;
- let sy1X;
- let sy1Y;
- let sy1Z;
- let sz1X;
- let sz1Y;
- let sz1Z;
- let sx2X;
- let sx2Y;
- let sx2Z;
- let sy2X;
- let sy2Y;
- let sy2Z;
- let sz2X;
- let sz2Y;
- let sz2Z;
- sx1X = x1X * w1;
- sx1Y = x1Y * w1;
- sx1Z = x1Z * w1;
- sy1X = y1X * h1;
- sy1Y = y1Y * h1;
- sy1Z = y1Z * h1;
- sz1X = z1X * d1;
- sz1Y = z1Y * d1;
- sz1Z = z1Z * d1;
- sx2X = x2X * w2;
- sx2Y = x2Y * w2;
- sx2Z = x2Z * w2;
- sy2X = y2X * h2;
- sy2Y = y2Y * h2;
- sy2Z = y2Z * h2;
- sz2X = z2X * d2;
- sz2Y = z2Y * d2;
- sz2Z = z2Z * d2;
- let mDepth = 1e65536;
- let mId = -1;
- let mSign = 0;
- let mAxisX;
- let mAxisY;
- let mAxisZ;
- mAxisX = 0;
- mAxisY = 0;
- mAxisZ = 0;
- let proj1 = w1;
- let dx = x1X * sx2X + x1Y * sx2Y + x1Z * sx2Z;
- let dy = x1X * sy2X + x1Y * sy2Y + x1Z * sy2Z;
- let dz = x1X * sz2X + x1Y * sz2Y + x1Z * sz2Z;
- if(dx < 0) {
- dx = -dx;
- }
- if(dy < 0) {
- dy = -dy;
- }
- if(dz < 0) {
- dz = -dz;
- }
- let proj2 = dx + dy + dz;
- let projC12 = x1X * c12X + x1Y * c12Y + x1Z * c12Z;
- let sum = proj1 + proj2;
- let neg = projC12 < 0;
- let abs = neg ? -projC12 : projC12;
- if(abs < sum) {
- let depth = sum - abs;
- if(depth < 1e65536) {
- mDepth = depth;
- mId = 0;
- mAxisX = x1X;
- mAxisY = x1Y;
- mAxisZ = x1Z;
- mSign = neg ? -1 : 1;
- }
- } else {
- return;
- }
- proj1 = h1;
- let dx1 = y1X * sx2X + y1Y * sx2Y + y1Z * sx2Z;
- let dy1 = y1X * sy2X + y1Y * sy2Y + y1Z * sy2Z;
- let dz1 = y1X * sz2X + y1Y * sz2Y + y1Z * sz2Z;
- if(dx1 < 0) {
- dx1 = -dx1;
- }
- if(dy1 < 0) {
- dy1 = -dy1;
- }
- if(dz1 < 0) {
- dz1 = -dz1;
- }
- proj2 = dx1 + dy1 + dz1;
- projC12 = y1X * c12X + y1Y * c12Y + y1Z * c12Z;
- let sum1 = proj1 + proj2;
- let neg1 = projC12 < 0;
- let abs1 = neg1 ? -projC12 : projC12;
- if(abs1 < sum1) {
- let depth = sum1 - abs1;
- if(depth < mDepth) {
- mDepth = depth;
- mId = 1;
- mAxisX = y1X;
- mAxisY = y1Y;
- mAxisZ = y1Z;
- mSign = neg1 ? -1 : 1;
- }
- } else {
- return;
- }
- proj1 = d1;
- let dx2 = z1X * sx2X + z1Y * sx2Y + z1Z * sx2Z;
- let dy2 = z1X * sy2X + z1Y * sy2Y + z1Z * sy2Z;
- let dz2 = z1X * sz2X + z1Y * sz2Y + z1Z * sz2Z;
- if(dx2 < 0) {
- dx2 = -dx2;
- }
- if(dy2 < 0) {
- dy2 = -dy2;
- }
- if(dz2 < 0) {
- dz2 = -dz2;
- }
- proj2 = dx2 + dy2 + dz2;
- projC12 = z1X * c12X + z1Y * c12Y + z1Z * c12Z;
- let sum2 = proj1 + proj2;
- let neg2 = projC12 < 0;
- let abs2 = neg2 ? -projC12 : projC12;
- if(abs2 < sum2) {
- let depth = sum2 - abs2;
- if(depth < mDepth) {
- mDepth = depth;
- mId = 2;
- mAxisX = z1X;
- mAxisY = z1Y;
- mAxisZ = z1Z;
- mSign = neg2 ? -1 : 1;
- }
- } else {
- return;
- }
- if(mDepth > oimo.common.Setting.linearSlop) {
- mDepth -= oimo.common.Setting.linearSlop;
- } else {
- mDepth = 0;
- }
- let dx3 = x2X * sx1X + x2Y * sx1Y + x2Z * sx1Z;
- let dy3 = x2X * sy1X + x2Y * sy1Y + x2Z * sy1Z;
- let dz3 = x2X * sz1X + x2Y * sz1Y + x2Z * sz1Z;
- if(dx3 < 0) {
- dx3 = -dx3;
- }
- if(dy3 < 0) {
- dy3 = -dy3;
- }
- if(dz3 < 0) {
- dz3 = -dz3;
- }
- proj1 = dx3 + dy3 + dz3;
- proj2 = w2;
- projC12 = x2X * c12X + x2Y * c12Y + x2Z * c12Z;
- let sum3 = proj1 + proj2;
- let neg3 = projC12 < 0;
- let abs3 = neg3 ? -projC12 : projC12;
- if(abs3 < sum3) {
- let depth = sum3 - abs3;
- if(depth < mDepth) {
- mDepth = depth;
- mId = 3;
- mAxisX = x2X;
- mAxisY = x2Y;
- mAxisZ = x2Z;
- mSign = neg3 ? -1 : 1;
- }
- } else {
- return;
- }
- let dx4 = y2X * sx1X + y2Y * sx1Y + y2Z * sx1Z;
- let dy4 = y2X * sy1X + y2Y * sy1Y + y2Z * sy1Z;
- let dz4 = y2X * sz1X + y2Y * sz1Y + y2Z * sz1Z;
- if(dx4 < 0) {
- dx4 = -dx4;
- }
- if(dy4 < 0) {
- dy4 = -dy4;
- }
- if(dz4 < 0) {
- dz4 = -dz4;
- }
- proj1 = dx4 + dy4 + dz4;
- proj2 = h2;
- projC12 = y2X * c12X + y2Y * c12Y + y2Z * c12Z;
- let sum4 = proj1 + proj2;
- let neg4 = projC12 < 0;
- let abs4 = neg4 ? -projC12 : projC12;
- if(abs4 < sum4) {
- let depth = sum4 - abs4;
- if(depth < mDepth) {
- mDepth = depth;
- mId = 4;
- mAxisX = y2X;
- mAxisY = y2Y;
- mAxisZ = y2Z;
- mSign = neg4 ? -1 : 1;
- }
- } else {
- return;
- }
- let dx5 = z2X * sx1X + z2Y * sx1Y + z2Z * sx1Z;
- let dy5 = z2X * sy1X + z2Y * sy1Y + z2Z * sy1Z;
- let dz5 = z2X * sz1X + z2Y * sz1Y + z2Z * sz1Z;
- if(dx5 < 0) {
- dx5 = -dx5;
- }
- if(dy5 < 0) {
- dy5 = -dy5;
- }
- if(dz5 < 0) {
- dz5 = -dz5;
- }
- proj1 = dx5 + dy5 + dz5;
- proj2 = d2;
- projC12 = z2X * c12X + z2Y * c12Y + z2Z * c12Z;
- let sum5 = proj1 + proj2;
- let neg5 = projC12 < 0;
- let abs5 = neg5 ? -projC12 : projC12;
- if(abs5 < sum5) {
- let depth = sum5 - abs5;
- if(depth < mDepth) {
- mDepth = depth;
- mId = 5;
- mAxisX = z2X;
- mAxisY = z2Y;
- mAxisZ = z2Z;
- mSign = neg5 ? -1 : 1;
- }
- } else {
- return;
- }
- if(mDepth > oimo.common.Setting.linearSlop) {
- mDepth -= oimo.common.Setting.linearSlop;
- } else {
- mDepth = 0;
- }
- let edgeAxisX;
- let edgeAxisY;
- let edgeAxisZ;
- edgeAxisX = x1Y * x2Z - x1Z * x2Y;
- edgeAxisY = x1Z * x2X - x1X * x2Z;
- edgeAxisZ = x1X * x2Y - x1Y * x2X;
- if(!(edgeAxisX == 0 && edgeAxisY == 0 && edgeAxisZ == 0)) {
- let l = edgeAxisX * edgeAxisX + edgeAxisY * edgeAxisY + edgeAxisZ * edgeAxisZ;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- edgeAxisX *= l;
- edgeAxisY *= l;
- edgeAxisZ *= l;
- let dx = edgeAxisX * sy1X + edgeAxisY * sy1Y + edgeAxisZ * sy1Z;
- let dy = edgeAxisX * sz1X + edgeAxisY * sz1Y + edgeAxisZ * sz1Z;
- if(dx < 0) {
- dx = -dx;
- }
- if(dy < 0) {
- dy = -dy;
- }
- proj1 = dx + dy;
- let dx1 = edgeAxisX * sy2X + edgeAxisY * sy2Y + edgeAxisZ * sy2Z;
- let dy1 = edgeAxisX * sz2X + edgeAxisY * sz2Y + edgeAxisZ * sz2Z;
- if(dx1 < 0) {
- dx1 = -dx1;
- }
- if(dy1 < 0) {
- dy1 = -dy1;
- }
- proj2 = dx1 + dy1;
- projC12 = edgeAxisX * c12X + edgeAxisY * c12Y + edgeAxisZ * c12Z;
- let sum = proj1 + proj2;
- let neg = projC12 < 0;
- let abs = neg ? -projC12 : projC12;
- if(abs < sum) {
- let depth = sum - abs;
- if(depth < mDepth) {
- mDepth = depth;
- mId = 6;
- mAxisX = edgeAxisX;
- mAxisY = edgeAxisY;
- mAxisZ = edgeAxisZ;
- mSign = neg ? -1 : 1;
- }
- } else {
- return;
- }
- }
- edgeAxisX = x1Y * y2Z - x1Z * y2Y;
- edgeAxisY = x1Z * y2X - x1X * y2Z;
- edgeAxisZ = x1X * y2Y - x1Y * y2X;
- if(!(edgeAxisX == 0 && edgeAxisY == 0 && edgeAxisZ == 0)) {
- let l = edgeAxisX * edgeAxisX + edgeAxisY * edgeAxisY + edgeAxisZ * edgeAxisZ;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- edgeAxisX *= l;
- edgeAxisY *= l;
- edgeAxisZ *= l;
- let dx = edgeAxisX * sy1X + edgeAxisY * sy1Y + edgeAxisZ * sy1Z;
- let dy = edgeAxisX * sz1X + edgeAxisY * sz1Y + edgeAxisZ * sz1Z;
- if(dx < 0) {
- dx = -dx;
- }
- if(dy < 0) {
- dy = -dy;
- }
- proj1 = dx + dy;
- let dx1 = edgeAxisX * sx2X + edgeAxisY * sx2Y + edgeAxisZ * sx2Z;
- let dy1 = edgeAxisX * sz2X + edgeAxisY * sz2Y + edgeAxisZ * sz2Z;
- if(dx1 < 0) {
- dx1 = -dx1;
- }
- if(dy1 < 0) {
- dy1 = -dy1;
- }
- proj2 = dx1 + dy1;
- projC12 = edgeAxisX * c12X + edgeAxisY * c12Y + edgeAxisZ * c12Z;
- let sum = proj1 + proj2;
- let neg = projC12 < 0;
- let abs = neg ? -projC12 : projC12;
- if(abs < sum) {
- let depth = sum - abs;
- if(depth < mDepth) {
- mDepth = depth;
- mId = 7;
- mAxisX = edgeAxisX;
- mAxisY = edgeAxisY;
- mAxisZ = edgeAxisZ;
- mSign = neg ? -1 : 1;
- }
- } else {
- return;
- }
- }
- edgeAxisX = x1Y * z2Z - x1Z * z2Y;
- edgeAxisY = x1Z * z2X - x1X * z2Z;
- edgeAxisZ = x1X * z2Y - x1Y * z2X;
- if(!(edgeAxisX == 0 && edgeAxisY == 0 && edgeAxisZ == 0)) {
- let l = edgeAxisX * edgeAxisX + edgeAxisY * edgeAxisY + edgeAxisZ * edgeAxisZ;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- edgeAxisX *= l;
- edgeAxisY *= l;
- edgeAxisZ *= l;
- let dx = edgeAxisX * sy1X + edgeAxisY * sy1Y + edgeAxisZ * sy1Z;
- let dy = edgeAxisX * sz1X + edgeAxisY * sz1Y + edgeAxisZ * sz1Z;
- if(dx < 0) {
- dx = -dx;
- }
- if(dy < 0) {
- dy = -dy;
- }
- proj1 = dx + dy;
- let dx1 = edgeAxisX * sx2X + edgeAxisY * sx2Y + edgeAxisZ * sx2Z;
- let dy1 = edgeAxisX * sy2X + edgeAxisY * sy2Y + edgeAxisZ * sy2Z;
- if(dx1 < 0) {
- dx1 = -dx1;
- }
- if(dy1 < 0) {
- dy1 = -dy1;
- }
- proj2 = dx1 + dy1;
- projC12 = edgeAxisX * c12X + edgeAxisY * c12Y + edgeAxisZ * c12Z;
- let sum = proj1 + proj2;
- let neg = projC12 < 0;
- let abs = neg ? -projC12 : projC12;
- if(abs < sum) {
- let depth = sum - abs;
- if(depth < mDepth) {
- mDepth = depth;
- mId = 8;
- mAxisX = edgeAxisX;
- mAxisY = edgeAxisY;
- mAxisZ = edgeAxisZ;
- mSign = neg ? -1 : 1;
- }
- } else {
- return;
- }
- }
- edgeAxisX = y1Y * x2Z - y1Z * x2Y;
- edgeAxisY = y1Z * x2X - y1X * x2Z;
- edgeAxisZ = y1X * x2Y - y1Y * x2X;
- if(!(edgeAxisX == 0 && edgeAxisY == 0 && edgeAxisZ == 0)) {
- let l = edgeAxisX * edgeAxisX + edgeAxisY * edgeAxisY + edgeAxisZ * edgeAxisZ;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- edgeAxisX *= l;
- edgeAxisY *= l;
- edgeAxisZ *= l;
- let dx = edgeAxisX * sx1X + edgeAxisY * sx1Y + edgeAxisZ * sx1Z;
- let dy = edgeAxisX * sz1X + edgeAxisY * sz1Y + edgeAxisZ * sz1Z;
- if(dx < 0) {
- dx = -dx;
- }
- if(dy < 0) {
- dy = -dy;
- }
- proj1 = dx + dy;
- let dx1 = edgeAxisX * sy2X + edgeAxisY * sy2Y + edgeAxisZ * sy2Z;
- let dy1 = edgeAxisX * sz2X + edgeAxisY * sz2Y + edgeAxisZ * sz2Z;
- if(dx1 < 0) {
- dx1 = -dx1;
- }
- if(dy1 < 0) {
- dy1 = -dy1;
- }
- proj2 = dx1 + dy1;
- projC12 = edgeAxisX * c12X + edgeAxisY * c12Y + edgeAxisZ * c12Z;
- let sum = proj1 + proj2;
- let neg = projC12 < 0;
- let abs = neg ? -projC12 : projC12;
- if(abs < sum) {
- let depth = sum - abs;
- if(depth < mDepth) {
- mDepth = depth;
- mId = 9;
- mAxisX = edgeAxisX;
- mAxisY = edgeAxisY;
- mAxisZ = edgeAxisZ;
- mSign = neg ? -1 : 1;
- }
- } else {
- return;
- }
- }
- edgeAxisX = y1Y * y2Z - y1Z * y2Y;
- edgeAxisY = y1Z * y2X - y1X * y2Z;
- edgeAxisZ = y1X * y2Y - y1Y * y2X;
- if(!(edgeAxisX == 0 && edgeAxisY == 0 && edgeAxisZ == 0)) {
- let l = edgeAxisX * edgeAxisX + edgeAxisY * edgeAxisY + edgeAxisZ * edgeAxisZ;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- edgeAxisX *= l;
- edgeAxisY *= l;
- edgeAxisZ *= l;
- let dx = edgeAxisX * sx1X + edgeAxisY * sx1Y + edgeAxisZ * sx1Z;
- let dy = edgeAxisX * sz1X + edgeAxisY * sz1Y + edgeAxisZ * sz1Z;
- if(dx < 0) {
- dx = -dx;
- }
- if(dy < 0) {
- dy = -dy;
- }
- proj1 = dx + dy;
- let dx1 = edgeAxisX * sx2X + edgeAxisY * sx2Y + edgeAxisZ * sx2Z;
- let dy1 = edgeAxisX * sz2X + edgeAxisY * sz2Y + edgeAxisZ * sz2Z;
- if(dx1 < 0) {
- dx1 = -dx1;
- }
- if(dy1 < 0) {
- dy1 = -dy1;
- }
- proj2 = dx1 + dy1;
- projC12 = edgeAxisX * c12X + edgeAxisY * c12Y + edgeAxisZ * c12Z;
- let sum = proj1 + proj2;
- let neg = projC12 < 0;
- let abs = neg ? -projC12 : projC12;
- if(abs < sum) {
- let depth = sum - abs;
- if(depth < mDepth) {
- mDepth = depth;
- mId = 10;
- mAxisX = edgeAxisX;
- mAxisY = edgeAxisY;
- mAxisZ = edgeAxisZ;
- mSign = neg ? -1 : 1;
- }
- } else {
- return;
- }
- }
- edgeAxisX = y1Y * z2Z - y1Z * z2Y;
- edgeAxisY = y1Z * z2X - y1X * z2Z;
- edgeAxisZ = y1X * z2Y - y1Y * z2X;
- if(!(edgeAxisX == 0 && edgeAxisY == 0 && edgeAxisZ == 0)) {
- let l = edgeAxisX * edgeAxisX + edgeAxisY * edgeAxisY + edgeAxisZ * edgeAxisZ;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- edgeAxisX *= l;
- edgeAxisY *= l;
- edgeAxisZ *= l;
- let dx = edgeAxisX * sx1X + edgeAxisY * sx1Y + edgeAxisZ * sx1Z;
- let dy = edgeAxisX * sz1X + edgeAxisY * sz1Y + edgeAxisZ * sz1Z;
- if(dx < 0) {
- dx = -dx;
- }
- if(dy < 0) {
- dy = -dy;
- }
- proj1 = dx + dy;
- let dx1 = edgeAxisX * sx2X + edgeAxisY * sx2Y + edgeAxisZ * sx2Z;
- let dy1 = edgeAxisX * sy2X + edgeAxisY * sy2Y + edgeAxisZ * sy2Z;
- if(dx1 < 0) {
- dx1 = -dx1;
- }
- if(dy1 < 0) {
- dy1 = -dy1;
- }
- proj2 = dx1 + dy1;
- projC12 = edgeAxisX * c12X + edgeAxisY * c12Y + edgeAxisZ * c12Z;
- let sum = proj1 + proj2;
- let neg = projC12 < 0;
- let abs = neg ? -projC12 : projC12;
- if(abs < sum) {
- let depth = sum - abs;
- if(depth < mDepth) {
- mDepth = depth;
- mId = 11;
- mAxisX = edgeAxisX;
- mAxisY = edgeAxisY;
- mAxisZ = edgeAxisZ;
- mSign = neg ? -1 : 1;
- }
- } else {
- return;
- }
- }
- edgeAxisX = z1Y * x2Z - z1Z * x2Y;
- edgeAxisY = z1Z * x2X - z1X * x2Z;
- edgeAxisZ = z1X * x2Y - z1Y * x2X;
- if(!(edgeAxisX == 0 && edgeAxisY == 0 && edgeAxisZ == 0)) {
- let l = edgeAxisX * edgeAxisX + edgeAxisY * edgeAxisY + edgeAxisZ * edgeAxisZ;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- edgeAxisX *= l;
- edgeAxisY *= l;
- edgeAxisZ *= l;
- let dx = edgeAxisX * sx1X + edgeAxisY * sx1Y + edgeAxisZ * sx1Z;
- let dy = edgeAxisX * sy1X + edgeAxisY * sy1Y + edgeAxisZ * sy1Z;
- if(dx < 0) {
- dx = -dx;
- }
- if(dy < 0) {
- dy = -dy;
- }
- proj1 = dx + dy;
- let dx1 = edgeAxisX * sy2X + edgeAxisY * sy2Y + edgeAxisZ * sy2Z;
- let dy1 = edgeAxisX * sz2X + edgeAxisY * sz2Y + edgeAxisZ * sz2Z;
- if(dx1 < 0) {
- dx1 = -dx1;
- }
- if(dy1 < 0) {
- dy1 = -dy1;
- }
- proj2 = dx1 + dy1;
- projC12 = edgeAxisX * c12X + edgeAxisY * c12Y + edgeAxisZ * c12Z;
- let sum = proj1 + proj2;
- let neg = projC12 < 0;
- let abs = neg ? -projC12 : projC12;
- if(abs < sum) {
- let depth = sum - abs;
- if(depth < mDepth) {
- mDepth = depth;
- mId = 12;
- mAxisX = edgeAxisX;
- mAxisY = edgeAxisY;
- mAxisZ = edgeAxisZ;
- mSign = neg ? -1 : 1;
- }
- } else {
- return;
- }
- }
- edgeAxisX = z1Y * y2Z - z1Z * y2Y;
- edgeAxisY = z1Z * y2X - z1X * y2Z;
- edgeAxisZ = z1X * y2Y - z1Y * y2X;
- if(!(edgeAxisX == 0 && edgeAxisY == 0 && edgeAxisZ == 0)) {
- let l = edgeAxisX * edgeAxisX + edgeAxisY * edgeAxisY + edgeAxisZ * edgeAxisZ;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- edgeAxisX *= l;
- edgeAxisY *= l;
- edgeAxisZ *= l;
- let dx = edgeAxisX * sx1X + edgeAxisY * sx1Y + edgeAxisZ * sx1Z;
- let dy = edgeAxisX * sy1X + edgeAxisY * sy1Y + edgeAxisZ * sy1Z;
- if(dx < 0) {
- dx = -dx;
- }
- if(dy < 0) {
- dy = -dy;
- }
- proj1 = dx + dy;
- let dx1 = edgeAxisX * sx2X + edgeAxisY * sx2Y + edgeAxisZ * sx2Z;
- let dy1 = edgeAxisX * sz2X + edgeAxisY * sz2Y + edgeAxisZ * sz2Z;
- if(dx1 < 0) {
- dx1 = -dx1;
- }
- if(dy1 < 0) {
- dy1 = -dy1;
- }
- proj2 = dx1 + dy1;
- projC12 = edgeAxisX * c12X + edgeAxisY * c12Y + edgeAxisZ * c12Z;
- let sum = proj1 + proj2;
- let neg = projC12 < 0;
- let abs = neg ? -projC12 : projC12;
- if(abs < sum) {
- let depth = sum - abs;
- if(depth < mDepth) {
- mDepth = depth;
- mId = 13;
- mAxisX = edgeAxisX;
- mAxisY = edgeAxisY;
- mAxisZ = edgeAxisZ;
- mSign = neg ? -1 : 1;
- }
- } else {
- return;
- }
- }
- edgeAxisX = z1Y * z2Z - z1Z * z2Y;
- edgeAxisY = z1Z * z2X - z1X * z2Z;
- edgeAxisZ = z1X * z2Y - z1Y * z2X;
- if(!(edgeAxisX == 0 && edgeAxisY == 0 && edgeAxisZ == 0)) {
- let l = edgeAxisX * edgeAxisX + edgeAxisY * edgeAxisY + edgeAxisZ * edgeAxisZ;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- edgeAxisX *= l;
- edgeAxisY *= l;
- edgeAxisZ *= l;
- let dx = edgeAxisX * sx1X + edgeAxisY * sx1Y + edgeAxisZ * sx1Z;
- let dy = edgeAxisX * sy1X + edgeAxisY * sy1Y + edgeAxisZ * sy1Z;
- if(dx < 0) {
- dx = -dx;
- }
- if(dy < 0) {
- dy = -dy;
- }
- proj1 = dx + dy;
- let dx1 = edgeAxisX * sx2X + edgeAxisY * sx2Y + edgeAxisZ * sx2Z;
- let dy1 = edgeAxisX * sy2X + edgeAxisY * sy2Y + edgeAxisZ * sy2Z;
- if(dx1 < 0) {
- dx1 = -dx1;
- }
- if(dy1 < 0) {
- dy1 = -dy1;
- }
- proj2 = dx1 + dy1;
- projC12 = edgeAxisX * c12X + edgeAxisY * c12Y + edgeAxisZ * c12Z;
- let sum = proj1 + proj2;
- let neg = projC12 < 0;
- let abs = neg ? -projC12 : projC12;
- if(abs < sum) {
- let depth = sum - abs;
- if(depth < mDepth) {
- mDepth = depth;
- mId = 14;
- mAxisX = edgeAxisX;
- mAxisY = edgeAxisY;
- mAxisZ = edgeAxisZ;
- mSign = neg ? -1 : 1;
- }
- } else {
- return;
- }
- }
- if(mId >= 6) {
- mAxisX *= mSign;
- mAxisY *= mSign;
- mAxisZ *= mSign;
- let id1 = (mId - 6) / 3 | 0;
- let id2 = mId - 6 - id1 * 3;
- let p1X;
- let p1Y;
- let p1Z;
- let p2X;
- let p2Y;
- let p2Z;
- let d1X;
- let d1Y;
- let d1Z;
- let d2X;
- let d2Y;
- let d2Z;
- switch(id1) {
- case 0:
- d1X = x1X;
- d1Y = x1Y;
- d1Z = x1Z;
- let signY = sz1X * mAxisX + sz1Y * mAxisY + sz1Z * mAxisZ > 0;
- if(sy1X * mAxisX + sy1Y * mAxisY + sy1Z * mAxisZ > 0) {
- if(signY) {
- p1X = sy1X + sz1X;
- p1Y = sy1Y + sz1Y;
- p1Z = sy1Z + sz1Z;
- } else {
- p1X = sy1X - sz1X;
- p1Y = sy1Y - sz1Y;
- p1Z = sy1Z - sz1Z;
- }
- } else if(signY) {
- p1X = sz1X - sy1X;
- p1Y = sz1Y - sy1Y;
- p1Z = sz1Z - sy1Z;
- } else {
- p1X = sy1X + sz1X;
- p1Y = sy1Y + sz1Y;
- p1Z = sy1Z + sz1Z;
- p1X = -p1X;
- p1Y = -p1Y;
- p1Z = -p1Z;
- }
- break;
- case 1:
- d1X = y1X;
- d1Y = y1Y;
- d1Z = y1Z;
- let signY1 = sz1X * mAxisX + sz1Y * mAxisY + sz1Z * mAxisZ > 0;
- if(sx1X * mAxisX + sx1Y * mAxisY + sx1Z * mAxisZ > 0) {
- if(signY1) {
- p1X = sx1X + sz1X;
- p1Y = sx1Y + sz1Y;
- p1Z = sx1Z + sz1Z;
- } else {
- p1X = sx1X - sz1X;
- p1Y = sx1Y - sz1Y;
- p1Z = sx1Z - sz1Z;
- }
- } else if(signY1) {
- p1X = sz1X - sx1X;
- p1Y = sz1Y - sx1Y;
- p1Z = sz1Z - sx1Z;
- } else {
- p1X = sx1X + sz1X;
- p1Y = sx1Y + sz1Y;
- p1Z = sx1Z + sz1Z;
- p1X = -p1X;
- p1Y = -p1Y;
- p1Z = -p1Z;
- }
- break;
- default:
- d1X = z1X;
- d1Y = z1Y;
- d1Z = z1Z;
- let signY2 = sy1X * mAxisX + sy1Y * mAxisY + sy1Z * mAxisZ > 0;
- if(sx1X * mAxisX + sx1Y * mAxisY + sx1Z * mAxisZ > 0) {
- if(signY2) {
- p1X = sx1X + sy1X;
- p1Y = sx1Y + sy1Y;
- p1Z = sx1Z + sy1Z;
- } else {
- p1X = sx1X - sy1X;
- p1Y = sx1Y - sy1Y;
- p1Z = sx1Z - sy1Z;
- }
- } else if(signY2) {
- p1X = sy1X - sx1X;
- p1Y = sy1Y - sx1Y;
- p1Z = sy1Z - sx1Z;
- } else {
- p1X = sx1X + sy1X;
- p1Y = sx1Y + sy1Y;
- p1Z = sx1Z + sy1Z;
- p1X = -p1X;
- p1Y = -p1Y;
- p1Z = -p1Z;
- }
- }
- p1X = c1X + p1X;
- p1Y = c1Y + p1Y;
- p1Z = c1Z + p1Z;
- switch(id2) {
- case 0:
- d2X = x2X;
- d2Y = x2Y;
- d2Z = x2Z;
- let signY3 = sz2X * mAxisX + sz2Y * mAxisY + sz2Z * mAxisZ > 0;
- if(sy2X * mAxisX + sy2Y * mAxisY + sy2Z * mAxisZ > 0) {
- if(signY3) {
- p2X = sy2X + sz2X;
- p2Y = sy2Y + sz2Y;
- p2Z = sy2Z + sz2Z;
- } else {
- p2X = sy2X - sz2X;
- p2Y = sy2Y - sz2Y;
- p2Z = sy2Z - sz2Z;
- }
- } else if(signY3) {
- p2X = sz2X - sy2X;
- p2Y = sz2Y - sy2Y;
- p2Z = sz2Z - sy2Z;
- } else {
- p2X = sy2X + sz2X;
- p2Y = sy2Y + sz2Y;
- p2Z = sy2Z + sz2Z;
- p2X = -p2X;
- p2Y = -p2Y;
- p2Z = -p2Z;
- }
- break;
- case 1:
- d2X = y2X;
- d2Y = y2Y;
- d2Z = y2Z;
- let signY4 = sz2X * mAxisX + sz2Y * mAxisY + sz2Z * mAxisZ > 0;
- if(sx2X * mAxisX + sx2Y * mAxisY + sx2Z * mAxisZ > 0) {
- if(signY4) {
- p2X = sx2X + sz2X;
- p2Y = sx2Y + sz2Y;
- p2Z = sx2Z + sz2Z;
- } else {
- p2X = sx2X - sz2X;
- p2Y = sx2Y - sz2Y;
- p2Z = sx2Z - sz2Z;
- }
- } else if(signY4) {
- p2X = sz2X - sx2X;
- p2Y = sz2Y - sx2Y;
- p2Z = sz2Z - sx2Z;
- } else {
- p2X = sx2X + sz2X;
- p2Y = sx2Y + sz2Y;
- p2Z = sx2Z + sz2Z;
- p2X = -p2X;
- p2Y = -p2Y;
- p2Z = -p2Z;
- }
- break;
- default:
- d2X = z2X;
- d2Y = z2Y;
- d2Z = z2Z;
- let signY5 = sy2X * mAxisX + sy2Y * mAxisY + sy2Z * mAxisZ > 0;
- if(sx2X * mAxisX + sx2Y * mAxisY + sx2Z * mAxisZ > 0) {
- if(signY5) {
- p2X = sx2X + sy2X;
- p2Y = sx2Y + sy2Y;
- p2Z = sx2Z + sy2Z;
- } else {
- p2X = sx2X - sy2X;
- p2Y = sx2Y - sy2Y;
- p2Z = sx2Z - sy2Z;
- }
- } else if(signY5) {
- p2X = sy2X - sx2X;
- p2Y = sy2Y - sx2Y;
- p2Z = sy2Z - sx2Z;
- } else {
- p2X = sx2X + sy2X;
- p2Y = sx2Y + sy2Y;
- p2Z = sx2Z + sy2Z;
- p2X = -p2X;
- p2Y = -p2Y;
- p2Z = -p2Z;
- }
- }
- p2X = c2X - p2X;
- p2Y = c2Y - p2Y;
- p2Z = c2Z - p2Z;
- let rX;
- let rY;
- let rZ;
- rX = p1X - p2X;
- rY = p1Y - p2Y;
- rZ = p1Z - p2Z;
- let dot12 = d1X * d2X + d1Y * d2Y + d1Z * d2Z;
- let dot1r = d1X * rX + d1Y * rY + d1Z * rZ;
- let dot2r = d2X * rX + d2Y * rY + d2Z * rZ;
- let invDet = 1 / (1 - dot12 * dot12);
- let t1 = (dot12 * dot2r - dot1r) * invDet;
- let t2 = (dot2r - dot12 * dot1r) * invDet;
- let cp1X;
- let cp1Y;
- let cp1Z;
- let cp2X;
- let cp2Y;
- let cp2Z;
- cp1X = p1X + d1X * t1;
- cp1Y = p1Y + d1Y * t1;
- cp1Z = p1Z + d1Z * t1;
- cp2X = p2X + d2X * t2;
- cp2Y = p2Y + d2Y * t2;
- cp2Z = p2Z + d2Z * t2;
- let normalX;
- let normalY;
- let normalZ;
- normalX = -mAxisX;
- normalY = -mAxisY;
- normalZ = -mAxisZ;
- this.setNormal(result,normalX,normalY,normalZ);
- this.addPoint(result,cp1X,cp1Y,cp1Z,cp2X,cp2Y,cp2Z,mDepth,4);
- return;
- }
- let tmpX;
- let tmpY;
- let tmpZ;
- let swapped;
- if(mId >= 3) {
- mSign = -mSign;
- c12X = -c12X;
- c12Y = -c12Y;
- c12Z = -c12Z;
- w1 = w2;
- h1 = h2;
- d1 = d2;
- c1X = c2X;
- c1Y = c2Y;
- c1Z = c2Z;
- tmpX = x1X;
- tmpY = x1Y;
- tmpZ = x1Z;
- x1X = x2X;
- x1Y = x2Y;
- x1Z = x2Z;
- x2X = tmpX;
- x2Y = tmpY;
- x2Z = tmpZ;
- tmpX = y1X;
- tmpY = y1Y;
- tmpZ = y1Z;
- y1X = y2X;
- y1Y = y2Y;
- y1Z = y2Z;
- y2X = tmpX;
- y2Y = tmpY;
- y2Z = tmpZ;
- tmpX = z1X;
- tmpY = z1Y;
- tmpZ = z1Z;
- z1X = z2X;
- z1Y = z2Y;
- z1Z = z2Z;
- z2X = tmpX;
- z2Y = tmpY;
- z2Z = tmpZ;
- tmpX = sx1X;
- tmpY = sx1Y;
- tmpZ = sx1Z;
- sx1X = sx2X;
- sx1Y = sx2Y;
- sx1Z = sx2Z;
- sx2X = tmpX;
- sx2Y = tmpY;
- sx2Z = tmpZ;
- tmpX = sy1X;
- tmpY = sy1Y;
- tmpZ = sy1Z;
- sy1X = sy2X;
- sy1Y = sy2Y;
- sy1Z = sy2Z;
- sy2X = tmpX;
- sy2Y = tmpY;
- sy2Z = tmpZ;
- tmpX = sz1X;
- tmpY = sz1Y;
- tmpZ = sz1Z;
- sz1X = sz2X;
- sz1Y = sz2Y;
- sz1Z = sz2Z;
- sz2X = tmpX;
- sz2Y = tmpY;
- sz2Z = tmpZ;
- mId -= 3;
- swapped = true;
- } else {
- swapped = false;
- }
- let refCenterX;
- let refCenterY;
- let refCenterZ;
- let refNormalX;
- let refNormalY;
- let refNormalZ;
- let refXX;
- let refXY;
- let refXZ;
- let refYX;
- let refYY;
- let refYZ;
- let refW;
- let refH;
- switch(mId) {
- case 0:
- refCenterX = sx1X;
- refCenterY = sx1Y;
- refCenterZ = sx1Z;
- refNormalX = x1X;
- refNormalY = x1Y;
- refNormalZ = x1Z;
- refXX = y1X;
- refXY = y1Y;
- refXZ = y1Z;
- refYX = z1X;
- refYY = z1Y;
- refYZ = z1Z;
- refW = h1;
- refH = d1;
- break;
- case 1:
- refCenterX = sy1X;
- refCenterY = sy1Y;
- refCenterZ = sy1Z;
- refNormalX = y1X;
- refNormalY = y1Y;
- refNormalZ = y1Z;
- refXX = z1X;
- refXY = z1Y;
- refXZ = z1Z;
- refYX = x1X;
- refYY = x1Y;
- refYZ = x1Z;
- refW = d1;
- refH = w1;
- break;
- default:
- refCenterX = sz1X;
- refCenterY = sz1Y;
- refCenterZ = sz1Z;
- refNormalX = z1X;
- refNormalY = z1Y;
- refNormalZ = z1Z;
- refXX = x1X;
- refXY = x1Y;
- refXZ = x1Z;
- refYX = y1X;
- refYY = y1Y;
- refYZ = y1Z;
- refW = w1;
- refH = h1;
- }
- if(mSign < 0) {
- refCenterX = -refCenterX;
- refCenterY = -refCenterY;
- refCenterZ = -refCenterZ;
- refNormalX = -refNormalX;
- refNormalY = -refNormalY;
- refNormalZ = -refNormalZ;
- tmpX = refXX;
- tmpY = refXY;
- tmpZ = refXZ;
- refXX = refYX;
- refXY = refYY;
- refXZ = refYZ;
- refYX = tmpX;
- refYY = tmpY;
- refYZ = tmpZ;
- let tmp = refW;
- refW = refH;
- refH = tmp;
- }
- refCenterX += c1X;
- refCenterY += c1Y;
- refCenterZ += c1Z;
- let minIncDot = 1;
- let incId = 0;
- let incDot = refNormalX * x2X + refNormalY * x2Y + refNormalZ * x2Z;
- if(incDot < minIncDot) {
- minIncDot = incDot;
- incId = 0;
- }
- if(-incDot < minIncDot) {
- minIncDot = -incDot;
- incId = 1;
- }
- incDot = refNormalX * y2X + refNormalY * y2Y + refNormalZ * y2Z;
- if(incDot < minIncDot) {
- minIncDot = incDot;
- incId = 2;
- }
- if(-incDot < minIncDot) {
- minIncDot = -incDot;
- incId = 3;
- }
- incDot = refNormalX * z2X + refNormalY * z2Y + refNormalZ * z2Z;
- if(incDot < minIncDot) {
- minIncDot = incDot;
- incId = 4;
- }
- if(-incDot < minIncDot) {
- incId = 5;
- }
- let incV1X;
- let incV1Y;
- let incV1Z;
- let incV2X;
- let incV2Y;
- let incV2Z;
- let incV3X;
- let incV3Y;
- let incV3Z;
- let incV4X;
- let incV4Y;
- let incV4Z;
- switch(incId) {
- case 0:
- incV1X = sx2X + sy2X;
- incV1Y = sx2Y + sy2Y;
- incV1Z = sx2Z + sy2Z;
- incV1X += sz2X;
- incV1Y += sz2Y;
- incV1Z += sz2Z;
- incV2X = sx2X - sy2X;
- incV2Y = sx2Y - sy2Y;
- incV2Z = sx2Z - sy2Z;
- incV2X += sz2X;
- incV2Y += sz2Y;
- incV2Z += sz2Z;
- incV3X = sx2X - sy2X;
- incV3Y = sx2Y - sy2Y;
- incV3Z = sx2Z - sy2Z;
- incV3X -= sz2X;
- incV3Y -= sz2Y;
- incV3Z -= sz2Z;
- incV4X = sx2X + sy2X;
- incV4Y = sx2Y + sy2Y;
- incV4Z = sx2Z + sy2Z;
- incV4X -= sz2X;
- incV4Y -= sz2Y;
- incV4Z -= sz2Z;
- break;
- case 1:
- incV1X = sy2X - sx2X;
- incV1Y = sy2Y - sx2Y;
- incV1Z = sy2Z - sx2Z;
- incV1X += sz2X;
- incV1Y += sz2Y;
- incV1Z += sz2Z;
- incV2X = sy2X - sx2X;
- incV2Y = sy2Y - sx2Y;
- incV2Z = sy2Z - sx2Z;
- incV2X -= sz2X;
- incV2Y -= sz2Y;
- incV2Z -= sz2Z;
- incV3X = sx2X + sy2X;
- incV3Y = sx2Y + sy2Y;
- incV3Z = sx2Z + sy2Z;
- incV3X = -incV3X;
- incV3Y = -incV3Y;
- incV3Z = -incV3Z;
- incV3X -= sz2X;
- incV3Y -= sz2Y;
- incV3Z -= sz2Z;
- incV4X = sx2X + sy2X;
- incV4Y = sx2Y + sy2Y;
- incV4Z = sx2Z + sy2Z;
- incV4X = -incV4X;
- incV4Y = -incV4Y;
- incV4Z = -incV4Z;
- incV4X += sz2X;
- incV4Y += sz2Y;
- incV4Z += sz2Z;
- break;
- case 2:
- incV1X = sx2X + sy2X;
- incV1Y = sx2Y + sy2Y;
- incV1Z = sx2Z + sy2Z;
- incV1X += sz2X;
- incV1Y += sz2Y;
- incV1Z += sz2Z;
- incV2X = sx2X + sy2X;
- incV2Y = sx2Y + sy2Y;
- incV2Z = sx2Z + sy2Z;
- incV2X -= sz2X;
- incV2Y -= sz2Y;
- incV2Z -= sz2Z;
- incV3X = sy2X - sx2X;
- incV3Y = sy2Y - sx2Y;
- incV3Z = sy2Z - sx2Z;
- incV3X -= sz2X;
- incV3Y -= sz2Y;
- incV3Z -= sz2Z;
- incV4X = sy2X - sx2X;
- incV4Y = sy2Y - sx2Y;
- incV4Z = sy2Z - sx2Z;
- incV4X += sz2X;
- incV4Y += sz2Y;
- incV4Z += sz2Z;
- break;
- case 3:
- incV1X = sx2X - sy2X;
- incV1Y = sx2Y - sy2Y;
- incV1Z = sx2Z - sy2Z;
- incV1X += sz2X;
- incV1Y += sz2Y;
- incV1Z += sz2Z;
- incV2X = sx2X + sy2X;
- incV2Y = sx2Y + sy2Y;
- incV2Z = sx2Z + sy2Z;
- incV2X = -incV2X;
- incV2Y = -incV2Y;
- incV2Z = -incV2Z;
- incV2X += sz2X;
- incV2Y += sz2Y;
- incV2Z += sz2Z;
- incV3X = sx2X + sy2X;
- incV3Y = sx2Y + sy2Y;
- incV3Z = sx2Z + sy2Z;
- incV3X = -incV3X;
- incV3Y = -incV3Y;
- incV3Z = -incV3Z;
- incV3X -= sz2X;
- incV3Y -= sz2Y;
- incV3Z -= sz2Z;
- incV4X = sx2X - sy2X;
- incV4Y = sx2Y - sy2Y;
- incV4Z = sx2Z - sy2Z;
- incV4X -= sz2X;
- incV4Y -= sz2Y;
- incV4Z -= sz2Z;
- break;
- case 4:
- incV1X = sx2X + sy2X;
- incV1Y = sx2Y + sy2Y;
- incV1Z = sx2Z + sy2Z;
- incV1X += sz2X;
- incV1Y += sz2Y;
- incV1Z += sz2Z;
- incV2X = sy2X - sx2X;
- incV2Y = sy2Y - sx2Y;
- incV2Z = sy2Z - sx2Z;
- incV2X += sz2X;
- incV2Y += sz2Y;
- incV2Z += sz2Z;
- incV3X = sx2X + sy2X;
- incV3Y = sx2Y + sy2Y;
- incV3Z = sx2Z + sy2Z;
- incV3X = -incV3X;
- incV3Y = -incV3Y;
- incV3Z = -incV3Z;
- incV3X += sz2X;
- incV3Y += sz2Y;
- incV3Z += sz2Z;
- incV4X = sx2X - sy2X;
- incV4Y = sx2Y - sy2Y;
- incV4Z = sx2Z - sy2Z;
- incV4X += sz2X;
- incV4Y += sz2Y;
- incV4Z += sz2Z;
- break;
- default:
- incV1X = sx2X + sy2X;
- incV1Y = sx2Y + sy2Y;
- incV1Z = sx2Z + sy2Z;
- incV1X -= sz2X;
- incV1Y -= sz2Y;
- incV1Z -= sz2Z;
- incV2X = sx2X - sy2X;
- incV2Y = sx2Y - sy2Y;
- incV2Z = sx2Z - sy2Z;
- incV2X -= sz2X;
- incV2Y -= sz2Y;
- incV2Z -= sz2Z;
- incV3X = sx2X + sy2X;
- incV3Y = sx2Y + sy2Y;
- incV3Z = sx2Z + sy2Z;
- incV3X = -incV3X;
- incV3Y = -incV3Y;
- incV3Z = -incV3Z;
- incV3X -= sz2X;
- incV3Y -= sz2Y;
- incV3Z -= sz2Z;
- incV4X = sy2X - sx2X;
- incV4Y = sy2Y - sx2Y;
- incV4Z = sy2Z - sx2Z;
- incV4X -= sz2X;
- incV4Y -= sz2Y;
- incV4Z -= sz2Z;
- }
- incV1X += c12X;
- incV1Y += c12Y;
- incV1Z += c12Z;
- incV2X += c12X;
- incV2Y += c12Y;
- incV2Z += c12Z;
- incV3X += c12X;
- incV3Y += c12Y;
- incV3Z += c12Z;
- incV4X += c12X;
- incV4Y += c12Y;
- incV4Z += c12Z;
- let _this = this.clipper;
- _this.w = refW;
- _this.h = refH;
- _this.numVertices = 0;
- _this.numTmpVertices = 0;
- let _this1 = this.clipper;
- let _this2 = _this1.vertices[_this1.numVertices++];
- _this2.x = incV1X * refXX + incV1Y * refXY + incV1Z * refXZ;
- _this2.y = incV1X * refYX + incV1Y * refYY + incV1Z * refYZ;
- _this2.wx = incV1X;
- _this2.wy = incV1Y;
- _this2.wz = incV1Z;
- let _this3 = this.clipper;
- let _this4 = _this3.vertices[_this3.numVertices++];
- _this4.x = incV2X * refXX + incV2Y * refXY + incV2Z * refXZ;
- _this4.y = incV2X * refYX + incV2Y * refYY + incV2Z * refYZ;
- _this4.wx = incV2X;
- _this4.wy = incV2Y;
- _this4.wz = incV2Z;
- let _this5 = this.clipper;
- let _this6 = _this5.vertices[_this5.numVertices++];
- _this6.x = incV3X * refXX + incV3Y * refXY + incV3Z * refXZ;
- _this6.y = incV3X * refYX + incV3Y * refYY + incV3Z * refYZ;
- _this6.wx = incV3X;
- _this6.wy = incV3Y;
- _this6.wz = incV3Z;
- let _this7 = this.clipper;
- let _this8 = _this7.vertices[_this7.numVertices++];
- _this8.x = incV4X * refXX + incV4Y * refXY + incV4Z * refXZ;
- _this8.y = incV4X * refYX + incV4Y * refYY + incV4Z * refYZ;
- _this8.wx = incV4X;
- _this8.wy = incV4Y;
- _this8.wz = incV4Z;
- this.clipper.clip();
- this.clipper.reduce();
- let normalX;
- let normalY;
- let normalZ;
- if(swapped) {
- normalX = refNormalX;
- normalY = refNormalY;
- normalZ = refNormalZ;
- } else {
- normalX = -refNormalX;
- normalY = -refNormalY;
- normalZ = -refNormalZ;
- }
- this.setNormal(result,normalX,normalY,normalZ);
- let _g = 0;
- let _g1 = this.clipper.numVertices;
- while(_g < _g1) {
- let i = _g++;
- let v = this.clipper.vertices[i];
- let clippedVertexX;
- let clippedVertexY;
- let clippedVertexZ;
- clippedVertexX = v.wx;
- clippedVertexY = v.wy;
- clippedVertexZ = v.wz;
- clippedVertexX += c1X;
- clippedVertexY += c1Y;
- clippedVertexZ += c1Z;
- let clippedVertexToRefCenterX;
- let clippedVertexToRefCenterY;
- let clippedVertexToRefCenterZ;
- clippedVertexToRefCenterX = refCenterX - clippedVertexX;
- clippedVertexToRefCenterY = refCenterY - clippedVertexY;
- clippedVertexToRefCenterZ = refCenterZ - clippedVertexZ;
- let depth = clippedVertexToRefCenterX * refNormalX + clippedVertexToRefCenterY * refNormalY + clippedVertexToRefCenterZ * refNormalZ;
- let clippedVertexOnRefFaceX;
- let clippedVertexOnRefFaceY;
- let clippedVertexOnRefFaceZ;
- clippedVertexOnRefFaceX = clippedVertexX + refNormalX * depth;
- clippedVertexOnRefFaceY = clippedVertexY + refNormalY * depth;
- clippedVertexOnRefFaceZ = clippedVertexZ + refNormalZ * depth;
- if(depth > -oimo.common.Setting.contactPersistenceThreshold) {
- if(swapped) {
- this.addPoint(result,clippedVertexX,clippedVertexY,clippedVertexZ,clippedVertexOnRefFaceX,clippedVertexOnRefFaceY,clippedVertexOnRefFaceZ,depth,i);
- } else {
- this.addPoint(result,clippedVertexOnRefFaceX,clippedVertexOnRefFaceY,clippedVertexOnRefFaceZ,clippedVertexX,clippedVertexY,clippedVertexZ,depth,i);
- }
- }
- }
- }
- }
- if(!oimo.collision.narrowphase.detector._BoxBoxDetector) oimo.collision.narrowphase.detector._BoxBoxDetector = {};
- oimo.collision.narrowphase.detector._BoxBoxDetector.IncidentVertex = class oimo_collision_narrowphase_detector__$BoxBoxDetector_IncidentVertex {
- constructor() {
- this.x = 0;
- this.y = 0;
- this.wx = 0;
- this.wy = 0;
- this.wz = 0;
- }
- }
- oimo.collision.narrowphase.detector._BoxBoxDetector.FaceClipper = class oimo_collision_narrowphase_detector__$BoxBoxDetector_FaceClipper {
- constructor() {
- this.w = 0;
- this.h = 0;
- this.numVertices = 0;
- this.numTmpVertices = 0;
- this.vertices = new Array(8);
- this.tmpVertices = new Array(8);
- this.vertices[0] = new oimo.collision.narrowphase.detector._BoxBoxDetector.IncidentVertex();
- this.tmpVertices[0] = new oimo.collision.narrowphase.detector._BoxBoxDetector.IncidentVertex();
- this.vertices[1] = new oimo.collision.narrowphase.detector._BoxBoxDetector.IncidentVertex();
- this.tmpVertices[1] = new oimo.collision.narrowphase.detector._BoxBoxDetector.IncidentVertex();
- this.vertices[2] = new oimo.collision.narrowphase.detector._BoxBoxDetector.IncidentVertex();
- this.tmpVertices[2] = new oimo.collision.narrowphase.detector._BoxBoxDetector.IncidentVertex();
- this.vertices[3] = new oimo.collision.narrowphase.detector._BoxBoxDetector.IncidentVertex();
- this.tmpVertices[3] = new oimo.collision.narrowphase.detector._BoxBoxDetector.IncidentVertex();
- this.vertices[4] = new oimo.collision.narrowphase.detector._BoxBoxDetector.IncidentVertex();
- this.tmpVertices[4] = new oimo.collision.narrowphase.detector._BoxBoxDetector.IncidentVertex();
- this.vertices[5] = new oimo.collision.narrowphase.detector._BoxBoxDetector.IncidentVertex();
- this.tmpVertices[5] = new oimo.collision.narrowphase.detector._BoxBoxDetector.IncidentVertex();
- this.vertices[6] = new oimo.collision.narrowphase.detector._BoxBoxDetector.IncidentVertex();
- this.tmpVertices[6] = new oimo.collision.narrowphase.detector._BoxBoxDetector.IncidentVertex();
- this.vertices[7] = new oimo.collision.narrowphase.detector._BoxBoxDetector.IncidentVertex();
- this.tmpVertices[7] = new oimo.collision.narrowphase.detector._BoxBoxDetector.IncidentVertex();
- }
- clip() {
- let _g = 0;
- let _g1 = this.numVertices;
- while(_g < _g1) {
- let i = _g++;
- let v1 = this.vertices[i];
- let v2 = this.vertices[(i + 1) % this.numVertices];
- let s1 = this.w + v1.x;
- let s2 = this.w + v2.x;
- if(s1 > 0 && s2 > 0) {
- let _this = this.tmpVertices[this.numTmpVertices++];
- _this.x = v1.x;
- _this.y = v1.y;
- _this.wx = v1.wx;
- _this.wy = v1.wy;
- _this.wz = v1.wz;
- } else if(s1 > 0 && s2 <= 0) {
- let _this = this.tmpVertices[this.numTmpVertices++];
- _this.x = v1.x;
- _this.y = v1.y;
- _this.wx = v1.wx;
- _this.wy = v1.wy;
- _this.wz = v1.wz;
- let t = s1 / (s1 - s2);
- let _this1 = this.tmpVertices[this.numTmpVertices++];
- _this1.x = v1.x + (v2.x - v1.x) * t;
- _this1.y = v1.y + (v2.y - v1.y) * t;
- _this1.wx = v1.wx + (v2.wx - v1.wx) * t;
- _this1.wy = v1.wy + (v2.wy - v1.wy) * t;
- _this1.wz = v1.wz + (v2.wz - v1.wz) * t;
- } else if(s1 <= 0 && s2 > 0) {
- let t = s1 / (s1 - s2);
- let _this = this.tmpVertices[this.numTmpVertices++];
- _this.x = v1.x + (v2.x - v1.x) * t;
- _this.y = v1.y + (v2.y - v1.y) * t;
- _this.wx = v1.wx + (v2.wx - v1.wx) * t;
- _this.wy = v1.wy + (v2.wy - v1.wy) * t;
- _this.wz = v1.wz + (v2.wz - v1.wz) * t;
- }
- }
- let tmp = this.vertices;
- this.vertices = this.tmpVertices;
- this.tmpVertices = tmp;
- this.numVertices = this.numTmpVertices;
- this.numTmpVertices = 0;
- let _g2 = 0;
- let _g3 = this.numVertices;
- while(_g2 < _g3) {
- let i = _g2++;
- let v1 = this.vertices[i];
- let v2 = this.vertices[(i + 1) % this.numVertices];
- let s1 = this.w - v1.x;
- let s2 = this.w - v2.x;
- if(s1 > 0 && s2 > 0) {
- let _this = this.tmpVertices[this.numTmpVertices++];
- _this.x = v1.x;
- _this.y = v1.y;
- _this.wx = v1.wx;
- _this.wy = v1.wy;
- _this.wz = v1.wz;
- } else if(s1 > 0 && s2 <= 0) {
- let _this = this.tmpVertices[this.numTmpVertices++];
- _this.x = v1.x;
- _this.y = v1.y;
- _this.wx = v1.wx;
- _this.wy = v1.wy;
- _this.wz = v1.wz;
- let t = s1 / (s1 - s2);
- let _this1 = this.tmpVertices[this.numTmpVertices++];
- _this1.x = v1.x + (v2.x - v1.x) * t;
- _this1.y = v1.y + (v2.y - v1.y) * t;
- _this1.wx = v1.wx + (v2.wx - v1.wx) * t;
- _this1.wy = v1.wy + (v2.wy - v1.wy) * t;
- _this1.wz = v1.wz + (v2.wz - v1.wz) * t;
- } else if(s1 <= 0 && s2 > 0) {
- let t = s1 / (s1 - s2);
- let _this = this.tmpVertices[this.numTmpVertices++];
- _this.x = v1.x + (v2.x - v1.x) * t;
- _this.y = v1.y + (v2.y - v1.y) * t;
- _this.wx = v1.wx + (v2.wx - v1.wx) * t;
- _this.wy = v1.wy + (v2.wy - v1.wy) * t;
- _this.wz = v1.wz + (v2.wz - v1.wz) * t;
- }
- }
- let tmp1 = this.vertices;
- this.vertices = this.tmpVertices;
- this.tmpVertices = tmp1;
- this.numVertices = this.numTmpVertices;
- this.numTmpVertices = 0;
- let _g4 = 0;
- let _g5 = this.numVertices;
- while(_g4 < _g5) {
- let i = _g4++;
- let v1 = this.vertices[i];
- let v2 = this.vertices[(i + 1) % this.numVertices];
- let s1 = this.h + v1.y;
- let s2 = this.h + v2.y;
- if(s1 > 0 && s2 > 0) {
- let _this = this.tmpVertices[this.numTmpVertices++];
- _this.x = v1.x;
- _this.y = v1.y;
- _this.wx = v1.wx;
- _this.wy = v1.wy;
- _this.wz = v1.wz;
- } else if(s1 > 0 && s2 <= 0) {
- let _this = this.tmpVertices[this.numTmpVertices++];
- _this.x = v1.x;
- _this.y = v1.y;
- _this.wx = v1.wx;
- _this.wy = v1.wy;
- _this.wz = v1.wz;
- let t = s1 / (s1 - s2);
- let _this1 = this.tmpVertices[this.numTmpVertices++];
- _this1.x = v1.x + (v2.x - v1.x) * t;
- _this1.y = v1.y + (v2.y - v1.y) * t;
- _this1.wx = v1.wx + (v2.wx - v1.wx) * t;
- _this1.wy = v1.wy + (v2.wy - v1.wy) * t;
- _this1.wz = v1.wz + (v2.wz - v1.wz) * t;
- } else if(s1 <= 0 && s2 > 0) {
- let t = s1 / (s1 - s2);
- let _this = this.tmpVertices[this.numTmpVertices++];
- _this.x = v1.x + (v2.x - v1.x) * t;
- _this.y = v1.y + (v2.y - v1.y) * t;
- _this.wx = v1.wx + (v2.wx - v1.wx) * t;
- _this.wy = v1.wy + (v2.wy - v1.wy) * t;
- _this.wz = v1.wz + (v2.wz - v1.wz) * t;
- }
- }
- let tmp2 = this.vertices;
- this.vertices = this.tmpVertices;
- this.tmpVertices = tmp2;
- this.numVertices = this.numTmpVertices;
- this.numTmpVertices = 0;
- let _g6 = 0;
- let _g7 = this.numVertices;
- while(_g6 < _g7) {
- let i = _g6++;
- let v1 = this.vertices[i];
- let v2 = this.vertices[(i + 1) % this.numVertices];
- let s1 = this.h - v1.y;
- let s2 = this.h - v2.y;
- if(s1 > 0 && s2 > 0) {
- let _this = this.tmpVertices[this.numTmpVertices++];
- _this.x = v1.x;
- _this.y = v1.y;
- _this.wx = v1.wx;
- _this.wy = v1.wy;
- _this.wz = v1.wz;
- } else if(s1 > 0 && s2 <= 0) {
- let _this = this.tmpVertices[this.numTmpVertices++];
- _this.x = v1.x;
- _this.y = v1.y;
- _this.wx = v1.wx;
- _this.wy = v1.wy;
- _this.wz = v1.wz;
- let t = s1 / (s1 - s2);
- let _this1 = this.tmpVertices[this.numTmpVertices++];
- _this1.x = v1.x + (v2.x - v1.x) * t;
- _this1.y = v1.y + (v2.y - v1.y) * t;
- _this1.wx = v1.wx + (v2.wx - v1.wx) * t;
- _this1.wy = v1.wy + (v2.wy - v1.wy) * t;
- _this1.wz = v1.wz + (v2.wz - v1.wz) * t;
- } else if(s1 <= 0 && s2 > 0) {
- let t = s1 / (s1 - s2);
- let _this = this.tmpVertices[this.numTmpVertices++];
- _this.x = v1.x + (v2.x - v1.x) * t;
- _this.y = v1.y + (v2.y - v1.y) * t;
- _this.wx = v1.wx + (v2.wx - v1.wx) * t;
- _this.wy = v1.wy + (v2.wy - v1.wy) * t;
- _this.wz = v1.wz + (v2.wz - v1.wz) * t;
- }
- }
- let tmp3 = this.vertices;
- this.vertices = this.tmpVertices;
- this.tmpVertices = tmp3;
- this.numVertices = this.numTmpVertices;
- this.numTmpVertices = 0;
- }
- reduce() {
- if(this.numVertices < 4) {
- return;
- }
- let max1 = -1e65536;
- let min1 = 1e65536;
- let max2 = -1e65536;
- let min2 = 1e65536;
- let max1V = null;
- let min1V = null;
- let max2V = null;
- let min2V = null;
- let e1x = 1;
- let e1y = 1;
- let e2x = -1;
- let e2y = 1;
- let _g = 0;
- let _g1 = this.numVertices;
- while(_g < _g1) {
- let v = this.vertices[_g++];
- let dot1 = v.x * e1x + v.y * e1y;
- let dot2 = v.x * e2x + v.y * e2y;
- if(dot1 > max1) {
- max1 = dot1;
- max1V = v;
- }
- if(dot1 < min1) {
- min1 = dot1;
- min1V = v;
- }
- if(dot2 > max2) {
- max2 = dot2;
- max2V = v;
- }
- if(dot2 < min2) {
- min2 = dot2;
- min2V = v;
- }
- }
- let _this = this.tmpVertices[this.numTmpVertices++];
- _this.x = max1V.x;
- _this.y = max1V.y;
- _this.wx = max1V.wx;
- _this.wy = max1V.wy;
- _this.wz = max1V.wz;
- let _this1 = this.tmpVertices[this.numTmpVertices++];
- _this1.x = max2V.x;
- _this1.y = max2V.y;
- _this1.wx = max2V.wx;
- _this1.wy = max2V.wy;
- _this1.wz = max2V.wz;
- let _this2 = this.tmpVertices[this.numTmpVertices++];
- _this2.x = min1V.x;
- _this2.y = min1V.y;
- _this2.wx = min1V.wx;
- _this2.wy = min1V.wy;
- _this2.wz = min1V.wz;
- let _this3 = this.tmpVertices[this.numTmpVertices++];
- _this3.x = min2V.x;
- _this3.y = min2V.y;
- _this3.wx = min2V.wx;
- _this3.wy = min2V.wy;
- _this3.wz = min2V.wz;
- let tmp = this.vertices;
- this.vertices = this.tmpVertices;
- this.tmpVertices = tmp;
- this.numVertices = this.numTmpVertices;
- this.numTmpVertices = 0;
- }
- }
- oimo.collision.narrowphase.detector.BoxBoxDetectorMacro = class oimo_collision_narrowphase_detector_BoxBoxDetectorMacro {
- }
- oimo.collision.narrowphase.detector.CachedDetectorData = class oimo_collision_narrowphase_detector_CachedDetectorData {
- constructor() {
- }
- _clear() {
- if(this._gjkCache != null) {
- this._gjkCache.clear();
- }
- }
- }
- oimo.collision.narrowphase.detector.CapsuleCapsuleDetector = class oimo_collision_narrowphase_detector_CapsuleCapsuleDetector extends oimo.collision.narrowphase.detector.Detector {
- constructor() {
- super(false);
- }
- detectImpl(result,geom1,geom2,tf1,tf2,cachedData) {
- let c1 = geom1;
- let c2 = geom2;
- result.incremental = false;
- let axis1X;
- let axis1Y;
- let axis1Z;
- let axis2X;
- let axis2Y;
- let axis2Z;
- axis1X = tf1._rotation01;
- axis1Y = tf1._rotation11;
- axis1Z = tf1._rotation21;
- axis2X = tf2._rotation01;
- axis2Y = tf2._rotation11;
- axis2Z = tf2._rotation21;
- let hh1 = c1._halfHeight;
- let hh2 = c2._halfHeight;
- let r1 = c1._radius;
- let r2 = c2._radius;
- let p1X;
- let p1Y;
- let p1Z;
- let q1X;
- let q1Y;
- let q1Z;
- let p2X;
- let p2Y;
- let p2Z;
- let q2X;
- let q2Y;
- let q2Z;
- p1X = tf1._positionX + axis1X * -hh1;
- p1Y = tf1._positionY + axis1Y * -hh1;
- p1Z = tf1._positionZ + axis1Z * -hh1;
- q1X = tf1._positionX + axis1X * hh1;
- q1Y = tf1._positionY + axis1Y * hh1;
- q1Z = tf1._positionZ + axis1Z * hh1;
- p2X = tf2._positionX + axis2X * -hh2;
- p2Y = tf2._positionY + axis2Y * -hh2;
- p2Z = tf2._positionZ + axis2Z * -hh2;
- q2X = tf2._positionX + axis2X * hh2;
- q2Y = tf2._positionY + axis2Y * hh2;
- q2Z = tf2._positionZ + axis2Z * hh2;
- let p12X;
- let p12Y;
- let p12Z;
- p12X = p1X - p2X;
- p12Y = p1Y - p2Y;
- p12Z = p1Z - p2Z;
- let d1X;
- let d1Y;
- let d1Z;
- let d2X;
- let d2Y;
- let d2Z;
- d1X = q1X - p1X;
- d1Y = q1Y - p1Y;
- d1Z = q1Z - p1Z;
- d2X = q2X - p2X;
- d2Y = q2Y - p2Y;
- d2Z = q2Z - p2Z;
- let p21d1 = -(p12X * d1X + p12Y * d1Y + p12Z * d1Z);
- let p12d2 = p12X * d2X + p12Y * d2Y + p12Z * d2Z;
- let d11 = hh1 * hh1 * 4;
- let d12 = d1X * d2X + d1Y * d2Y + d1Z * d2Z;
- let d22 = hh2 * hh2 * 4;
- let t1;
- let t2;
- if(d11 == 0 && d22 == 0) {
- t1 = 0;
- t2 = 0;
- } else if(d11 == 0) {
- t1 = 0;
- if(p12d2 < 0) {
- t2 = 0;
- } else if(p12d2 > d22) {
- t2 = 1;
- } else {
- t2 = p12d2 / d22;
- }
- } else if(d22 == 0) {
- t2 = 0;
- if(p21d1 < 0) {
- t1 = 0;
- } else if(p21d1 > d11) {
- t1 = 1;
- } else {
- t1 = p21d1 / d11;
- }
- } else {
- let det = d11 * d22 - d12 * d12;
- if(det == 0) {
- t1 = 0;
- } else {
- t1 = d12 * p12d2 + d22 * p21d1;
- if(t1 < 0) {
- t1 = 0;
- } else if(t1 > det) {
- t1 = 1;
- } else {
- t1 /= det;
- }
- }
- t2 = t1 * d12 + p12d2;
- if(t2 < 0) {
- t2 = 0;
- if(p21d1 < 0) {
- t1 = 0;
- } else if(p21d1 > d11) {
- t1 = 1;
- } else {
- t1 = p21d1 / d11;
- }
- } else if(t2 > d22) {
- t2 = 1;
- t1 = d12 + p21d1;
- if(t1 < 0) {
- t1 = 0;
- } else if(t1 > d11) {
- t1 = 1;
- } else {
- t1 /= d11;
- }
- } else {
- t2 /= d22;
- }
- }
- let cp1X;
- let cp1Y;
- let cp1Z;
- let cp2X;
- let cp2Y;
- let cp2Z;
- cp1X = p1X + d1X * t1;
- cp1Y = p1Y + d1Y * t1;
- cp1Z = p1Z + d1Z * t1;
- cp2X = p2X + d2X * t2;
- cp2Y = p2Y + d2Y * t2;
- cp2Z = p2Z + d2Z * t2;
- let dX;
- let dY;
- let dZ;
- dX = cp1X - cp2X;
- dY = cp1Y - cp2Y;
- dZ = cp1Z - cp2Z;
- let len2 = dX * dX + dY * dY + dZ * dZ;
- if(len2 >= (r1 + r2) * (r1 + r2)) {
- return;
- }
- let len = Math.sqrt(len2);
- let nX;
- let nY;
- let nZ;
- if(len > 0) {
- nX = dX * (1 / len);
- nY = dY * (1 / len);
- nZ = dZ * (1 / len);
- } else {
- nX = 1;
- nY = 0;
- nZ = 0;
- }
- this.setNormal(result,nX,nY,nZ);
- let pos1X;
- let pos1Y;
- let pos1Z;
- let pos2X;
- let pos2Y;
- let pos2Z;
- pos1X = cp1X + nX * -r1;
- pos1Y = cp1Y + nY * -r1;
- pos1Z = cp1Z + nZ * -r1;
- pos2X = cp2X + nX * r2;
- pos2Y = cp2Y + nY * r2;
- pos2Z = cp2Z + nZ * r2;
- this.addPoint(result,pos1X,pos1Y,pos1Z,pos2X,pos2Y,pos2Z,r1 + r2 - len,0);
- }
- }
- oimo.collision.narrowphase.detector.GjkEpaDetector = class oimo_collision_narrowphase_detector_GjkEpaDetector extends oimo.collision.narrowphase.detector.Detector {
- constructor() {
- super(false);
- }
- detectImpl(result,geom1,geom2,tf1,tf2,cachedData) {
- let gjkEpa = oimo.collision.narrowphase.detector.gjkepa.GjkEpa.instance;
- let g1 = geom1;
- let g2 = geom2;
- let status = gjkEpa.computeClosestPointsImpl(g1,g2,tf1,tf2,oimo.common.Setting.enableGJKCaching ? cachedData : null,true);
- result.incremental = true;
- if(status != oimo.collision.narrowphase.detector.gjkepa.GjkEpaResultState.SUCCEEDED) {
- console.log("src/oimo/collision/narrowphase/detector/GjkEpaDetector.hx:28:","GJK/EPA failed: status=" + status);
- return;
- }
- if(gjkEpa.distance > g1._gjkMargin + g2._gjkMargin) {
- return;
- }
- let pos1X;
- let pos1Y;
- let pos1Z;
- let pos2X;
- let pos2Y;
- let pos2Z;
- let v = gjkEpa.closestPoint1;
- pos1X = v.x;
- pos1Y = v.y;
- pos1Z = v.z;
- let v1 = gjkEpa.closestPoint2;
- pos2X = v1.x;
- pos2Y = v1.y;
- pos2Z = v1.z;
- let normalX;
- let normalY;
- let normalZ;
- normalX = pos1X - pos2X;
- normalY = pos1Y - pos2Y;
- normalZ = pos1Z - pos2Z;
- if(normalX * normalX + normalY * normalY + normalZ * normalZ == 0) {
- return;
- }
- if(gjkEpa.distance < 0) {
- normalX = -normalX;
- normalY = -normalY;
- normalZ = -normalZ;
- }
- let l = normalX * normalX + normalY * normalY + normalZ * normalZ;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- normalX *= l;
- normalY *= l;
- normalZ *= l;
- this.setNormal(result,normalX,normalY,normalZ);
- pos1X += normalX * -g1._gjkMargin;
- pos1Y += normalY * -g1._gjkMargin;
- pos1Z += normalZ * -g1._gjkMargin;
- pos2X += normalX * g2._gjkMargin;
- pos2Y += normalY * g2._gjkMargin;
- pos2Z += normalZ * g2._gjkMargin;
- this.addPoint(result,pos1X,pos1Y,pos1Z,pos2X,pos2Y,pos2Z,g1._gjkMargin + g2._gjkMargin - gjkEpa.distance,0);
- }
- }
- oimo.collision.narrowphase.detector.SphereBoxDetector = class oimo_collision_narrowphase_detector_SphereBoxDetector extends oimo.collision.narrowphase.detector.Detector {
- constructor(swapped) {
- super(swapped);
- }
- detectImpl(result,geom1,geom2,tf1,tf2,cachedData) {
- let b = geom2;
- result.incremental = false;
- let halfExtX;
- let halfExtY;
- let halfExtZ;
- let negHalfExtX;
- let negHalfExtY;
- let negHalfExtZ;
- halfExtX = b._halfExtentsX;
- halfExtY = b._halfExtentsY;
- halfExtZ = b._halfExtentsZ;
- negHalfExtX = -halfExtX;
- negHalfExtY = -halfExtY;
- negHalfExtZ = -halfExtZ;
- let r = geom1._radius;
- let boxToSphereX;
- let boxToSphereY;
- let boxToSphereZ;
- boxToSphereX = tf1._positionX - tf2._positionX;
- boxToSphereY = tf1._positionY - tf2._positionY;
- boxToSphereZ = tf1._positionZ - tf2._positionZ;
- let boxToSphereInBoxX;
- let boxToSphereInBoxY;
- let boxToSphereInBoxZ;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = tf2._rotation00 * boxToSphereX + tf2._rotation10 * boxToSphereY + tf2._rotation20 * boxToSphereZ;
- __tmp__Y = tf2._rotation01 * boxToSphereX + tf2._rotation11 * boxToSphereY + tf2._rotation21 * boxToSphereZ;
- __tmp__Z = tf2._rotation02 * boxToSphereX + tf2._rotation12 * boxToSphereY + tf2._rotation22 * boxToSphereZ;
- boxToSphereInBoxX = __tmp__X;
- boxToSphereInBoxY = __tmp__Y;
- boxToSphereInBoxZ = __tmp__Z;
- if(negHalfExtX < boxToSphereInBoxX && halfExtX > boxToSphereInBoxX && negHalfExtY < boxToSphereInBoxY && halfExtY > boxToSphereInBoxY && negHalfExtZ < boxToSphereInBoxZ && halfExtZ > boxToSphereInBoxZ) {
- let sphereToBoxSurfaceX;
- let sphereToBoxSurfaceY;
- let sphereToBoxSurfaceZ;
- sphereToBoxSurfaceX = boxToSphereInBoxX < 0 ? -boxToSphereInBoxX : boxToSphereInBoxX;
- sphereToBoxSurfaceY = boxToSphereInBoxY < 0 ? -boxToSphereInBoxY : boxToSphereInBoxY;
- sphereToBoxSurfaceZ = boxToSphereInBoxZ < 0 ? -boxToSphereInBoxZ : boxToSphereInBoxZ;
- sphereToBoxSurfaceX = halfExtX - sphereToBoxSurfaceX;
- sphereToBoxSurfaceY = halfExtY - sphereToBoxSurfaceY;
- sphereToBoxSurfaceZ = halfExtZ - sphereToBoxSurfaceZ;
- let normalInBoxX;
- let normalInBoxY;
- let normalInBoxZ;
- let distX = sphereToBoxSurfaceX;
- let distY = sphereToBoxSurfaceY;
- let distZ = sphereToBoxSurfaceZ;
- let depth;
- let projectionMaskX;
- let projectionMaskY;
- let projectionMaskZ;
- if(distX < distY) {
- if(distX < distZ) {
- if(boxToSphereInBoxX > 0) {
- normalInBoxX = 1;
- normalInBoxY = 0;
- normalInBoxZ = 0;
- } else {
- normalInBoxX = -1;
- normalInBoxY = 0;
- normalInBoxZ = 0;
- }
- projectionMaskX = 0;
- projectionMaskY = 1;
- projectionMaskZ = 1;
- depth = distX;
- } else {
- if(boxToSphereInBoxZ > 0) {
- normalInBoxX = 0;
- normalInBoxY = 0;
- normalInBoxZ = 1;
- } else {
- normalInBoxX = 0;
- normalInBoxY = 0;
- normalInBoxZ = -1;
- }
- projectionMaskX = 1;
- projectionMaskY = 1;
- projectionMaskZ = 0;
- depth = distZ;
- }
- } else if(distY < distZ) {
- if(boxToSphereInBoxY > 0) {
- normalInBoxX = 0;
- normalInBoxY = 1;
- normalInBoxZ = 0;
- } else {
- normalInBoxX = 0;
- normalInBoxY = -1;
- normalInBoxZ = 0;
- }
- projectionMaskX = 1;
- projectionMaskY = 0;
- projectionMaskZ = 1;
- depth = distY;
- } else {
- if(boxToSphereInBoxZ > 0) {
- normalInBoxX = 0;
- normalInBoxY = 0;
- normalInBoxZ = 1;
- } else {
- normalInBoxX = 0;
- normalInBoxY = 0;
- normalInBoxZ = -1;
- }
- projectionMaskX = 1;
- projectionMaskY = 1;
- projectionMaskZ = 0;
- depth = distZ;
- }
- let baseX;
- let baseY;
- let baseZ;
- baseX = projectionMaskX * boxToSphereInBoxX;
- baseY = projectionMaskY * boxToSphereInBoxY;
- baseZ = projectionMaskZ * boxToSphereInBoxZ;
- let boxToClosestPointInBoxX;
- let boxToClosestPointInBoxY;
- let boxToClosestPointInBoxZ;
- boxToClosestPointInBoxX = normalInBoxX * halfExtX;
- boxToClosestPointInBoxY = normalInBoxY * halfExtY;
- boxToClosestPointInBoxZ = normalInBoxZ * halfExtZ;
- boxToClosestPointInBoxX += baseX;
- boxToClosestPointInBoxY += baseY;
- boxToClosestPointInBoxZ += baseZ;
- let boxToClosestPointX;
- let boxToClosestPointY;
- let boxToClosestPointZ;
- let normalX;
- let normalY;
- let normalZ;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = tf2._rotation00 * boxToClosestPointInBoxX + tf2._rotation01 * boxToClosestPointInBoxY + tf2._rotation02 * boxToClosestPointInBoxZ;
- __tmp__Y = tf2._rotation10 * boxToClosestPointInBoxX + tf2._rotation11 * boxToClosestPointInBoxY + tf2._rotation12 * boxToClosestPointInBoxZ;
- __tmp__Z = tf2._rotation20 * boxToClosestPointInBoxX + tf2._rotation21 * boxToClosestPointInBoxY + tf2._rotation22 * boxToClosestPointInBoxZ;
- boxToClosestPointX = __tmp__X;
- boxToClosestPointY = __tmp__Y;
- boxToClosestPointZ = __tmp__Z;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = tf2._rotation00 * normalInBoxX + tf2._rotation01 * normalInBoxY + tf2._rotation02 * normalInBoxZ;
- __tmp__Y1 = tf2._rotation10 * normalInBoxX + tf2._rotation11 * normalInBoxY + tf2._rotation12 * normalInBoxZ;
- __tmp__Z1 = tf2._rotation20 * normalInBoxX + tf2._rotation21 * normalInBoxY + tf2._rotation22 * normalInBoxZ;
- normalX = __tmp__X1;
- normalY = __tmp__Y1;
- normalZ = __tmp__Z1;
- this.setNormal(result,normalX,normalY,normalZ);
- let pos1X;
- let pos1Y;
- let pos1Z;
- let pos2X;
- let pos2Y;
- let pos2Z;
- pos1X = tf1._positionX + normalX * -r;
- pos1Y = tf1._positionY + normalY * -r;
- pos1Z = tf1._positionZ + normalZ * -r;
- pos2X = tf2._positionX + boxToClosestPointX;
- pos2Y = tf2._positionY + boxToClosestPointY;
- pos2Z = tf2._positionZ + boxToClosestPointZ;
- this.addPoint(result,pos1X,pos1Y,pos1Z,pos2X,pos2Y,pos2Z,depth,0);
- return;
- }
- let boxToClosestPointInBoxX;
- let boxToClosestPointInBoxY;
- let boxToClosestPointInBoxZ;
- halfExtX -= 1e-9;
- halfExtY -= 1e-9;
- halfExtZ -= 1e-9;
- negHalfExtX += 1e-9;
- negHalfExtY += 1e-9;
- negHalfExtZ += 1e-9;
- boxToClosestPointInBoxX = boxToSphereInBoxX < halfExtX ? boxToSphereInBoxX : halfExtX;
- boxToClosestPointInBoxY = boxToSphereInBoxY < halfExtY ? boxToSphereInBoxY : halfExtY;
- boxToClosestPointInBoxZ = boxToSphereInBoxZ < halfExtZ ? boxToSphereInBoxZ : halfExtZ;
- if(!(boxToClosestPointInBoxX > negHalfExtX)) {
- boxToClosestPointInBoxX = negHalfExtX;
- }
- if(!(boxToClosestPointInBoxY > negHalfExtY)) {
- boxToClosestPointInBoxY = negHalfExtY;
- }
- if(!(boxToClosestPointInBoxZ > negHalfExtZ)) {
- boxToClosestPointInBoxZ = negHalfExtZ;
- }
- let closestPointToSphereInBoxX;
- let closestPointToSphereInBoxY;
- let closestPointToSphereInBoxZ;
- closestPointToSphereInBoxX = boxToSphereInBoxX - boxToClosestPointInBoxX;
- closestPointToSphereInBoxY = boxToSphereInBoxY - boxToClosestPointInBoxY;
- closestPointToSphereInBoxZ = boxToSphereInBoxZ - boxToClosestPointInBoxZ;
- let dist = closestPointToSphereInBoxX * closestPointToSphereInBoxX + closestPointToSphereInBoxY * closestPointToSphereInBoxY + closestPointToSphereInBoxZ * closestPointToSphereInBoxZ;
- if(dist >= r * r) {
- return;
- }
- dist = Math.sqrt(dist);
- let boxToClosestPointX;
- let boxToClosestPointY;
- let boxToClosestPointZ;
- let closestPointToSphereX;
- let closestPointToSphereY;
- let closestPointToSphereZ;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = tf2._rotation00 * boxToClosestPointInBoxX + tf2._rotation01 * boxToClosestPointInBoxY + tf2._rotation02 * boxToClosestPointInBoxZ;
- __tmp__Y1 = tf2._rotation10 * boxToClosestPointInBoxX + tf2._rotation11 * boxToClosestPointInBoxY + tf2._rotation12 * boxToClosestPointInBoxZ;
- __tmp__Z1 = tf2._rotation20 * boxToClosestPointInBoxX + tf2._rotation21 * boxToClosestPointInBoxY + tf2._rotation22 * boxToClosestPointInBoxZ;
- boxToClosestPointX = __tmp__X1;
- boxToClosestPointY = __tmp__Y1;
- boxToClosestPointZ = __tmp__Z1;
- let __tmp__X2;
- let __tmp__Y2;
- let __tmp__Z2;
- __tmp__X2 = tf2._rotation00 * closestPointToSphereInBoxX + tf2._rotation01 * closestPointToSphereInBoxY + tf2._rotation02 * closestPointToSphereInBoxZ;
- __tmp__Y2 = tf2._rotation10 * closestPointToSphereInBoxX + tf2._rotation11 * closestPointToSphereInBoxY + tf2._rotation12 * closestPointToSphereInBoxZ;
- __tmp__Z2 = tf2._rotation20 * closestPointToSphereInBoxX + tf2._rotation21 * closestPointToSphereInBoxY + tf2._rotation22 * closestPointToSphereInBoxZ;
- closestPointToSphereX = __tmp__X2;
- closestPointToSphereY = __tmp__Y2;
- closestPointToSphereZ = __tmp__Z2;
- let normalX;
- let normalY;
- let normalZ;
- let l = closestPointToSphereX * closestPointToSphereX + closestPointToSphereY * closestPointToSphereY + closestPointToSphereZ * closestPointToSphereZ;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- normalX = closestPointToSphereX * l;
- normalY = closestPointToSphereY * l;
- normalZ = closestPointToSphereZ * l;
- this.setNormal(result,normalX,normalY,normalZ);
- let pos1X;
- let pos1Y;
- let pos1Z;
- let pos2X;
- let pos2Y;
- let pos2Z;
- pos1X = tf1._positionX + normalX * -r;
- pos1Y = tf1._positionY + normalY * -r;
- pos1Z = tf1._positionZ + normalZ * -r;
- pos2X = tf2._positionX + boxToClosestPointX;
- pos2Y = tf2._positionY + boxToClosestPointY;
- pos2Z = tf2._positionZ + boxToClosestPointZ;
- this.addPoint(result,pos1X,pos1Y,pos1Z,pos2X,pos2Y,pos2Z,r - dist,0);
- }
- }
- oimo.collision.narrowphase.detector.SphereCapsuleDetector = class oimo_collision_narrowphase_detector_SphereCapsuleDetector extends oimo.collision.narrowphase.detector.Detector {
- constructor(swapped) {
- super(swapped);
- }
- detectImpl(result,geom1,geom2,tf1,tf2,cachedData) {
- let c2 = geom2;
- result.incremental = false;
- let hh2 = c2._halfHeight;
- let r1 = geom1._radius;
- let r2 = c2._radius;
- let axis2X;
- let axis2Y;
- let axis2Z;
- axis2X = tf2._rotation01;
- axis2Y = tf2._rotation11;
- axis2Z = tf2._rotation21;
- let cp1X;
- let cp1Y;
- let cp1Z;
- cp1X = tf1._positionX;
- cp1Y = tf1._positionY;
- cp1Z = tf1._positionZ;
- let p2X;
- let p2Y;
- let p2Z;
- let q2X;
- let q2Y;
- let q2Z;
- p2X = tf2._positionX + axis2X * -hh2;
- p2Y = tf2._positionY + axis2Y * -hh2;
- p2Z = tf2._positionZ + axis2Z * -hh2;
- q2X = tf2._positionX + axis2X * hh2;
- q2Y = tf2._positionY + axis2Y * hh2;
- q2Z = tf2._positionZ + axis2Z * hh2;
- let p12X;
- let p12Y;
- let p12Z;
- p12X = cp1X - p2X;
- p12Y = cp1Y - p2Y;
- p12Z = cp1Z - p2Z;
- let d2X;
- let d2Y;
- let d2Z;
- d2X = q2X - p2X;
- d2Y = q2Y - p2Y;
- d2Z = q2Z - p2Z;
- let d22 = hh2 * hh2 * 4;
- let t = p12X * d2X + p12Y * d2Y + p12Z * d2Z;
- if(t < 0) {
- t = 0;
- } else if(t > d22) {
- t = 1;
- } else {
- t /= d22;
- }
- let cp2X;
- let cp2Y;
- let cp2Z;
- cp2X = p2X + d2X * t;
- cp2Y = p2Y + d2Y * t;
- cp2Z = p2Z + d2Z * t;
- let dX;
- let dY;
- let dZ;
- dX = cp1X - cp2X;
- dY = cp1Y - cp2Y;
- dZ = cp1Z - cp2Z;
- let len2 = dX * dX + dY * dY + dZ * dZ;
- if(len2 >= (r1 + r2) * (r1 + r2)) {
- return;
- }
- let len = Math.sqrt(len2);
- let nX;
- let nY;
- let nZ;
- if(len > 0) {
- nX = dX * (1 / len);
- nY = dY * (1 / len);
- nZ = dZ * (1 / len);
- } else {
- nX = 1;
- nY = 0;
- nZ = 0;
- }
- this.setNormal(result,nX,nY,nZ);
- let pos1X;
- let pos1Y;
- let pos1Z;
- let pos2X;
- let pos2Y;
- let pos2Z;
- pos1X = cp1X + nX * -r1;
- pos1Y = cp1Y + nY * -r1;
- pos1Z = cp1Z + nZ * -r1;
- pos2X = cp2X + nX * r2;
- pos2Y = cp2Y + nY * r2;
- pos2Z = cp2Z + nZ * r2;
- this.addPoint(result,pos1X,pos1Y,pos1Z,pos2X,pos2Y,pos2Z,r1 + r2 - len,0);
- }
- }
- oimo.collision.narrowphase.detector.SphereSphereDetector = class oimo_collision_narrowphase_detector_SphereSphereDetector extends oimo.collision.narrowphase.detector.Detector {
- constructor() {
- super(false);
- }
- detectImpl(result,geom1,geom2,tf1,tf2,cachedData) {
- result.incremental = false;
- let dX;
- let dY;
- let dZ;
- dX = tf1._positionX - tf2._positionX;
- dY = tf1._positionY - tf2._positionY;
- dZ = tf1._positionZ - tf2._positionZ;
- let r1 = geom1._radius;
- let r2 = geom2._radius;
- let len2 = dX * dX + dY * dY + dZ * dZ;
- if(len2 >= (r1 + r2) * (r1 + r2)) {
- return;
- }
- let len = Math.sqrt(len2);
- let nX;
- let nY;
- let nZ;
- if(len > 0) {
- nX = dX * (1 / len);
- nY = dY * (1 / len);
- nZ = dZ * (1 / len);
- } else {
- nX = 1;
- nY = 0;
- nZ = 0;
- }
- this.setNormal(result,nX,nY,nZ);
- let pos1X;
- let pos1Y;
- let pos1Z;
- let pos2X;
- let pos2Y;
- let pos2Z;
- pos1X = tf1._positionX + nX * -r1;
- pos1Y = tf1._positionY + nY * -r1;
- pos1Z = tf1._positionZ + nZ * -r1;
- pos2X = tf2._positionX + nX * r2;
- pos2Y = tf2._positionY + nY * r2;
- pos2Z = tf2._positionZ + nZ * r2;
- this.addPoint(result,pos1X,pos1Y,pos1Z,pos2X,pos2Y,pos2Z,r1 + r2 - len,0);
- }
- }
- if(!oimo.collision.narrowphase.detector.gjkepa) oimo.collision.narrowphase.detector.gjkepa = {};
- oimo.collision.narrowphase.detector.gjkepa.EpaPolyhedron = class oimo_collision_narrowphase_detector_gjkepa_EpaPolyhedron {
- constructor() {
- this._vertices = new Array(oimo.common.Setting.maxEPAVertices);
- this._center = new oimo.common.Vec3();
- this._numVertices = 0;
- this._triangleList = null;
- this._triangleListLast = null;
- this._numTriangles = 0;
- this._trianglePool = null;
- this._vertexPool = null;
- }
- dumpHoleEdge(first) {
- }
- validate() {
- let t = this._triangleList;
- while(t != null) {
- t._vertices[0]._tmpEdgeLoopOuterTriangle = null;
- t._vertices[0]._tmpEdgeLoopNext = null;
- if(t._adjacentPairIndex[0] == -1) {
- this._status = 2;
- return false;
- }
- if(t._adjacentTriangles[0] == null) {
- this._status = 3;
- return false;
- }
- t._vertices[1]._tmpEdgeLoopOuterTriangle = null;
- t._vertices[1]._tmpEdgeLoopNext = null;
- if(t._adjacentPairIndex[1] == -1) {
- this._status = 2;
- return false;
- }
- if(t._adjacentTriangles[1] == null) {
- this._status = 3;
- return false;
- }
- t._vertices[2]._tmpEdgeLoopOuterTriangle = null;
- t._vertices[2]._tmpEdgeLoopNext = null;
- if(t._adjacentPairIndex[2] == -1) {
- this._status = 2;
- return false;
- }
- if(t._adjacentTriangles[2] == null) {
- this._status = 3;
- return false;
- }
- t = t._next;
- }
- return true;
- }
- findEdgeLoop(id,base,from) {
- if(base._tmpDfsId == id) {
- return;
- }
- base._tmpDfsId = id;
- let _this = base.tmp;
- _this.x = from.x;
- _this.y = from.y;
- _this.z = from.z;
- let v = base._vertices[0].v;
- _this.x -= v.x;
- _this.y -= v.y;
- _this.z -= v.z;
- let _this1 = base.tmp;
- let v1 = base._normal;
- base._tmpDfsVisible = _this1.x * v1.x + _this1.y * v1.y + _this1.z * v1.z > 0;
- if(!base._tmpDfsVisible) {
- this._status = 6;
- return;
- }
- let _g = 0;
- while(_g < 3) {
- let i = _g++;
- let t = base._adjacentTriangles[i];
- if(t == null) {
- continue;
- }
- let _this = t.tmp;
- _this.x = from.x;
- _this.y = from.y;
- _this.z = from.z;
- let v = t._vertices[0].v;
- _this.x -= v.x;
- _this.y -= v.y;
- _this.z -= v.z;
- let _this1 = t.tmp;
- let v1 = t._normal;
- t._tmpDfsVisible = _this1.x * v1.x + _this1.y * v1.y + _this1.z * v1.z > 0;
- if(t._tmpDfsVisible) {
- this.findEdgeLoop(id,t,from);
- } else {
- let v1 = base._vertices[i];
- v1._tmpEdgeLoopNext = base._vertices[base._nextIndex[i]];
- v1._tmpEdgeLoopOuterTriangle = t;
- }
- }
- let triangle = base._adjacentTriangles[0];
- if(triangle != null) {
- let pairIndex = base._adjacentPairIndex[0];
- triangle._adjacentTriangles[pairIndex] = null;
- triangle._adjacentPairIndex[pairIndex] = -1;
- base._adjacentTriangles[0] = null;
- base._adjacentPairIndex[0] = -1;
- }
- let triangle1 = base._adjacentTriangles[1];
- if(triangle1 != null) {
- let pairIndex = base._adjacentPairIndex[1];
- triangle1._adjacentTriangles[pairIndex] = null;
- triangle1._adjacentPairIndex[pairIndex] = -1;
- base._adjacentTriangles[1] = null;
- base._adjacentPairIndex[1] = -1;
- }
- let triangle2 = base._adjacentTriangles[2];
- if(triangle2 != null) {
- let pairIndex = base._adjacentPairIndex[2];
- triangle2._adjacentTriangles[pairIndex] = null;
- triangle2._adjacentPairIndex[pairIndex] = -1;
- base._adjacentTriangles[2] = null;
- base._adjacentPairIndex[2] = -1;
- }
- this._numTriangles--;
- let prev = base._prev;
- let next = base._next;
- if(prev != null) {
- prev._next = next;
- }
- if(next != null) {
- next._prev = prev;
- }
- if(base == this._triangleList) {
- this._triangleList = this._triangleList._next;
- }
- if(base == this._triangleListLast) {
- this._triangleListLast = this._triangleListLast._prev;
- }
- base._next = null;
- base._prev = null;
- base.removeReferences();
- base._next = this._trianglePool;
- this._trianglePool = base;
- }
- _init(v1,v2,v3,v4) {
- this._status = 0;
- this._numVertices = 4;
- this._vertices[0] = v1;
- this._vertices[1] = v2;
- this._vertices[2] = v3;
- this._vertices[3] = v4;
- let _this = this._center;
- let v = v1.v;
- _this.x = v.x;
- _this.y = v.y;
- _this.z = v.z;
- let v5 = v2.v;
- _this.x += v5.x;
- _this.y += v5.y;
- _this.z += v5.z;
- let v6 = v3.v;
- _this.x += v6.x;
- _this.y += v6.y;
- _this.z += v6.z;
- let v7 = v4.v;
- _this.x += v7.x;
- _this.y += v7.y;
- _this.z += v7.z;
- _this.x *= 0.25;
- _this.y *= 0.25;
- _this.z *= 0.25;
- let first = this._trianglePool;
- if(first != null) {
- this._trianglePool = first._next;
- first._next = null;
- } else {
- first = new oimo.collision.narrowphase.detector.gjkepa.EpaTriangle();
- }
- let t1 = first;
- let first1 = this._trianglePool;
- if(first1 != null) {
- this._trianglePool = first1._next;
- first1._next = null;
- } else {
- first1 = new oimo.collision.narrowphase.detector.gjkepa.EpaTriangle();
- }
- let t2 = first1;
- let first2 = this._trianglePool;
- if(first2 != null) {
- this._trianglePool = first2._next;
- first2._next = null;
- } else {
- first2 = new oimo.collision.narrowphase.detector.gjkepa.EpaTriangle();
- }
- let t3 = first2;
- let first3 = this._trianglePool;
- if(first3 != null) {
- this._trianglePool = first3._next;
- first3._next = null;
- } else {
- first3 = new oimo.collision.narrowphase.detector.gjkepa.EpaTriangle();
- }
- let t4 = first3;
- if(!t1.init(v1,v2,v3,this._center,true)) {
- this._status = 1;
- }
- if(!t2.init(v1,v2,v4,this._center,true)) {
- this._status = 1;
- }
- if(!t3.init(v1,v3,v4,this._center,true)) {
- this._status = 1;
- }
- if(!t4.init(v2,v3,v4,this._center,true)) {
- this._status = 1;
- }
- if(!t1.setAdjacentTriangle(t2)) {
- this._status = 1;
- }
- if(!t1.setAdjacentTriangle(t3)) {
- this._status = 1;
- }
- if(!t1.setAdjacentTriangle(t4)) {
- this._status = 1;
- }
- if(!t2.setAdjacentTriangle(t3)) {
- this._status = 1;
- }
- if(!t2.setAdjacentTriangle(t4)) {
- this._status = 1;
- }
- if(!t3.setAdjacentTriangle(t4)) {
- this._status = 1;
- }
- this._numTriangles++;
- if(this._triangleList == null) {
- this._triangleList = t1;
- this._triangleListLast = t1;
- } else {
- this._triangleListLast._next = t1;
- t1._prev = this._triangleListLast;
- this._triangleListLast = t1;
- }
- this._numTriangles++;
- if(this._triangleList == null) {
- this._triangleList = t2;
- this._triangleListLast = t2;
- } else {
- this._triangleListLast._next = t2;
- t2._prev = this._triangleListLast;
- this._triangleListLast = t2;
- }
- this._numTriangles++;
- if(this._triangleList == null) {
- this._triangleList = t3;
- this._triangleListLast = t3;
- } else {
- this._triangleListLast._next = t3;
- t3._prev = this._triangleListLast;
- this._triangleListLast = t3;
- }
- this._numTriangles++;
- if(this._triangleList == null) {
- this._triangleList = t4;
- this._triangleListLast = t4;
- } else {
- this._triangleListLast._next = t4;
- t4._prev = this._triangleListLast;
- this._triangleListLast = t4;
- }
- return this._status == 0;
- }
- _addVertex(vertex,base) {
- this._vertices[this._numVertices++] = vertex;
- let v1 = base._vertices[0];
- this.findEdgeLoop(this._numVertices,base,vertex.v);
- if(this._status != 0) {
- return false;
- }
- let v = v1;
- let prevT = null;
- let firstT = null;
- while(true) {
- if(v._tmpEdgeLoopNext == null) {
- this._dumpAsObjModel();
- this._status = 4;
- return false;
- }
- if(v._tmpEdgeLoopOuterTriangle == null) {
- this._status = 5;
- return false;
- }
- let first = this._trianglePool;
- if(first != null) {
- this._trianglePool = first._next;
- first._next = null;
- } else {
- first = new oimo.collision.narrowphase.detector.gjkepa.EpaTriangle();
- }
- let t = first;
- if(firstT == null) {
- firstT = t;
- }
- if(!t.init(v,v._tmpEdgeLoopNext,vertex,this._center,false)) {
- this._status = 1;
- }
- if(this._status != 0) {
- return false;
- }
- this._numTriangles++;
- if(this._triangleList == null) {
- this._triangleList = t;
- this._triangleListLast = t;
- } else {
- this._triangleListLast._next = t;
- t._prev = this._triangleListLast;
- this._triangleListLast = t;
- }
- if(!t.setAdjacentTriangle(v._tmpEdgeLoopOuterTriangle)) {
- this._status = 1;
- }
- if(prevT != null) {
- if(!t.setAdjacentTriangle(prevT)) {
- this._status = 1;
- }
- }
- prevT = t;
- v = v._tmpEdgeLoopNext;
- if(!(v != v1)) {
- break;
- }
- }
- if(!prevT.setAdjacentTriangle(firstT)) {
- this._status = 1;
- }
- if(this._status == 0) {
- return this.validate();
- } else {
- return false;
- }
- }
- _dumpAsObjModel() {
- }
- }
- oimo.collision.narrowphase.detector.gjkepa.EpaPolyhedronState = class oimo_collision_narrowphase_detector_gjkepa_EpaPolyhedronState {
- }
- oimo.collision.narrowphase.detector.gjkepa.EpaTriangle = class oimo_collision_narrowphase_detector_gjkepa_EpaTriangle {
- constructor() {
- this.id = ++oimo.collision.narrowphase.detector.gjkepa.EpaTriangle.count;
- this._next = null;
- this._prev = null;
- this._normal = new oimo.common.Vec3();
- this._distanceSq = 0;
- this._tmpDfsId = 0;
- this._tmpDfsVisible = false;
- this._vertices = new Array(3);
- this._adjacentTriangles = new Array(3);
- this._adjacentPairIndex = new Array(3);
- this.tmp = new oimo.common.Vec3();
- this._nextIndex = new Array(3);
- this._nextIndex[0] = 1;
- this._nextIndex[1] = 2;
- this._nextIndex[2] = 0;
- }
- init(vertex1,vertex2,vertex3,center,autoCheck) {
- if(autoCheck == null) {
- autoCheck = false;
- }
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- let v3X;
- let v3Y;
- let v3Z;
- let vcX;
- let vcY;
- let vcZ;
- let v = vertex1.v;
- v1X = v.x;
- v1Y = v.y;
- v1Z = v.z;
- let v1 = vertex2.v;
- v2X = v1.x;
- v2Y = v1.y;
- v2Z = v1.z;
- let v2 = vertex3.v;
- v3X = v2.x;
- v3Y = v2.y;
- v3Z = v2.z;
- vcX = center.x;
- vcY = center.y;
- vcZ = center.z;
- let v12X;
- let v12Y;
- let v12Z;
- let v13X;
- let v13Y;
- let v13Z;
- let vc1X;
- let vc1Y;
- let vc1Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- v13X = v3X - v1X;
- v13Y = v3Y - v1Y;
- v13Z = v3Z - v1Z;
- vc1X = v1X - vcX;
- vc1Y = v1Y - vcY;
- vc1Z = v1Z - vcZ;
- let inorX;
- let inorY;
- let inorZ;
- inorX = v12Y * v13Z - v12Z * v13Y;
- inorY = v12Z * v13X - v12X * v13Z;
- inorZ = v12X * v13Y - v12Y * v13X;
- let inverted = false;
- if(vc1X * inorX + vc1Y * inorY + vc1Z * inorZ < 0) {
- if(autoCheck) {
- let tmp = vertex2;
- vertex2 = vertex3;
- vertex3 = tmp;
- inorX *= -1;
- inorY *= -1;
- inorZ *= -1;
- } else {
- inverted = true;
- }
- }
- this._vertices[0] = vertex1;
- this._vertices[1] = vertex2;
- this._vertices[2] = vertex3;
- let v3 = this._normal;
- v3.x = inorX;
- v3.y = inorY;
- v3.z = inorZ;
- let vec1 = vertex1.v;
- let vec2 = vertex2.v;
- let vec3 = vertex3.v;
- let out = this.tmp;
- let v1X1;
- let v1Y1;
- let v1Z1;
- let v2X1;
- let v2Y1;
- let v2Z1;
- let v3X1;
- let v3Y1;
- let v3Z1;
- let v12X1;
- let v12Y1;
- let v12Z1;
- let v23X;
- let v23Y;
- let v23Z;
- let v31X;
- let v31Y;
- let v31Z;
- v1X1 = vec1.x;
- v1Y1 = vec1.y;
- v1Z1 = vec1.z;
- v2X1 = vec2.x;
- v2Y1 = vec2.y;
- v2Z1 = vec2.z;
- v3X1 = vec3.x;
- v3Y1 = vec3.y;
- v3Z1 = vec3.z;
- v12X1 = v2X1 - v1X1;
- v12Y1 = v2Y1 - v1Y1;
- v12Z1 = v2Z1 - v1Z1;
- v23X = v3X1 - v2X1;
- v23Y = v3Y1 - v2Y1;
- v23Z = v3Z1 - v2Z1;
- v31X = v1X1 - v3X1;
- v31Y = v1Y1 - v3Y1;
- v31Z = v1Z1 - v3Z1;
- let nX;
- let nY;
- let nZ;
- nX = v12Y1 * v23Z - v12Z1 * v23Y;
- nY = v12Z1 * v23X - v12X1 * v23Z;
- nZ = v12X1 * v23Y - v12Y1 * v23X;
- let n12X;
- let n12Y;
- let n12Z;
- let n23X;
- let n23Y;
- let n23Z;
- let n31X;
- let n31Y;
- let n31Z;
- n12X = v12Y1 * nZ - v12Z1 * nY;
- n12Y = v12Z1 * nX - v12X1 * nZ;
- n12Z = v12X1 * nY - v12Y1 * nX;
- n23X = v23Y * nZ - v23Z * nY;
- n23Y = v23Z * nX - v23X * nZ;
- n23Z = v23X * nY - v23Y * nX;
- n31X = v31Y * nZ - v31Z * nY;
- n31Y = v31Z * nX - v31X * nZ;
- n31Z = v31X * nY - v31Y * nX;
- let mind = -1;
- let minvX;
- let minvY;
- let minvZ;
- minvX = 0;
- minvY = 0;
- minvZ = 0;
- if(v1X1 * n12X + v1Y1 * n12Y + v1Z1 * n12Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec1.x;
- v1Y = vec1.y;
- v1Z = vec1.z;
- v2X = vec2.x;
- v2Y = vec2.y;
- v2Z = vec2.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- if(t < 0) {
- out.x = v1X;
- out.y = v1Y;
- out.z = v1Z;
- } else if(t > 1) {
- out.x = v2X;
- out.y = v2Y;
- out.z = v2Z;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- out.x = pX;
- out.y = pY;
- out.z = pZ;
- }
- mind = out.x * out.x + out.y * out.y + out.z * out.z;
- minvX = out.x;
- minvY = out.y;
- minvZ = out.z;
- }
- if(v2X1 * n23X + v2Y1 * n23Y + v2Z1 * n23Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec2.x;
- v1Y = vec2.y;
- v1Z = vec2.z;
- v2X = vec3.x;
- v2Y = vec3.y;
- v2Z = vec3.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- if(t < 0) {
- out.x = v1X;
- out.y = v1Y;
- out.z = v1Z;
- } else if(t > 1) {
- out.x = v2X;
- out.y = v2Y;
- out.z = v2Z;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- out.x = pX;
- out.y = pY;
- out.z = pZ;
- }
- let d = out.x * out.x + out.y * out.y + out.z * out.z;
- if(mind < 0 || d < mind) {
- mind = d;
- minvX = out.x;
- minvY = out.y;
- minvZ = out.z;
- }
- }
- if(v3X1 * n31X + v3Y1 * n31Y + v3Z1 * n31Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec1.x;
- v1Y = vec1.y;
- v1Z = vec1.z;
- v2X = vec3.x;
- v2Y = vec3.y;
- v2Z = vec3.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- if(t < 0) {
- out.x = v1X;
- out.y = v1Y;
- out.z = v1Z;
- } else if(t > 1) {
- out.x = v2X;
- out.y = v2Y;
- out.z = v2Z;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- out.x = pX;
- out.y = pY;
- out.z = pZ;
- }
- let d = out.x * out.x + out.y * out.y + out.z * out.z;
- if(mind < 0 || d < mind) {
- mind = d;
- minvX = out.x;
- minvY = out.y;
- minvZ = out.z;
- }
- }
- if(mind > 0) {
- out.x = minvX;
- out.y = minvY;
- out.z = minvZ;
- } else {
- let l = nX * nX + nY * nY + nZ * nZ;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- nX *= l;
- nY *= l;
- nZ *= l;
- let l2 = nX * nX + nY * nY + nZ * nZ;
- l2 = (v1X1 * nX + v1Y1 * nY + v1Z1 * nZ) / l2;
- minvX = nX * l2;
- minvY = nY * l2;
- minvZ = nZ * l2;
- out.x = minvX;
- out.y = minvY;
- out.z = minvZ;
- }
- let _this = this.tmp;
- this._distanceSq = _this.x * _this.x + _this.y * _this.y + _this.z * _this.z;
- this._adjacentTriangles[0] = null;
- this._adjacentTriangles[1] = null;
- this._adjacentTriangles[2] = null;
- this._adjacentPairIndex[0] = -1;
- this._adjacentPairIndex[1] = -1;
- this._adjacentPairIndex[2] = -1;
- return !inverted;
- }
- setAdjacentTriangle(triangle) {
- let count = 0;
- if(this._vertices[0] == triangle._vertices[this._nextIndex[0]] && this._vertices[this._nextIndex[0]] == triangle._vertices[0]) {
- this._adjacentTriangles[0] = triangle;
- this._adjacentPairIndex[0] = 0;
- triangle._adjacentTriangles[0] = this;
- triangle._adjacentPairIndex[0] = 0;
- count = 1;
- }
- if(this._vertices[0] == triangle._vertices[this._nextIndex[1]] && this._vertices[this._nextIndex[0]] == triangle._vertices[1]) {
- this._adjacentTriangles[0] = triangle;
- this._adjacentPairIndex[0] = 1;
- triangle._adjacentTriangles[1] = this;
- triangle._adjacentPairIndex[1] = 0;
- ++count;
- }
- if(this._vertices[0] == triangle._vertices[this._nextIndex[2]] && this._vertices[this._nextIndex[0]] == triangle._vertices[2]) {
- this._adjacentTriangles[0] = triangle;
- this._adjacentPairIndex[0] = 2;
- triangle._adjacentTriangles[2] = this;
- triangle._adjacentPairIndex[2] = 0;
- ++count;
- }
- if(this._vertices[1] == triangle._vertices[this._nextIndex[0]] && this._vertices[this._nextIndex[1]] == triangle._vertices[0]) {
- this._adjacentTriangles[1] = triangle;
- this._adjacentPairIndex[1] = 0;
- triangle._adjacentTriangles[0] = this;
- triangle._adjacentPairIndex[0] = 1;
- ++count;
- }
- if(this._vertices[1] == triangle._vertices[this._nextIndex[1]] && this._vertices[this._nextIndex[1]] == triangle._vertices[1]) {
- this._adjacentTriangles[1] = triangle;
- this._adjacentPairIndex[1] = 1;
- triangle._adjacentTriangles[1] = this;
- triangle._adjacentPairIndex[1] = 1;
- ++count;
- }
- if(this._vertices[1] == triangle._vertices[this._nextIndex[2]] && this._vertices[this._nextIndex[1]] == triangle._vertices[2]) {
- this._adjacentTriangles[1] = triangle;
- this._adjacentPairIndex[1] = 2;
- triangle._adjacentTriangles[2] = this;
- triangle._adjacentPairIndex[2] = 1;
- ++count;
- }
- if(this._vertices[2] == triangle._vertices[this._nextIndex[0]] && this._vertices[this._nextIndex[2]] == triangle._vertices[0]) {
- this._adjacentTriangles[2] = triangle;
- this._adjacentPairIndex[2] = 0;
- triangle._adjacentTriangles[0] = this;
- triangle._adjacentPairIndex[0] = 2;
- ++count;
- }
- if(this._vertices[2] == triangle._vertices[this._nextIndex[1]] && this._vertices[this._nextIndex[2]] == triangle._vertices[1]) {
- this._adjacentTriangles[2] = triangle;
- this._adjacentPairIndex[2] = 1;
- triangle._adjacentTriangles[1] = this;
- triangle._adjacentPairIndex[1] = 2;
- ++count;
- }
- if(this._vertices[2] == triangle._vertices[this._nextIndex[2]] && this._vertices[this._nextIndex[2]] == triangle._vertices[2]) {
- this._adjacentTriangles[2] = triangle;
- this._adjacentPairIndex[2] = 2;
- triangle._adjacentTriangles[2] = this;
- triangle._adjacentPairIndex[2] = 2;
- ++count;
- }
- if(count != 1) {
- return false;
- }
- return true;
- }
- removeAdjacentTriangles() {
- let triangle = this._adjacentTriangles[0];
- if(triangle != null) {
- let pairIndex = this._adjacentPairIndex[0];
- triangle._adjacentTriangles[pairIndex] = null;
- triangle._adjacentPairIndex[pairIndex] = -1;
- this._adjacentTriangles[0] = null;
- this._adjacentPairIndex[0] = -1;
- }
- let triangle1 = this._adjacentTriangles[1];
- if(triangle1 != null) {
- let pairIndex = this._adjacentPairIndex[1];
- triangle1._adjacentTriangles[pairIndex] = null;
- triangle1._adjacentPairIndex[pairIndex] = -1;
- this._adjacentTriangles[1] = null;
- this._adjacentPairIndex[1] = -1;
- }
- let triangle2 = this._adjacentTriangles[2];
- if(triangle2 != null) {
- let pairIndex = this._adjacentPairIndex[2];
- triangle2._adjacentTriangles[pairIndex] = null;
- triangle2._adjacentPairIndex[pairIndex] = -1;
- this._adjacentTriangles[2] = null;
- this._adjacentPairIndex[2] = -1;
- }
- }
- removeReferences() {
- this._next = null;
- this._prev = null;
- this._tmpDfsId = 0;
- this._tmpDfsVisible = false;
- this._distanceSq = 0;
- this._vertices[0] = null;
- this._vertices[1] = null;
- this._vertices[2] = null;
- this._adjacentTriangles[0] = null;
- this._adjacentTriangles[1] = null;
- this._adjacentTriangles[2] = null;
- this._adjacentPairIndex[0] = 0;
- this._adjacentPairIndex[1] = 0;
- this._adjacentPairIndex[2] = 0;
- }
- dump() {
- }
- }
- oimo.collision.narrowphase.detector.gjkepa.EpaVertex = class oimo_collision_narrowphase_detector_gjkepa_EpaVertex {
- constructor() {
- this.randId = Math.random() * 100000 | 0;
- this.v = new oimo.common.Vec3();
- this.w1 = new oimo.common.Vec3();
- this.w2 = new oimo.common.Vec3();
- }
- init(v,w1,w2) {
- let _this = this.v;
- _this.x = v.x;
- _this.y = v.y;
- _this.z = v.z;
- let _this1 = this.w1;
- _this1.x = w1.x;
- _this1.y = w1.y;
- _this1.z = w1.z;
- let _this2 = this.w2;
- _this2.x = w2.x;
- _this2.y = w2.y;
- _this2.z = w2.z;
- this._next = null;
- this._tmpEdgeLoopNext = null;
- this._tmpEdgeLoopOuterTriangle = null;
- return this;
- }
- removeReferences() {
- this._next = null;
- this._tmpEdgeLoopNext = null;
- this._tmpEdgeLoopOuterTriangle = null;
- }
- }
- oimo.collision.narrowphase.detector.gjkepa.GjkCache = class oimo_collision_narrowphase_detector_gjkepa_GjkCache {
- constructor() {
- this.prevClosestDir = new oimo.common.Vec3();
- }
- clear() {
- this.prevClosestDir.zero();
- }
- }
- if(!oimo.common) oimo.common = {};
- oimo.common.Vec3 = class oimo_common_Vec3 {
- constructor(x,y,z) {
- if(z == null) {
- z = 0;
- }
- if(y == null) {
- y = 0;
- }
- if(x == null) {
- x = 0;
- }
- this.x = x;
- this.y = y;
- this.z = z;
- oimo.common.Vec3.numCreations++;
- }
- init(x,y,z) {
- this.x = x;
- this.y = y;
- this.z = z;
- return this;
- }
- zero() {
- this.x = 0;
- this.y = 0;
- this.z = 0;
- return this;
- }
- add(v) {
- return new oimo.common.Vec3(this.x + v.x,this.y + v.y,this.z + v.z);
- }
- add3(vx,vy,vz) {
- return new oimo.common.Vec3(this.x + vx,this.y + vy,this.z + vz);
- }
- addScaled(v,s) {
- return new oimo.common.Vec3(this.x + v.x * s,this.y + v.y * s,this.z + v.z * s);
- }
- sub(v) {
- return new oimo.common.Vec3(this.x - v.x,this.y - v.y,this.z - v.z);
- }
- sub3(vx,vy,vz) {
- return new oimo.common.Vec3(this.x - vx,this.y - vy,this.z - vz);
- }
- scale(s) {
- return new oimo.common.Vec3(this.x * s,this.y * s,this.z * s);
- }
- scale3(sx,sy,sz) {
- return new oimo.common.Vec3(this.x * sx,this.y * sy,this.z * sz);
- }
- dot(v) {
- return this.x * v.x + this.y * v.y + this.z * v.z;
- }
- cross(v) {
- return new oimo.common.Vec3(this.y * v.z - this.z * v.y,this.z * v.x - this.x * v.z,this.x * v.y - this.y * v.x);
- }
- addEq(v) {
- this.x += v.x;
- this.y += v.y;
- this.z += v.z;
- return this;
- }
- add3Eq(vx,vy,vz) {
- this.x += vx;
- this.y += vy;
- this.z += vz;
- return this;
- }
- addScaledEq(v,s) {
- this.x += v.x * s;
- this.y += v.y * s;
- this.z += v.z * s;
- return this;
- }
- subEq(v) {
- this.x -= v.x;
- this.y -= v.y;
- this.z -= v.z;
- return this;
- }
- sub3Eq(vx,vy,vz) {
- this.x -= vx;
- this.y -= vy;
- this.z -= vz;
- return this;
- }
- scaleEq(s) {
- this.x *= s;
- this.y *= s;
- this.z *= s;
- return this;
- }
- scale3Eq(sx,sy,sz) {
- this.x *= sx;
- this.y *= sy;
- this.z *= sz;
- return this;
- }
- crossEq(v) {
- let y = this.z * v.x - this.x * v.z;
- let z = this.x * v.y - this.y * v.x;
- this.x = this.y * v.z - this.z * v.y;
- this.y = y;
- this.z = z;
- return this;
- }
- mulMat3(m) {
- return new oimo.common.Vec3(this.x * m.e00 + this.y * m.e01 + this.z * m.e02,this.x * m.e10 + this.y * m.e11 + this.z * m.e12,this.x * m.e20 + this.y * m.e21 + this.z * m.e22);
- }
- mulMat4(m) {
- return new oimo.common.Vec3(this.x * m.e00 + this.y * m.e01 + this.z * m.e02 + m.e03,this.x * m.e10 + this.y * m.e11 + this.z * m.e12 + m.e13,this.x * m.e20 + this.y * m.e21 + this.z * m.e22 + m.e23);
- }
- mulTransform(tf) {
- let vX;
- let vY;
- let vZ;
- vX = this.x;
- vY = this.y;
- vZ = this.z;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = tf._rotation00 * vX + tf._rotation01 * vY + tf._rotation02 * vZ;
- __tmp__Y = tf._rotation10 * vX + tf._rotation11 * vY + tf._rotation12 * vZ;
- __tmp__Z = tf._rotation20 * vX + tf._rotation21 * vY + tf._rotation22 * vZ;
- vX = __tmp__X;
- vY = __tmp__Y;
- vZ = __tmp__Z;
- vX += tf._positionX;
- vY += tf._positionY;
- vZ += tf._positionZ;
- let res = new oimo.common.Vec3();
- res.x = vX;
- res.y = vY;
- res.z = vZ;
- return res;
- }
- mulMat3Eq(m) {
- let y = this.x * m.e10 + this.y * m.e11 + this.z * m.e12;
- let z = this.x * m.e20 + this.y * m.e21 + this.z * m.e22;
- this.x = this.x * m.e00 + this.y * m.e01 + this.z * m.e02;
- this.y = y;
- this.z = z;
- return this;
- }
- mulMat4Eq(m) {
- let y = this.x * m.e10 + this.y * m.e11 + this.z * m.e12 + m.e13;
- let z = this.x * m.e20 + this.y * m.e21 + this.z * m.e22 + m.e23;
- this.x = this.x * m.e00 + this.y * m.e01 + this.z * m.e02 + m.e03;
- this.y = y;
- this.z = z;
- return this;
- }
- mulTransformEq(tf) {
- let vX;
- let vY;
- let vZ;
- vX = this.x;
- vY = this.y;
- vZ = this.z;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = tf._rotation00 * vX + tf._rotation01 * vY + tf._rotation02 * vZ;
- __tmp__Y = tf._rotation10 * vX + tf._rotation11 * vY + tf._rotation12 * vZ;
- __tmp__Z = tf._rotation20 * vX + tf._rotation21 * vY + tf._rotation22 * vZ;
- vX = __tmp__X;
- vY = __tmp__Y;
- vZ = __tmp__Z;
- vX += tf._positionX;
- vY += tf._positionY;
- vZ += tf._positionZ;
- this.x = vX;
- this.y = vY;
- this.z = vZ;
- return this;
- }
- length() {
- return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);
- }
- lengthSq() {
- return this.x * this.x + this.y * this.y + this.z * this.z;
- }
- normalized() {
- let invLen = Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);
- if(invLen > 0) {
- invLen = 1 / invLen;
- }
- return new oimo.common.Vec3(this.x * invLen,this.y * invLen,this.z * invLen);
- }
- normalize() {
- let invLen = Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);
- if(invLen > 0) {
- invLen = 1 / invLen;
- }
- this.x *= invLen;
- this.y *= invLen;
- this.z *= invLen;
- return this;
- }
- negate() {
- return new oimo.common.Vec3(-this.x,-this.y,-this.z);
- }
- negateEq() {
- this.x = -this.x;
- this.y = -this.y;
- this.z = -this.z;
- return this;
- }
- copyFrom(v) {
- this.x = v.x;
- this.y = v.y;
- this.z = v.z;
- return this;
- }
- clone() {
- return new oimo.common.Vec3(this.x,this.y,this.z);
- }
- toString() {
- return "Vec3[" + (this.x > 0 ? (this.x * 10000000 + 0.5 | 0) / 10000000 : (this.x * 10000000 - 0.5 | 0) / 10000000) + ", " + (this.y > 0 ? (this.y * 10000000 + 0.5 | 0) / 10000000 : (this.y * 10000000 - 0.5 | 0) / 10000000) + ", " + (this.z > 0 ? (this.z * 10000000 + 0.5 | 0) / 10000000 : (this.z * 10000000 - 0.5 | 0) / 10000000) + "]";
- }
- }
- oimo.common.Transform = class oimo_common_Transform {
- constructor() {
- this._positionX = 0;
- this._positionY = 0;
- this._positionZ = 0;
- this._rotation00 = 1;
- this._rotation01 = 0;
- this._rotation02 = 0;
- this._rotation10 = 0;
- this._rotation11 = 1;
- this._rotation12 = 0;
- this._rotation20 = 0;
- this._rotation21 = 0;
- this._rotation22 = 1;
- }
- identity() {
- this._positionX = 0;
- this._positionY = 0;
- this._positionZ = 0;
- this._rotation00 = 1;
- this._rotation01 = 0;
- this._rotation02 = 0;
- this._rotation10 = 0;
- this._rotation11 = 1;
- this._rotation12 = 0;
- this._rotation20 = 0;
- this._rotation21 = 0;
- this._rotation22 = 1;
- return this;
- }
- getPosition() {
- let position = new oimo.common.Vec3();
- position.x = this._positionX;
- position.y = this._positionY;
- position.z = this._positionZ;
- return position;
- }
- getPositionTo(position) {
- position.x = this._positionX;
- position.y = this._positionY;
- position.z = this._positionZ;
- }
- setPosition(position) {
- this._positionX = position.x;
- this._positionY = position.y;
- this._positionZ = position.z;
- return this;
- }
- translate(translation) {
- let diffX;
- let diffY;
- let diffZ;
- diffX = translation.x;
- diffY = translation.y;
- diffZ = translation.z;
- this._positionX += diffX;
- this._positionY += diffY;
- this._positionZ += diffZ;
- }
- getRotation() {
- let rotation = new oimo.common.Mat3();
- rotation.e00 = this._rotation00;
- rotation.e01 = this._rotation01;
- rotation.e02 = this._rotation02;
- rotation.e10 = this._rotation10;
- rotation.e11 = this._rotation11;
- rotation.e12 = this._rotation12;
- rotation.e20 = this._rotation20;
- rotation.e21 = this._rotation21;
- rotation.e22 = this._rotation22;
- return rotation;
- }
- getRotationTo(out) {
- out.e00 = this._rotation00;
- out.e01 = this._rotation01;
- out.e02 = this._rotation02;
- out.e10 = this._rotation10;
- out.e11 = this._rotation11;
- out.e12 = this._rotation12;
- out.e20 = this._rotation20;
- out.e21 = this._rotation21;
- out.e22 = this._rotation22;
- }
- setRotation(rotation) {
- this._rotation00 = rotation.e00;
- this._rotation01 = rotation.e01;
- this._rotation02 = rotation.e02;
- this._rotation10 = rotation.e10;
- this._rotation11 = rotation.e11;
- this._rotation12 = rotation.e12;
- this._rotation20 = rotation.e20;
- this._rotation21 = rotation.e21;
- this._rotation22 = rotation.e22;
- return this;
- }
- setRotationXyz(eulerAngles) {
- let xyzX;
- let xyzY;
- let xyzZ;
- xyzX = eulerAngles.x;
- xyzY = eulerAngles.y;
- xyzZ = eulerAngles.z;
- let sx = Math.sin(xyzX);
- let sy = Math.sin(xyzY);
- let sz = Math.sin(xyzZ);
- let cx = Math.cos(xyzX);
- let cy = Math.cos(xyzY);
- let cz = Math.cos(xyzZ);
- this._rotation00 = cy * cz;
- this._rotation01 = -cy * sz;
- this._rotation02 = sy;
- this._rotation10 = cx * sz + cz * sx * sy;
- this._rotation11 = cx * cz - sx * sy * sz;
- this._rotation12 = -cy * sx;
- this._rotation20 = sx * sz - cx * cz * sy;
- this._rotation21 = cz * sx + cx * sy * sz;
- this._rotation22 = cx * cy;
- }
- rotate(rotation) {
- let rot00;
- let rot01;
- let rot02;
- let rot10;
- let rot11;
- let rot12;
- let rot20;
- let rot21;
- let rot22;
- rot00 = rotation.e00;
- rot01 = rotation.e01;
- rot02 = rotation.e02;
- rot10 = rotation.e10;
- rot11 = rotation.e11;
- rot12 = rotation.e12;
- rot20 = rotation.e20;
- rot21 = rotation.e21;
- rot22 = rotation.e22;
- let __tmp__00;
- let __tmp__01;
- let __tmp__02;
- let __tmp__10;
- let __tmp__11;
- let __tmp__12;
- let __tmp__20;
- let __tmp__21;
- let __tmp__22;
- __tmp__00 = rot00 * this._rotation00 + rot01 * this._rotation10 + rot02 * this._rotation20;
- __tmp__01 = rot00 * this._rotation01 + rot01 * this._rotation11 + rot02 * this._rotation21;
- __tmp__02 = rot00 * this._rotation02 + rot01 * this._rotation12 + rot02 * this._rotation22;
- __tmp__10 = rot10 * this._rotation00 + rot11 * this._rotation10 + rot12 * this._rotation20;
- __tmp__11 = rot10 * this._rotation01 + rot11 * this._rotation11 + rot12 * this._rotation21;
- __tmp__12 = rot10 * this._rotation02 + rot11 * this._rotation12 + rot12 * this._rotation22;
- __tmp__20 = rot20 * this._rotation00 + rot21 * this._rotation10 + rot22 * this._rotation20;
- __tmp__21 = rot20 * this._rotation01 + rot21 * this._rotation11 + rot22 * this._rotation21;
- __tmp__22 = rot20 * this._rotation02 + rot21 * this._rotation12 + rot22 * this._rotation22;
- this._rotation00 = __tmp__00;
- this._rotation01 = __tmp__01;
- this._rotation02 = __tmp__02;
- this._rotation10 = __tmp__10;
- this._rotation11 = __tmp__11;
- this._rotation12 = __tmp__12;
- this._rotation20 = __tmp__20;
- this._rotation21 = __tmp__21;
- this._rotation22 = __tmp__22;
- }
- rotateXyz(eulerAngles) {
- let xyzX;
- let xyzY;
- let xyzZ;
- let rot00;
- let rot01;
- let rot02;
- let rot10;
- let rot11;
- let rot12;
- let rot20;
- let rot21;
- let rot22;
- xyzX = eulerAngles.x;
- xyzY = eulerAngles.y;
- xyzZ = eulerAngles.z;
- let sx = Math.sin(xyzX);
- let sy = Math.sin(xyzY);
- let sz = Math.sin(xyzZ);
- let cx = Math.cos(xyzX);
- let cy = Math.cos(xyzY);
- let cz = Math.cos(xyzZ);
- rot00 = cy * cz;
- rot01 = -cy * sz;
- rot02 = sy;
- rot10 = cx * sz + cz * sx * sy;
- rot11 = cx * cz - sx * sy * sz;
- rot12 = -cy * sx;
- rot20 = sx * sz - cx * cz * sy;
- rot21 = cz * sx + cx * sy * sz;
- rot22 = cx * cy;
- let __tmp__00;
- let __tmp__01;
- let __tmp__02;
- let __tmp__10;
- let __tmp__11;
- let __tmp__12;
- let __tmp__20;
- let __tmp__21;
- let __tmp__22;
- __tmp__00 = rot00 * this._rotation00 + rot01 * this._rotation10 + rot02 * this._rotation20;
- __tmp__01 = rot00 * this._rotation01 + rot01 * this._rotation11 + rot02 * this._rotation21;
- __tmp__02 = rot00 * this._rotation02 + rot01 * this._rotation12 + rot02 * this._rotation22;
- __tmp__10 = rot10 * this._rotation00 + rot11 * this._rotation10 + rot12 * this._rotation20;
- __tmp__11 = rot10 * this._rotation01 + rot11 * this._rotation11 + rot12 * this._rotation21;
- __tmp__12 = rot10 * this._rotation02 + rot11 * this._rotation12 + rot12 * this._rotation22;
- __tmp__20 = rot20 * this._rotation00 + rot21 * this._rotation10 + rot22 * this._rotation20;
- __tmp__21 = rot20 * this._rotation01 + rot21 * this._rotation11 + rot22 * this._rotation21;
- __tmp__22 = rot20 * this._rotation02 + rot21 * this._rotation12 + rot22 * this._rotation22;
- this._rotation00 = __tmp__00;
- this._rotation01 = __tmp__01;
- this._rotation02 = __tmp__02;
- this._rotation10 = __tmp__10;
- this._rotation11 = __tmp__11;
- this._rotation12 = __tmp__12;
- this._rotation20 = __tmp__20;
- this._rotation21 = __tmp__21;
- this._rotation22 = __tmp__22;
- }
- getOrientation() {
- let q = new oimo.common.Quat();
- let iqX;
- let iqY;
- let iqZ;
- let iqW;
- let e00 = this._rotation00;
- let e11 = this._rotation11;
- let e22 = this._rotation22;
- let t = e00 + e11 + e22;
- let s;
- if(t > 0) {
- s = Math.sqrt(t + 1);
- iqW = 0.5 * s;
- s = 0.5 / s;
- iqX = (this._rotation21 - this._rotation12) * s;
- iqY = (this._rotation02 - this._rotation20) * s;
- iqZ = (this._rotation10 - this._rotation01) * s;
- } else if(e00 > e11) {
- if(e00 > e22) {
- s = Math.sqrt(e00 - e11 - e22 + 1);
- iqX = 0.5 * s;
- s = 0.5 / s;
- iqY = (this._rotation01 + this._rotation10) * s;
- iqZ = (this._rotation02 + this._rotation20) * s;
- iqW = (this._rotation21 - this._rotation12) * s;
- } else {
- s = Math.sqrt(e22 - e00 - e11 + 1);
- iqZ = 0.5 * s;
- s = 0.5 / s;
- iqX = (this._rotation02 + this._rotation20) * s;
- iqY = (this._rotation12 + this._rotation21) * s;
- iqW = (this._rotation10 - this._rotation01) * s;
- }
- } else if(e11 > e22) {
- s = Math.sqrt(e11 - e22 - e00 + 1);
- iqY = 0.5 * s;
- s = 0.5 / s;
- iqX = (this._rotation01 + this._rotation10) * s;
- iqZ = (this._rotation12 + this._rotation21) * s;
- iqW = (this._rotation02 - this._rotation20) * s;
- } else {
- s = Math.sqrt(e22 - e00 - e11 + 1);
- iqZ = 0.5 * s;
- s = 0.5 / s;
- iqX = (this._rotation02 + this._rotation20) * s;
- iqY = (this._rotation12 + this._rotation21) * s;
- iqW = (this._rotation10 - this._rotation01) * s;
- }
- q.x = iqX;
- q.y = iqY;
- q.z = iqZ;
- q.w = iqW;
- return q;
- }
- getOrientationTo(orientation) {
- let iqX;
- let iqY;
- let iqZ;
- let iqW;
- let e00 = this._rotation00;
- let e11 = this._rotation11;
- let e22 = this._rotation22;
- let t = e00 + e11 + e22;
- let s;
- if(t > 0) {
- s = Math.sqrt(t + 1);
- iqW = 0.5 * s;
- s = 0.5 / s;
- iqX = (this._rotation21 - this._rotation12) * s;
- iqY = (this._rotation02 - this._rotation20) * s;
- iqZ = (this._rotation10 - this._rotation01) * s;
- } else if(e00 > e11) {
- if(e00 > e22) {
- s = Math.sqrt(e00 - e11 - e22 + 1);
- iqX = 0.5 * s;
- s = 0.5 / s;
- iqY = (this._rotation01 + this._rotation10) * s;
- iqZ = (this._rotation02 + this._rotation20) * s;
- iqW = (this._rotation21 - this._rotation12) * s;
- } else {
- s = Math.sqrt(e22 - e00 - e11 + 1);
- iqZ = 0.5 * s;
- s = 0.5 / s;
- iqX = (this._rotation02 + this._rotation20) * s;
- iqY = (this._rotation12 + this._rotation21) * s;
- iqW = (this._rotation10 - this._rotation01) * s;
- }
- } else if(e11 > e22) {
- s = Math.sqrt(e11 - e22 - e00 + 1);
- iqY = 0.5 * s;
- s = 0.5 / s;
- iqX = (this._rotation01 + this._rotation10) * s;
- iqZ = (this._rotation12 + this._rotation21) * s;
- iqW = (this._rotation02 - this._rotation20) * s;
- } else {
- s = Math.sqrt(e22 - e00 - e11 + 1);
- iqZ = 0.5 * s;
- s = 0.5 / s;
- iqX = (this._rotation02 + this._rotation20) * s;
- iqY = (this._rotation12 + this._rotation21) * s;
- iqW = (this._rotation10 - this._rotation01) * s;
- }
- orientation.x = iqX;
- orientation.y = iqY;
- orientation.z = iqZ;
- orientation.w = iqW;
- }
- setOrientation(quaternion) {
- let qX;
- let qY;
- let qZ;
- let qW;
- qX = quaternion.x;
- qY = quaternion.y;
- qZ = quaternion.z;
- qW = quaternion.w;
- let x = qX;
- let y = qY;
- let z = qZ;
- let w = qW;
- let x2 = 2 * x;
- let y2 = 2 * y;
- let z2 = 2 * z;
- let xx = x * x2;
- let yy = y * y2;
- let zz = z * z2;
- let xy = x * y2;
- let yz = y * z2;
- let xz = x * z2;
- let wx = w * x2;
- let wy = w * y2;
- let wz = w * z2;
- this._rotation00 = 1 - yy - zz;
- this._rotation01 = xy - wz;
- this._rotation02 = xz + wy;
- this._rotation10 = xy + wz;
- this._rotation11 = 1 - xx - zz;
- this._rotation12 = yz - wx;
- this._rotation20 = xz - wy;
- this._rotation21 = yz + wx;
- this._rotation22 = 1 - xx - yy;
- return this;
- }
- clone() {
- let tf = new oimo.common.Transform();
- tf._positionX = this._positionX;
- tf._positionY = this._positionY;
- tf._positionZ = this._positionZ;
- tf._rotation00 = this._rotation00;
- tf._rotation01 = this._rotation01;
- tf._rotation02 = this._rotation02;
- tf._rotation10 = this._rotation10;
- tf._rotation11 = this._rotation11;
- tf._rotation12 = this._rotation12;
- tf._rotation20 = this._rotation20;
- tf._rotation21 = this._rotation21;
- tf._rotation22 = this._rotation22;
- return tf;
- }
- copyFrom(transform) {
- this._positionX = transform._positionX;
- this._positionY = transform._positionY;
- this._positionZ = transform._positionZ;
- this._rotation00 = transform._rotation00;
- this._rotation01 = transform._rotation01;
- this._rotation02 = transform._rotation02;
- this._rotation10 = transform._rotation10;
- this._rotation11 = transform._rotation11;
- this._rotation12 = transform._rotation12;
- this._rotation20 = transform._rotation20;
- this._rotation21 = transform._rotation21;
- this._rotation22 = transform._rotation22;
- return this;
- }
- }
- oimo.common.Setting = class oimo_common_Setting {
- }
- oimo.collision.narrowphase.detector.gjkepa.GjkEpa = class oimo_collision_narrowphase_detector_gjkepa_GjkEpa {
- constructor() {
- this.s = new Array(4);
- this.w1 = new Array(4);
- this.w2 = new Array(4);
- this.baseDirs = new Array(3);
- this.baseDirs[0] = new oimo.common.Vec3(1,0,0);
- this.baseDirs[1] = new oimo.common.Vec3(0,1,0);
- this.baseDirs[2] = new oimo.common.Vec3(0,0,1);
- this.tl1 = new oimo.common.Vec3();
- this.tl2 = new oimo.common.Vec3();
- this.rayX = new oimo.common.Vec3();
- this.rayR = new oimo.common.Vec3();
- this.tempTransform = new oimo.common.Transform();
- this.s[0] = new oimo.common.Vec3();
- this.w1[0] = new oimo.common.Vec3();
- this.w2[0] = new oimo.common.Vec3();
- this.s[1] = new oimo.common.Vec3();
- this.w1[1] = new oimo.common.Vec3();
- this.w2[1] = new oimo.common.Vec3();
- this.s[2] = new oimo.common.Vec3();
- this.w1[2] = new oimo.common.Vec3();
- this.w2[2] = new oimo.common.Vec3();
- this.s[3] = new oimo.common.Vec3();
- this.w1[3] = new oimo.common.Vec3();
- this.w2[3] = new oimo.common.Vec3();
- this.dir = new oimo.common.Vec3();
- this.closest = new oimo.common.Vec3();
- this.closestPoint1 = new oimo.common.Vec3();
- this.closestPoint2 = new oimo.common.Vec3();
- this.polyhedron = new oimo.collision.narrowphase.detector.gjkepa.EpaPolyhedron();
- }
- computeClosestPointsImpl(c1,c2,tf1,tf2,cache,useEpa) {
- this.c1 = c1;
- this.c2 = c2;
- this.tf1 = tf1;
- this.tf2 = tf2;
- let s = this.s;
- let w1 = this.w1;
- let w2 = this.w2;
- let closest = this.closest;
- let dir = this.dir;
- if(cache != null) {
- if(cache._gjkCache == null) {
- cache._gjkCache = new oimo.collision.narrowphase.detector.gjkepa.GjkCache();
- }
- this.loadCache(cache._gjkCache);
- } else {
- dir.zero();
- }
- if(dir.x * dir.x + dir.y * dir.y + dir.z * dir.z == 0) {
- let firstDirX;
- let firstDirY;
- let firstDirZ;
- firstDirX = tf2._positionX - tf1._positionX;
- firstDirY = tf2._positionY - tf1._positionY;
- firstDirZ = tf2._positionZ - tf1._positionZ;
- dir.x = firstDirX;
- dir.y = firstDirY;
- dir.z = firstDirZ;
- if(dir.x * dir.x + dir.y * dir.y + dir.z * dir.z < 1e-6) {
- dir.init(1,0,0);
- }
- }
- this.simplexSize = 0;
- this.computeWitnessPoint1(false);
- this.computeWitnessPoint2(false);
- let _this = this.s[this.simplexSize];
- let v = this.w1[this.simplexSize];
- _this.x = v.x;
- _this.y = v.y;
- _this.z = v.z;
- let v1 = this.w2[this.simplexSize];
- _this.x -= v1.x;
- _this.y -= v1.y;
- _this.z -= v1.z;
- this.simplexSize = 1;
- let count = 0;
- while(count < 40) {
- let v = 0;
- switch(this.simplexSize) {
- case 1:
- let v1 = s[0];
- closest.x = v1.x;
- closest.y = v1.y;
- closest.z = v1.z;
- v = 1;
- break;
- case 2:
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- let v2 = s[0];
- v1X = v2.x;
- v1Y = v2.y;
- v1Z = v2.z;
- let v3 = s[1];
- v2X = v3.x;
- v2Y = v3.y;
- v2Z = v3.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- if(t < 0) {
- closest.x = v1X;
- closest.y = v1Y;
- closest.z = v1Z;
- v = 1;
- } else if(t > 1) {
- closest.x = v2X;
- closest.y = v2Y;
- closest.z = v2Z;
- v = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- closest.x = pX;
- closest.y = pY;
- closest.z = pZ;
- v = 3;
- }
- break;
- case 3:
- let vec1 = s[0];
- let vec2 = s[1];
- let vec3 = s[2];
- let v1X1;
- let v1Y1;
- let v1Z1;
- let v2X1;
- let v2Y1;
- let v2Z1;
- let v3X;
- let v3Y;
- let v3Z;
- let v12X1;
- let v12Y1;
- let v12Z1;
- let v23X;
- let v23Y;
- let v23Z;
- let v31X;
- let v31Y;
- let v31Z;
- v1X1 = vec1.x;
- v1Y1 = vec1.y;
- v1Z1 = vec1.z;
- v2X1 = vec2.x;
- v2Y1 = vec2.y;
- v2Z1 = vec2.z;
- v3X = vec3.x;
- v3Y = vec3.y;
- v3Z = vec3.z;
- v12X1 = v2X1 - v1X1;
- v12Y1 = v2Y1 - v1Y1;
- v12Z1 = v2Z1 - v1Z1;
- v23X = v3X - v2X1;
- v23Y = v3Y - v2Y1;
- v23Z = v3Z - v2Z1;
- v31X = v1X1 - v3X;
- v31Y = v1Y1 - v3Y;
- v31Z = v1Z1 - v3Z;
- let nX;
- let nY;
- let nZ;
- nX = v12Y1 * v23Z - v12Z1 * v23Y;
- nY = v12Z1 * v23X - v12X1 * v23Z;
- nZ = v12X1 * v23Y - v12Y1 * v23X;
- let n12X;
- let n12Y;
- let n12Z;
- let n23X;
- let n23Y;
- let n23Z;
- let n31X;
- let n31Y;
- let n31Z;
- n12X = v12Y1 * nZ - v12Z1 * nY;
- n12Y = v12Z1 * nX - v12X1 * nZ;
- n12Z = v12X1 * nY - v12Y1 * nX;
- n23X = v23Y * nZ - v23Z * nY;
- n23Y = v23Z * nX - v23X * nZ;
- n23Z = v23X * nY - v23Y * nX;
- n31X = v31Y * nZ - v31Z * nY;
- n31Y = v31Z * nX - v31X * nZ;
- n31Z = v31X * nY - v31Y * nX;
- let mind = -1;
- let minvX;
- let minvY;
- let minvZ;
- let mini = 0;
- minvX = 0;
- minvY = 0;
- minvZ = 0;
- if(v1X1 * n12X + v1Y1 * n12Y + v1Z1 * n12Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec1.x;
- v1Y = vec1.y;
- v1Z = vec1.z;
- v2X = vec2.x;
- v2Y = vec2.y;
- v2Z = vec2.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- let b;
- if(t < 0) {
- closest.x = v1X;
- closest.y = v1Y;
- closest.z = v1Z;
- b = 1;
- } else if(t > 1) {
- closest.x = v2X;
- closest.y = v2Y;
- closest.z = v2Z;
- b = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- closest.x = pX;
- closest.y = pY;
- closest.z = pZ;
- b = 3;
- }
- mini = b;
- mind = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z;
- minvX = closest.x;
- minvY = closest.y;
- minvZ = closest.z;
- }
- if(v2X1 * n23X + v2Y1 * n23Y + v2Z1 * n23Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec2.x;
- v1Y = vec2.y;
- v1Z = vec2.z;
- v2X = vec3.x;
- v2Y = vec3.y;
- v2Z = vec3.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- let b;
- if(t < 0) {
- closest.x = v1X;
- closest.y = v1Y;
- closest.z = v1Z;
- b = 1;
- } else if(t > 1) {
- closest.x = v2X;
- closest.y = v2Y;
- closest.z = v2Z;
- b = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- closest.x = pX;
- closest.y = pY;
- closest.z = pZ;
- b = 3;
- }
- let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z;
- if(mind < 0 || d < mind) {
- mini = b << 1;
- mind = d;
- minvX = closest.x;
- minvY = closest.y;
- minvZ = closest.z;
- }
- }
- if(v3X * n31X + v3Y * n31Y + v3Z * n31Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec1.x;
- v1Y = vec1.y;
- v1Z = vec1.z;
- v2X = vec3.x;
- v2Y = vec3.y;
- v2Z = vec3.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- let b;
- if(t < 0) {
- closest.x = v1X;
- closest.y = v1Y;
- closest.z = v1Z;
- b = 1;
- } else if(t > 1) {
- closest.x = v2X;
- closest.y = v2Y;
- closest.z = v2Z;
- b = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- closest.x = pX;
- closest.y = pY;
- closest.z = pZ;
- b = 3;
- }
- let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z;
- if(mind < 0 || d < mind) {
- mini = b & 1 | (b & 2) << 1;
- mind = d;
- minvX = closest.x;
- minvY = closest.y;
- minvZ = closest.z;
- }
- }
- if(mind > 0) {
- closest.x = minvX;
- closest.y = minvY;
- closest.z = minvZ;
- v = mini;
- } else {
- let l = nX * nX + nY * nY + nZ * nZ;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- nX *= l;
- nY *= l;
- nZ *= l;
- let l2 = nX * nX + nY * nY + nZ * nZ;
- l2 = (v1X1 * nX + v1Y1 * nY + v1Z1 * nZ) / l2;
- minvX = nX * l2;
- minvY = nY * l2;
- minvZ = nZ * l2;
- closest.x = minvX;
- closest.y = minvY;
- closest.z = minvZ;
- v = 7;
- }
- break;
- case 4:
- let vec11 = s[0];
- let vec21 = s[1];
- let vec31 = s[2];
- let vec4 = s[3];
- let v1X2;
- let v1Y2;
- let v1Z2;
- let v2X2;
- let v2Y2;
- let v2Z2;
- let v3X1;
- let v3Y1;
- let v3Z1;
- let v4X;
- let v4Y;
- let v4Z;
- let v12X2;
- let v12Y2;
- let v12Z2;
- let v13X;
- let v13Y;
- let v13Z;
- let v14X;
- let v14Y;
- let v14Z;
- let v23X1;
- let v23Y1;
- let v23Z1;
- let v24X;
- let v24Y;
- let v24Z;
- v1X2 = vec11.x;
- v1Y2 = vec11.y;
- v1Z2 = vec11.z;
- v2X2 = vec21.x;
- v2Y2 = vec21.y;
- v2Z2 = vec21.z;
- v3X1 = vec31.x;
- v3Y1 = vec31.y;
- v3Z1 = vec31.z;
- v4X = vec4.x;
- v4Y = vec4.y;
- v4Z = vec4.z;
- v12X2 = v2X2 - v1X2;
- v12Y2 = v2Y2 - v1Y2;
- v12Z2 = v2Z2 - v1Z2;
- v13X = v3X1 - v1X2;
- v13Y = v3Y1 - v1Y2;
- v13Z = v3Z1 - v1Z2;
- v14X = v4X - v1X2;
- v14Y = v4Y - v1Y2;
- v14Z = v4Z - v1Z2;
- v23X1 = v3X1 - v2X2;
- v23Y1 = v3Y1 - v2Y2;
- v23Z1 = v3Z1 - v2Z2;
- v24X = v4X - v2X2;
- v24Y = v4Y - v2Y2;
- v24Z = v4Z - v2Z2;
- let n123X;
- let n123Y;
- let n123Z;
- let n134X;
- let n134Y;
- let n134Z;
- let n142X;
- let n142Y;
- let n142Z;
- let n243X;
- let n243Y;
- let n243Z;
- n123X = v12Y2 * v13Z - v12Z2 * v13Y;
- n123Y = v12Z2 * v13X - v12X2 * v13Z;
- n123Z = v12X2 * v13Y - v12Y2 * v13X;
- n134X = v13Y * v14Z - v13Z * v14Y;
- n134Y = v13Z * v14X - v13X * v14Z;
- n134Z = v13X * v14Y - v13Y * v14X;
- n142X = v14Y * v12Z2 - v14Z * v12Y2;
- n142Y = v14Z * v12X2 - v14X * v12Z2;
- n142Z = v14X * v12Y2 - v14Y * v12X2;
- n243X = v24Y * v23Z1 - v24Z * v23Y1;
- n243Y = v24Z * v23X1 - v24X * v23Z1;
- n243Z = v24X * v23Y1 - v24Y * v23X1;
- let sign = v12X2 * n243X + v12Y2 * n243Y + v12Z2 * n243Z > 0 ? 1 : -1;
- let mind1 = -1;
- let minvX1;
- let minvY1;
- let minvZ1;
- let mini1 = 0;
- minvX1 = 0;
- minvY1 = 0;
- minvZ1 = 0;
- if((v1X2 * n123X + v1Y2 * n123Y + v1Z2 * n123Z) * sign < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- let v3X;
- let v3Y;
- let v3Z;
- let v12X;
- let v12Y;
- let v12Z;
- let v23X;
- let v23Y;
- let v23Z;
- let v31X;
- let v31Y;
- let v31Z;
- v1X = vec11.x;
- v1Y = vec11.y;
- v1Z = vec11.z;
- v2X = vec21.x;
- v2Y = vec21.y;
- v2Z = vec21.z;
- v3X = vec31.x;
- v3Y = vec31.y;
- v3Z = vec31.z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- v23X = v3X - v2X;
- v23Y = v3Y - v2Y;
- v23Z = v3Z - v2Z;
- v31X = v1X - v3X;
- v31Y = v1Y - v3Y;
- v31Z = v1Z - v3Z;
- let nX;
- let nY;
- let nZ;
- nX = v12Y * v23Z - v12Z * v23Y;
- nY = v12Z * v23X - v12X * v23Z;
- nZ = v12X * v23Y - v12Y * v23X;
- let n12X;
- let n12Y;
- let n12Z;
- let n23X;
- let n23Y;
- let n23Z;
- let n31X;
- let n31Y;
- let n31Z;
- n12X = v12Y * nZ - v12Z * nY;
- n12Y = v12Z * nX - v12X * nZ;
- n12Z = v12X * nY - v12Y * nX;
- n23X = v23Y * nZ - v23Z * nY;
- n23Y = v23Z * nX - v23X * nZ;
- n23Z = v23X * nY - v23Y * nX;
- n31X = v31Y * nZ - v31Z * nY;
- n31Y = v31Z * nX - v31X * nZ;
- n31Z = v31X * nY - v31Y * nX;
- let mind = -1;
- let minvX;
- let minvY;
- let minvZ;
- let mini = 0;
- minvX = 0;
- minvY = 0;
- minvZ = 0;
- if(v1X * n12X + v1Y * n12Y + v1Z * n12Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec11.x;
- v1Y = vec11.y;
- v1Z = vec11.z;
- v2X = vec21.x;
- v2Y = vec21.y;
- v2Z = vec21.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- let b;
- if(t < 0) {
- closest.x = v1X;
- closest.y = v1Y;
- closest.z = v1Z;
- b = 1;
- } else if(t > 1) {
- closest.x = v2X;
- closest.y = v2Y;
- closest.z = v2Z;
- b = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- closest.x = pX;
- closest.y = pY;
- closest.z = pZ;
- b = 3;
- }
- mini = b;
- mind = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z;
- minvX = closest.x;
- minvY = closest.y;
- minvZ = closest.z;
- }
- if(v2X * n23X + v2Y * n23Y + v2Z * n23Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec21.x;
- v1Y = vec21.y;
- v1Z = vec21.z;
- v2X = vec31.x;
- v2Y = vec31.y;
- v2Z = vec31.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- let b;
- if(t < 0) {
- closest.x = v1X;
- closest.y = v1Y;
- closest.z = v1Z;
- b = 1;
- } else if(t > 1) {
- closest.x = v2X;
- closest.y = v2Y;
- closest.z = v2Z;
- b = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- closest.x = pX;
- closest.y = pY;
- closest.z = pZ;
- b = 3;
- }
- let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z;
- if(mind < 0 || d < mind) {
- mini = b << 1;
- mind = d;
- minvX = closest.x;
- minvY = closest.y;
- minvZ = closest.z;
- }
- }
- if(v3X * n31X + v3Y * n31Y + v3Z * n31Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec11.x;
- v1Y = vec11.y;
- v1Z = vec11.z;
- v2X = vec31.x;
- v2Y = vec31.y;
- v2Z = vec31.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- let b;
- if(t < 0) {
- closest.x = v1X;
- closest.y = v1Y;
- closest.z = v1Z;
- b = 1;
- } else if(t > 1) {
- closest.x = v2X;
- closest.y = v2Y;
- closest.z = v2Z;
- b = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- closest.x = pX;
- closest.y = pY;
- closest.z = pZ;
- b = 3;
- }
- let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z;
- if(mind < 0 || d < mind) {
- mini = b & 1 | (b & 2) << 1;
- mind = d;
- minvX = closest.x;
- minvY = closest.y;
- minvZ = closest.z;
- }
- }
- let b;
- if(mind > 0) {
- closest.x = minvX;
- closest.y = minvY;
- closest.z = minvZ;
- b = mini;
- } else {
- let l = nX * nX + nY * nY + nZ * nZ;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- nX *= l;
- nY *= l;
- nZ *= l;
- let l2 = nX * nX + nY * nY + nZ * nZ;
- l2 = (v1X * nX + v1Y * nY + v1Z * nZ) / l2;
- minvX = nX * l2;
- minvY = nY * l2;
- minvZ = nZ * l2;
- closest.x = minvX;
- closest.y = minvY;
- closest.z = minvZ;
- b = 7;
- }
- mini1 = b;
- mind1 = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z;
- minvX1 = closest.x;
- minvY1 = closest.y;
- minvZ1 = closest.z;
- }
- if((v1X2 * n134X + v1Y2 * n134Y + v1Z2 * n134Z) * sign < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- let v3X;
- let v3Y;
- let v3Z;
- let v12X;
- let v12Y;
- let v12Z;
- let v23X;
- let v23Y;
- let v23Z;
- let v31X;
- let v31Y;
- let v31Z;
- v1X = vec11.x;
- v1Y = vec11.y;
- v1Z = vec11.z;
- v2X = vec31.x;
- v2Y = vec31.y;
- v2Z = vec31.z;
- v3X = vec4.x;
- v3Y = vec4.y;
- v3Z = vec4.z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- v23X = v3X - v2X;
- v23Y = v3Y - v2Y;
- v23Z = v3Z - v2Z;
- v31X = v1X - v3X;
- v31Y = v1Y - v3Y;
- v31Z = v1Z - v3Z;
- let nX;
- let nY;
- let nZ;
- nX = v12Y * v23Z - v12Z * v23Y;
- nY = v12Z * v23X - v12X * v23Z;
- nZ = v12X * v23Y - v12Y * v23X;
- let n12X;
- let n12Y;
- let n12Z;
- let n23X;
- let n23Y;
- let n23Z;
- let n31X;
- let n31Y;
- let n31Z;
- n12X = v12Y * nZ - v12Z * nY;
- n12Y = v12Z * nX - v12X * nZ;
- n12Z = v12X * nY - v12Y * nX;
- n23X = v23Y * nZ - v23Z * nY;
- n23Y = v23Z * nX - v23X * nZ;
- n23Z = v23X * nY - v23Y * nX;
- n31X = v31Y * nZ - v31Z * nY;
- n31Y = v31Z * nX - v31X * nZ;
- n31Z = v31X * nY - v31Y * nX;
- let mind = -1;
- let minvX;
- let minvY;
- let minvZ;
- let mini = 0;
- minvX = 0;
- minvY = 0;
- minvZ = 0;
- if(v1X * n12X + v1Y * n12Y + v1Z * n12Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec11.x;
- v1Y = vec11.y;
- v1Z = vec11.z;
- v2X = vec31.x;
- v2Y = vec31.y;
- v2Z = vec31.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- let b;
- if(t < 0) {
- closest.x = v1X;
- closest.y = v1Y;
- closest.z = v1Z;
- b = 1;
- } else if(t > 1) {
- closest.x = v2X;
- closest.y = v2Y;
- closest.z = v2Z;
- b = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- closest.x = pX;
- closest.y = pY;
- closest.z = pZ;
- b = 3;
- }
- mini = b;
- mind = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z;
- minvX = closest.x;
- minvY = closest.y;
- minvZ = closest.z;
- }
- if(v2X * n23X + v2Y * n23Y + v2Z * n23Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec31.x;
- v1Y = vec31.y;
- v1Z = vec31.z;
- v2X = vec4.x;
- v2Y = vec4.y;
- v2Z = vec4.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- let b;
- if(t < 0) {
- closest.x = v1X;
- closest.y = v1Y;
- closest.z = v1Z;
- b = 1;
- } else if(t > 1) {
- closest.x = v2X;
- closest.y = v2Y;
- closest.z = v2Z;
- b = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- closest.x = pX;
- closest.y = pY;
- closest.z = pZ;
- b = 3;
- }
- let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z;
- if(mind < 0 || d < mind) {
- mini = b << 1;
- mind = d;
- minvX = closest.x;
- minvY = closest.y;
- minvZ = closest.z;
- }
- }
- if(v3X * n31X + v3Y * n31Y + v3Z * n31Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec11.x;
- v1Y = vec11.y;
- v1Z = vec11.z;
- v2X = vec4.x;
- v2Y = vec4.y;
- v2Z = vec4.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- let b;
- if(t < 0) {
- closest.x = v1X;
- closest.y = v1Y;
- closest.z = v1Z;
- b = 1;
- } else if(t > 1) {
- closest.x = v2X;
- closest.y = v2Y;
- closest.z = v2Z;
- b = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- closest.x = pX;
- closest.y = pY;
- closest.z = pZ;
- b = 3;
- }
- let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z;
- if(mind < 0 || d < mind) {
- mini = b & 1 | (b & 2) << 1;
- mind = d;
- minvX = closest.x;
- minvY = closest.y;
- minvZ = closest.z;
- }
- }
- let b;
- if(mind > 0) {
- closest.x = minvX;
- closest.y = minvY;
- closest.z = minvZ;
- b = mini;
- } else {
- let l = nX * nX + nY * nY + nZ * nZ;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- nX *= l;
- nY *= l;
- nZ *= l;
- let l2 = nX * nX + nY * nY + nZ * nZ;
- l2 = (v1X * nX + v1Y * nY + v1Z * nZ) / l2;
- minvX = nX * l2;
- minvY = nY * l2;
- minvZ = nZ * l2;
- closest.x = minvX;
- closest.y = minvY;
- closest.z = minvZ;
- b = 7;
- }
- let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z;
- if(mind1 < 0 || d < mind1) {
- mini1 = b & 1 | (b & 6) << 1;
- mind1 = d;
- minvX1 = closest.x;
- minvY1 = closest.y;
- minvZ1 = closest.z;
- }
- }
- if((v1X2 * n142X + v1Y2 * n142Y + v1Z2 * n142Z) * sign < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- let v3X;
- let v3Y;
- let v3Z;
- let v12X;
- let v12Y;
- let v12Z;
- let v23X;
- let v23Y;
- let v23Z;
- let v31X;
- let v31Y;
- let v31Z;
- v1X = vec11.x;
- v1Y = vec11.y;
- v1Z = vec11.z;
- v2X = vec21.x;
- v2Y = vec21.y;
- v2Z = vec21.z;
- v3X = vec4.x;
- v3Y = vec4.y;
- v3Z = vec4.z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- v23X = v3X - v2X;
- v23Y = v3Y - v2Y;
- v23Z = v3Z - v2Z;
- v31X = v1X - v3X;
- v31Y = v1Y - v3Y;
- v31Z = v1Z - v3Z;
- let nX;
- let nY;
- let nZ;
- nX = v12Y * v23Z - v12Z * v23Y;
- nY = v12Z * v23X - v12X * v23Z;
- nZ = v12X * v23Y - v12Y * v23X;
- let n12X;
- let n12Y;
- let n12Z;
- let n23X;
- let n23Y;
- let n23Z;
- let n31X;
- let n31Y;
- let n31Z;
- n12X = v12Y * nZ - v12Z * nY;
- n12Y = v12Z * nX - v12X * nZ;
- n12Z = v12X * nY - v12Y * nX;
- n23X = v23Y * nZ - v23Z * nY;
- n23Y = v23Z * nX - v23X * nZ;
- n23Z = v23X * nY - v23Y * nX;
- n31X = v31Y * nZ - v31Z * nY;
- n31Y = v31Z * nX - v31X * nZ;
- n31Z = v31X * nY - v31Y * nX;
- let mind = -1;
- let minvX;
- let minvY;
- let minvZ;
- let mini = 0;
- minvX = 0;
- minvY = 0;
- minvZ = 0;
- if(v1X * n12X + v1Y * n12Y + v1Z * n12Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec11.x;
- v1Y = vec11.y;
- v1Z = vec11.z;
- v2X = vec21.x;
- v2Y = vec21.y;
- v2Z = vec21.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- let b;
- if(t < 0) {
- closest.x = v1X;
- closest.y = v1Y;
- closest.z = v1Z;
- b = 1;
- } else if(t > 1) {
- closest.x = v2X;
- closest.y = v2Y;
- closest.z = v2Z;
- b = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- closest.x = pX;
- closest.y = pY;
- closest.z = pZ;
- b = 3;
- }
- mini = b;
- mind = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z;
- minvX = closest.x;
- minvY = closest.y;
- minvZ = closest.z;
- }
- if(v2X * n23X + v2Y * n23Y + v2Z * n23Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec21.x;
- v1Y = vec21.y;
- v1Z = vec21.z;
- v2X = vec4.x;
- v2Y = vec4.y;
- v2Z = vec4.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- let b;
- if(t < 0) {
- closest.x = v1X;
- closest.y = v1Y;
- closest.z = v1Z;
- b = 1;
- } else if(t > 1) {
- closest.x = v2X;
- closest.y = v2Y;
- closest.z = v2Z;
- b = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- closest.x = pX;
- closest.y = pY;
- closest.z = pZ;
- b = 3;
- }
- let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z;
- if(mind < 0 || d < mind) {
- mini = b << 1;
- mind = d;
- minvX = closest.x;
- minvY = closest.y;
- minvZ = closest.z;
- }
- }
- if(v3X * n31X + v3Y * n31Y + v3Z * n31Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec11.x;
- v1Y = vec11.y;
- v1Z = vec11.z;
- v2X = vec4.x;
- v2Y = vec4.y;
- v2Z = vec4.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- let b;
- if(t < 0) {
- closest.x = v1X;
- closest.y = v1Y;
- closest.z = v1Z;
- b = 1;
- } else if(t > 1) {
- closest.x = v2X;
- closest.y = v2Y;
- closest.z = v2Z;
- b = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- closest.x = pX;
- closest.y = pY;
- closest.z = pZ;
- b = 3;
- }
- let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z;
- if(mind < 0 || d < mind) {
- mini = b & 1 | (b & 2) << 1;
- mind = d;
- minvX = closest.x;
- minvY = closest.y;
- minvZ = closest.z;
- }
- }
- let b;
- if(mind > 0) {
- closest.x = minvX;
- closest.y = minvY;
- closest.z = minvZ;
- b = mini;
- } else {
- let l = nX * nX + nY * nY + nZ * nZ;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- nX *= l;
- nY *= l;
- nZ *= l;
- let l2 = nX * nX + nY * nY + nZ * nZ;
- l2 = (v1X * nX + v1Y * nY + v1Z * nZ) / l2;
- minvX = nX * l2;
- minvY = nY * l2;
- minvZ = nZ * l2;
- closest.x = minvX;
- closest.y = minvY;
- closest.z = minvZ;
- b = 7;
- }
- let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z;
- if(mind1 < 0 || d < mind1) {
- mini1 = b & 3 | (b & 4) << 1;
- mind1 = d;
- minvX1 = closest.x;
- minvY1 = closest.y;
- minvZ1 = closest.z;
- }
- }
- if((v2X2 * n243X + v2Y2 * n243Y + v2Z2 * n243Z) * sign < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- let v3X;
- let v3Y;
- let v3Z;
- let v12X;
- let v12Y;
- let v12Z;
- let v23X;
- let v23Y;
- let v23Z;
- let v31X;
- let v31Y;
- let v31Z;
- v1X = vec21.x;
- v1Y = vec21.y;
- v1Z = vec21.z;
- v2X = vec31.x;
- v2Y = vec31.y;
- v2Z = vec31.z;
- v3X = vec4.x;
- v3Y = vec4.y;
- v3Z = vec4.z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- v23X = v3X - v2X;
- v23Y = v3Y - v2Y;
- v23Z = v3Z - v2Z;
- v31X = v1X - v3X;
- v31Y = v1Y - v3Y;
- v31Z = v1Z - v3Z;
- let nX;
- let nY;
- let nZ;
- nX = v12Y * v23Z - v12Z * v23Y;
- nY = v12Z * v23X - v12X * v23Z;
- nZ = v12X * v23Y - v12Y * v23X;
- let n12X;
- let n12Y;
- let n12Z;
- let n23X;
- let n23Y;
- let n23Z;
- let n31X;
- let n31Y;
- let n31Z;
- n12X = v12Y * nZ - v12Z * nY;
- n12Y = v12Z * nX - v12X * nZ;
- n12Z = v12X * nY - v12Y * nX;
- n23X = v23Y * nZ - v23Z * nY;
- n23Y = v23Z * nX - v23X * nZ;
- n23Z = v23X * nY - v23Y * nX;
- n31X = v31Y * nZ - v31Z * nY;
- n31Y = v31Z * nX - v31X * nZ;
- n31Z = v31X * nY - v31Y * nX;
- let mind = -1;
- let minvX;
- let minvY;
- let minvZ;
- let mini = 0;
- minvX = 0;
- minvY = 0;
- minvZ = 0;
- if(v1X * n12X + v1Y * n12Y + v1Z * n12Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec21.x;
- v1Y = vec21.y;
- v1Z = vec21.z;
- v2X = vec31.x;
- v2Y = vec31.y;
- v2Z = vec31.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- let b;
- if(t < 0) {
- closest.x = v1X;
- closest.y = v1Y;
- closest.z = v1Z;
- b = 1;
- } else if(t > 1) {
- closest.x = v2X;
- closest.y = v2Y;
- closest.z = v2Z;
- b = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- closest.x = pX;
- closest.y = pY;
- closest.z = pZ;
- b = 3;
- }
- mini = b;
- mind = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z;
- minvX = closest.x;
- minvY = closest.y;
- minvZ = closest.z;
- }
- if(v2X * n23X + v2Y * n23Y + v2Z * n23Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec31.x;
- v1Y = vec31.y;
- v1Z = vec31.z;
- v2X = vec4.x;
- v2Y = vec4.y;
- v2Z = vec4.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- let b;
- if(t < 0) {
- closest.x = v1X;
- closest.y = v1Y;
- closest.z = v1Z;
- b = 1;
- } else if(t > 1) {
- closest.x = v2X;
- closest.y = v2Y;
- closest.z = v2Z;
- b = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- closest.x = pX;
- closest.y = pY;
- closest.z = pZ;
- b = 3;
- }
- let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z;
- if(mind < 0 || d < mind) {
- mini = b << 1;
- mind = d;
- minvX = closest.x;
- minvY = closest.y;
- minvZ = closest.z;
- }
- }
- if(v3X * n31X + v3Y * n31Y + v3Z * n31Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec21.x;
- v1Y = vec21.y;
- v1Z = vec21.z;
- v2X = vec4.x;
- v2Y = vec4.y;
- v2Z = vec4.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- let b;
- if(t < 0) {
- closest.x = v1X;
- closest.y = v1Y;
- closest.z = v1Z;
- b = 1;
- } else if(t > 1) {
- closest.x = v2X;
- closest.y = v2Y;
- closest.z = v2Z;
- b = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- closest.x = pX;
- closest.y = pY;
- closest.z = pZ;
- b = 3;
- }
- let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z;
- if(mind < 0 || d < mind) {
- mini = b & 1 | (b & 2) << 1;
- mind = d;
- minvX = closest.x;
- minvY = closest.y;
- minvZ = closest.z;
- }
- }
- let b;
- if(mind > 0) {
- closest.x = minvX;
- closest.y = minvY;
- closest.z = minvZ;
- b = mini;
- } else {
- let l = nX * nX + nY * nY + nZ * nZ;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- nX *= l;
- nY *= l;
- nZ *= l;
- let l2 = nX * nX + nY * nY + nZ * nZ;
- l2 = (v1X * nX + v1Y * nY + v1Z * nZ) / l2;
- minvX = nX * l2;
- minvY = nY * l2;
- minvZ = nZ * l2;
- closest.x = minvX;
- closest.y = minvY;
- closest.z = minvZ;
- b = 7;
- }
- let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z;
- if(mind1 < 0 || d < mind1) {
- mini1 = b << 1;
- mind1 = d;
- minvX1 = closest.x;
- minvY1 = closest.y;
- minvZ1 = closest.z;
- }
- }
- if(mind1 > 0) {
- closest.x = minvX1;
- closest.y = minvY1;
- closest.z = minvZ1;
- v = mini1;
- } else {
- closest.zero();
- v = 15;
- }
- break;
- }
- if(closest.x * closest.x + closest.y * closest.y + closest.z * closest.z < 1e-008) {
- if(!useEpa) {
- this.distance = 0;
- return 0;
- }
- switch(this.simplexSize) {
- case 1:
- this.pointToTetrahedron();
- break;
- case 2:
- this.lineToTetrahedron();
- break;
- case 3:
- this.triangleToTetrahedron();
- break;
- }
- if(this.simplexSize == 4) {
- let epaState = this.computeDepth(c1,c2,tf1,tf2,s,w1,w2);
- if(epaState != 0) {
- this.distance = 0;
- return epaState;
- }
- this.distance = -this.depth;
- return 0;
- }
- this.distance = 0;
- return 1;
- }
- this.shrinkSimplex(v);
- dir.x = closest.x;
- dir.y = closest.y;
- dir.z = closest.z;
- dir.x = -dir.x;
- dir.y = -dir.y;
- dir.z = -dir.z;
- this.computeWitnessPoint1(false);
- this.computeWitnessPoint2(false);
- let _this = this.s[this.simplexSize];
- let v4 = this.w1[this.simplexSize];
- _this.x = v4.x;
- _this.y = v4.y;
- _this.z = v4.z;
- let v5 = this.w2[this.simplexSize];
- _this.x -= v5.x;
- _this.y -= v5.y;
- _this.z -= v5.z;
- if(dir.x * dir.x + dir.y * dir.y + dir.z * dir.z < 1e-008) {
- throw new Error("!?");
- }
- let _this1 = s[this.simplexSize];
- if(_this1.x * dir.x + _this1.y * dir.y + _this1.z * dir.z - (closest.x * dir.x + closest.y * dir.y + closest.z * dir.z) < 1e-008) {
- this.interpolateClosestPoints();
- this.distance = Math.sqrt(closest.x * closest.x + closest.y * closest.y + closest.z * closest.z);
- if(cache != null && cache._gjkCache != null) {
- this.saveCache(cache._gjkCache);
- }
- return 0;
- }
- this.simplexSize++;
- ++count;
- }
- return 2;
- }
- convexCastImpl(c1,c2,tf1,tf2,tl1,tl2,hit) {
- this.c1 = c1;
- this.c2 = c2;
- this.tf1 = tf1;
- this.tf2 = tf2;
- let s = this.s;
- let closest = this.closest;
- let dir = this.dir;
- let firstDirX;
- let firstDirY;
- let firstDirZ;
- firstDirX = tf2._positionX - tf1._positionX;
- firstDirY = tf2._positionY - tf1._positionY;
- firstDirZ = tf2._positionZ - tf1._positionZ;
- dir.x = firstDirX;
- dir.y = firstDirY;
- dir.z = firstDirZ;
- if(dir.x * dir.x + dir.y * dir.y + dir.z * dir.z < 1e-6) {
- dir.init(1,0,0);
- }
- this.simplexSize = 0;
- if(this.c1 != null) {
- this.computeWitnessPoint1(true);
- } else {
- let v = this.w1[this.simplexSize];
- v.x = this.tf1._positionX;
- v.y = this.tf1._positionY;
- v.z = this.tf1._positionZ;
- }
- this.computeWitnessPoint2(true);
- let _this = this.s[this.simplexSize];
- let v = this.w1[this.simplexSize];
- _this.x = v.x;
- _this.y = v.y;
- _this.z = v.z;
- let v1 = this.w2[this.simplexSize];
- _this.x -= v1.x;
- _this.y -= v1.y;
- _this.z -= v1.z;
- this.simplexSize = 1;
- let count = 0;
- let lambda = 0.0;
- let rayX = this.rayX;
- let rayR = this.rayR;
- rayX.zero();
- rayR.x = tl2.x;
- rayR.y = tl2.y;
- rayR.z = tl2.z;
- rayR.x -= tl1.x;
- rayR.y -= tl1.y;
- rayR.z -= tl1.z;
- while(count < 40) {
- let v = 0;
- switch(this.simplexSize) {
- case 1:
- let v1 = s[0];
- closest.x = v1.x;
- closest.y = v1.y;
- closest.z = v1.z;
- v = 1;
- break;
- case 2:
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- let v2 = s[0];
- v1X = v2.x;
- v1Y = v2.y;
- v1Z = v2.z;
- let v3 = s[1];
- v2X = v3.x;
- v2Y = v3.y;
- v2Z = v3.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- if(t < 0) {
- closest.x = v1X;
- closest.y = v1Y;
- closest.z = v1Z;
- v = 1;
- } else if(t > 1) {
- closest.x = v2X;
- closest.y = v2Y;
- closest.z = v2Z;
- v = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- closest.x = pX;
- closest.y = pY;
- closest.z = pZ;
- v = 3;
- }
- break;
- case 3:
- let vec1 = s[0];
- let vec2 = s[1];
- let vec3 = s[2];
- let v1X1;
- let v1Y1;
- let v1Z1;
- let v2X1;
- let v2Y1;
- let v2Z1;
- let v3X;
- let v3Y;
- let v3Z;
- let v12X1;
- let v12Y1;
- let v12Z1;
- let v23X;
- let v23Y;
- let v23Z;
- let v31X;
- let v31Y;
- let v31Z;
- v1X1 = vec1.x;
- v1Y1 = vec1.y;
- v1Z1 = vec1.z;
- v2X1 = vec2.x;
- v2Y1 = vec2.y;
- v2Z1 = vec2.z;
- v3X = vec3.x;
- v3Y = vec3.y;
- v3Z = vec3.z;
- v12X1 = v2X1 - v1X1;
- v12Y1 = v2Y1 - v1Y1;
- v12Z1 = v2Z1 - v1Z1;
- v23X = v3X - v2X1;
- v23Y = v3Y - v2Y1;
- v23Z = v3Z - v2Z1;
- v31X = v1X1 - v3X;
- v31Y = v1Y1 - v3Y;
- v31Z = v1Z1 - v3Z;
- let nX;
- let nY;
- let nZ;
- nX = v12Y1 * v23Z - v12Z1 * v23Y;
- nY = v12Z1 * v23X - v12X1 * v23Z;
- nZ = v12X1 * v23Y - v12Y1 * v23X;
- let n12X;
- let n12Y;
- let n12Z;
- let n23X;
- let n23Y;
- let n23Z;
- let n31X;
- let n31Y;
- let n31Z;
- n12X = v12Y1 * nZ - v12Z1 * nY;
- n12Y = v12Z1 * nX - v12X1 * nZ;
- n12Z = v12X1 * nY - v12Y1 * nX;
- n23X = v23Y * nZ - v23Z * nY;
- n23Y = v23Z * nX - v23X * nZ;
- n23Z = v23X * nY - v23Y * nX;
- n31X = v31Y * nZ - v31Z * nY;
- n31Y = v31Z * nX - v31X * nZ;
- n31Z = v31X * nY - v31Y * nX;
- let mind = -1;
- let minvX;
- let minvY;
- let minvZ;
- let mini = 0;
- minvX = 0;
- minvY = 0;
- minvZ = 0;
- if(v1X1 * n12X + v1Y1 * n12Y + v1Z1 * n12Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec1.x;
- v1Y = vec1.y;
- v1Z = vec1.z;
- v2X = vec2.x;
- v2Y = vec2.y;
- v2Z = vec2.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- let b;
- if(t < 0) {
- closest.x = v1X;
- closest.y = v1Y;
- closest.z = v1Z;
- b = 1;
- } else if(t > 1) {
- closest.x = v2X;
- closest.y = v2Y;
- closest.z = v2Z;
- b = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- closest.x = pX;
- closest.y = pY;
- closest.z = pZ;
- b = 3;
- }
- mini = b;
- mind = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z;
- minvX = closest.x;
- minvY = closest.y;
- minvZ = closest.z;
- }
- if(v2X1 * n23X + v2Y1 * n23Y + v2Z1 * n23Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec2.x;
- v1Y = vec2.y;
- v1Z = vec2.z;
- v2X = vec3.x;
- v2Y = vec3.y;
- v2Z = vec3.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- let b;
- if(t < 0) {
- closest.x = v1X;
- closest.y = v1Y;
- closest.z = v1Z;
- b = 1;
- } else if(t > 1) {
- closest.x = v2X;
- closest.y = v2Y;
- closest.z = v2Z;
- b = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- closest.x = pX;
- closest.y = pY;
- closest.z = pZ;
- b = 3;
- }
- let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z;
- if(mind < 0 || d < mind) {
- mini = b << 1;
- mind = d;
- minvX = closest.x;
- minvY = closest.y;
- minvZ = closest.z;
- }
- }
- if(v3X * n31X + v3Y * n31Y + v3Z * n31Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec1.x;
- v1Y = vec1.y;
- v1Z = vec1.z;
- v2X = vec3.x;
- v2Y = vec3.y;
- v2Z = vec3.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- let b;
- if(t < 0) {
- closest.x = v1X;
- closest.y = v1Y;
- closest.z = v1Z;
- b = 1;
- } else if(t > 1) {
- closest.x = v2X;
- closest.y = v2Y;
- closest.z = v2Z;
- b = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- closest.x = pX;
- closest.y = pY;
- closest.z = pZ;
- b = 3;
- }
- let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z;
- if(mind < 0 || d < mind) {
- mini = b & 1 | (b & 2) << 1;
- mind = d;
- minvX = closest.x;
- minvY = closest.y;
- minvZ = closest.z;
- }
- }
- if(mind > 0) {
- closest.x = minvX;
- closest.y = minvY;
- closest.z = minvZ;
- v = mini;
- } else {
- let l = nX * nX + nY * nY + nZ * nZ;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- nX *= l;
- nY *= l;
- nZ *= l;
- let l2 = nX * nX + nY * nY + nZ * nZ;
- l2 = (v1X1 * nX + v1Y1 * nY + v1Z1 * nZ) / l2;
- minvX = nX * l2;
- minvY = nY * l2;
- minvZ = nZ * l2;
- closest.x = minvX;
- closest.y = minvY;
- closest.z = minvZ;
- v = 7;
- }
- break;
- case 4:
- let vec11 = s[0];
- let vec21 = s[1];
- let vec31 = s[2];
- let vec4 = s[3];
- let v1X2;
- let v1Y2;
- let v1Z2;
- let v2X2;
- let v2Y2;
- let v2Z2;
- let v3X1;
- let v3Y1;
- let v3Z1;
- let v4X;
- let v4Y;
- let v4Z;
- let v12X2;
- let v12Y2;
- let v12Z2;
- let v13X;
- let v13Y;
- let v13Z;
- let v14X;
- let v14Y;
- let v14Z;
- let v23X1;
- let v23Y1;
- let v23Z1;
- let v24X;
- let v24Y;
- let v24Z;
- v1X2 = vec11.x;
- v1Y2 = vec11.y;
- v1Z2 = vec11.z;
- v2X2 = vec21.x;
- v2Y2 = vec21.y;
- v2Z2 = vec21.z;
- v3X1 = vec31.x;
- v3Y1 = vec31.y;
- v3Z1 = vec31.z;
- v4X = vec4.x;
- v4Y = vec4.y;
- v4Z = vec4.z;
- v12X2 = v2X2 - v1X2;
- v12Y2 = v2Y2 - v1Y2;
- v12Z2 = v2Z2 - v1Z2;
- v13X = v3X1 - v1X2;
- v13Y = v3Y1 - v1Y2;
- v13Z = v3Z1 - v1Z2;
- v14X = v4X - v1X2;
- v14Y = v4Y - v1Y2;
- v14Z = v4Z - v1Z2;
- v23X1 = v3X1 - v2X2;
- v23Y1 = v3Y1 - v2Y2;
- v23Z1 = v3Z1 - v2Z2;
- v24X = v4X - v2X2;
- v24Y = v4Y - v2Y2;
- v24Z = v4Z - v2Z2;
- let n123X;
- let n123Y;
- let n123Z;
- let n134X;
- let n134Y;
- let n134Z;
- let n142X;
- let n142Y;
- let n142Z;
- let n243X;
- let n243Y;
- let n243Z;
- n123X = v12Y2 * v13Z - v12Z2 * v13Y;
- n123Y = v12Z2 * v13X - v12X2 * v13Z;
- n123Z = v12X2 * v13Y - v12Y2 * v13X;
- n134X = v13Y * v14Z - v13Z * v14Y;
- n134Y = v13Z * v14X - v13X * v14Z;
- n134Z = v13X * v14Y - v13Y * v14X;
- n142X = v14Y * v12Z2 - v14Z * v12Y2;
- n142Y = v14Z * v12X2 - v14X * v12Z2;
- n142Z = v14X * v12Y2 - v14Y * v12X2;
- n243X = v24Y * v23Z1 - v24Z * v23Y1;
- n243Y = v24Z * v23X1 - v24X * v23Z1;
- n243Z = v24X * v23Y1 - v24Y * v23X1;
- let sign = v12X2 * n243X + v12Y2 * n243Y + v12Z2 * n243Z > 0 ? 1 : -1;
- let mind1 = -1;
- let minvX1;
- let minvY1;
- let minvZ1;
- let mini1 = 0;
- minvX1 = 0;
- minvY1 = 0;
- minvZ1 = 0;
- if((v1X2 * n123X + v1Y2 * n123Y + v1Z2 * n123Z) * sign < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- let v3X;
- let v3Y;
- let v3Z;
- let v12X;
- let v12Y;
- let v12Z;
- let v23X;
- let v23Y;
- let v23Z;
- let v31X;
- let v31Y;
- let v31Z;
- v1X = vec11.x;
- v1Y = vec11.y;
- v1Z = vec11.z;
- v2X = vec21.x;
- v2Y = vec21.y;
- v2Z = vec21.z;
- v3X = vec31.x;
- v3Y = vec31.y;
- v3Z = vec31.z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- v23X = v3X - v2X;
- v23Y = v3Y - v2Y;
- v23Z = v3Z - v2Z;
- v31X = v1X - v3X;
- v31Y = v1Y - v3Y;
- v31Z = v1Z - v3Z;
- let nX;
- let nY;
- let nZ;
- nX = v12Y * v23Z - v12Z * v23Y;
- nY = v12Z * v23X - v12X * v23Z;
- nZ = v12X * v23Y - v12Y * v23X;
- let n12X;
- let n12Y;
- let n12Z;
- let n23X;
- let n23Y;
- let n23Z;
- let n31X;
- let n31Y;
- let n31Z;
- n12X = v12Y * nZ - v12Z * nY;
- n12Y = v12Z * nX - v12X * nZ;
- n12Z = v12X * nY - v12Y * nX;
- n23X = v23Y * nZ - v23Z * nY;
- n23Y = v23Z * nX - v23X * nZ;
- n23Z = v23X * nY - v23Y * nX;
- n31X = v31Y * nZ - v31Z * nY;
- n31Y = v31Z * nX - v31X * nZ;
- n31Z = v31X * nY - v31Y * nX;
- let mind = -1;
- let minvX;
- let minvY;
- let minvZ;
- let mini = 0;
- minvX = 0;
- minvY = 0;
- minvZ = 0;
- if(v1X * n12X + v1Y * n12Y + v1Z * n12Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec11.x;
- v1Y = vec11.y;
- v1Z = vec11.z;
- v2X = vec21.x;
- v2Y = vec21.y;
- v2Z = vec21.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- let b;
- if(t < 0) {
- closest.x = v1X;
- closest.y = v1Y;
- closest.z = v1Z;
- b = 1;
- } else if(t > 1) {
- closest.x = v2X;
- closest.y = v2Y;
- closest.z = v2Z;
- b = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- closest.x = pX;
- closest.y = pY;
- closest.z = pZ;
- b = 3;
- }
- mini = b;
- mind = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z;
- minvX = closest.x;
- minvY = closest.y;
- minvZ = closest.z;
- }
- if(v2X * n23X + v2Y * n23Y + v2Z * n23Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec21.x;
- v1Y = vec21.y;
- v1Z = vec21.z;
- v2X = vec31.x;
- v2Y = vec31.y;
- v2Z = vec31.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- let b;
- if(t < 0) {
- closest.x = v1X;
- closest.y = v1Y;
- closest.z = v1Z;
- b = 1;
- } else if(t > 1) {
- closest.x = v2X;
- closest.y = v2Y;
- closest.z = v2Z;
- b = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- closest.x = pX;
- closest.y = pY;
- closest.z = pZ;
- b = 3;
- }
- let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z;
- if(mind < 0 || d < mind) {
- mini = b << 1;
- mind = d;
- minvX = closest.x;
- minvY = closest.y;
- minvZ = closest.z;
- }
- }
- if(v3X * n31X + v3Y * n31Y + v3Z * n31Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec11.x;
- v1Y = vec11.y;
- v1Z = vec11.z;
- v2X = vec31.x;
- v2Y = vec31.y;
- v2Z = vec31.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- let b;
- if(t < 0) {
- closest.x = v1X;
- closest.y = v1Y;
- closest.z = v1Z;
- b = 1;
- } else if(t > 1) {
- closest.x = v2X;
- closest.y = v2Y;
- closest.z = v2Z;
- b = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- closest.x = pX;
- closest.y = pY;
- closest.z = pZ;
- b = 3;
- }
- let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z;
- if(mind < 0 || d < mind) {
- mini = b & 1 | (b & 2) << 1;
- mind = d;
- minvX = closest.x;
- minvY = closest.y;
- minvZ = closest.z;
- }
- }
- let b;
- if(mind > 0) {
- closest.x = minvX;
- closest.y = minvY;
- closest.z = minvZ;
- b = mini;
- } else {
- let l = nX * nX + nY * nY + nZ * nZ;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- nX *= l;
- nY *= l;
- nZ *= l;
- let l2 = nX * nX + nY * nY + nZ * nZ;
- l2 = (v1X * nX + v1Y * nY + v1Z * nZ) / l2;
- minvX = nX * l2;
- minvY = nY * l2;
- minvZ = nZ * l2;
- closest.x = minvX;
- closest.y = minvY;
- closest.z = minvZ;
- b = 7;
- }
- mini1 = b;
- mind1 = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z;
- minvX1 = closest.x;
- minvY1 = closest.y;
- minvZ1 = closest.z;
- }
- if((v1X2 * n134X + v1Y2 * n134Y + v1Z2 * n134Z) * sign < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- let v3X;
- let v3Y;
- let v3Z;
- let v12X;
- let v12Y;
- let v12Z;
- let v23X;
- let v23Y;
- let v23Z;
- let v31X;
- let v31Y;
- let v31Z;
- v1X = vec11.x;
- v1Y = vec11.y;
- v1Z = vec11.z;
- v2X = vec31.x;
- v2Y = vec31.y;
- v2Z = vec31.z;
- v3X = vec4.x;
- v3Y = vec4.y;
- v3Z = vec4.z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- v23X = v3X - v2X;
- v23Y = v3Y - v2Y;
- v23Z = v3Z - v2Z;
- v31X = v1X - v3X;
- v31Y = v1Y - v3Y;
- v31Z = v1Z - v3Z;
- let nX;
- let nY;
- let nZ;
- nX = v12Y * v23Z - v12Z * v23Y;
- nY = v12Z * v23X - v12X * v23Z;
- nZ = v12X * v23Y - v12Y * v23X;
- let n12X;
- let n12Y;
- let n12Z;
- let n23X;
- let n23Y;
- let n23Z;
- let n31X;
- let n31Y;
- let n31Z;
- n12X = v12Y * nZ - v12Z * nY;
- n12Y = v12Z * nX - v12X * nZ;
- n12Z = v12X * nY - v12Y * nX;
- n23X = v23Y * nZ - v23Z * nY;
- n23Y = v23Z * nX - v23X * nZ;
- n23Z = v23X * nY - v23Y * nX;
- n31X = v31Y * nZ - v31Z * nY;
- n31Y = v31Z * nX - v31X * nZ;
- n31Z = v31X * nY - v31Y * nX;
- let mind = -1;
- let minvX;
- let minvY;
- let minvZ;
- let mini = 0;
- minvX = 0;
- minvY = 0;
- minvZ = 0;
- if(v1X * n12X + v1Y * n12Y + v1Z * n12Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec11.x;
- v1Y = vec11.y;
- v1Z = vec11.z;
- v2X = vec31.x;
- v2Y = vec31.y;
- v2Z = vec31.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- let b;
- if(t < 0) {
- closest.x = v1X;
- closest.y = v1Y;
- closest.z = v1Z;
- b = 1;
- } else if(t > 1) {
- closest.x = v2X;
- closest.y = v2Y;
- closest.z = v2Z;
- b = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- closest.x = pX;
- closest.y = pY;
- closest.z = pZ;
- b = 3;
- }
- mini = b;
- mind = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z;
- minvX = closest.x;
- minvY = closest.y;
- minvZ = closest.z;
- }
- if(v2X * n23X + v2Y * n23Y + v2Z * n23Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec31.x;
- v1Y = vec31.y;
- v1Z = vec31.z;
- v2X = vec4.x;
- v2Y = vec4.y;
- v2Z = vec4.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- let b;
- if(t < 0) {
- closest.x = v1X;
- closest.y = v1Y;
- closest.z = v1Z;
- b = 1;
- } else if(t > 1) {
- closest.x = v2X;
- closest.y = v2Y;
- closest.z = v2Z;
- b = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- closest.x = pX;
- closest.y = pY;
- closest.z = pZ;
- b = 3;
- }
- let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z;
- if(mind < 0 || d < mind) {
- mini = b << 1;
- mind = d;
- minvX = closest.x;
- minvY = closest.y;
- minvZ = closest.z;
- }
- }
- if(v3X * n31X + v3Y * n31Y + v3Z * n31Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec11.x;
- v1Y = vec11.y;
- v1Z = vec11.z;
- v2X = vec4.x;
- v2Y = vec4.y;
- v2Z = vec4.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- let b;
- if(t < 0) {
- closest.x = v1X;
- closest.y = v1Y;
- closest.z = v1Z;
- b = 1;
- } else if(t > 1) {
- closest.x = v2X;
- closest.y = v2Y;
- closest.z = v2Z;
- b = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- closest.x = pX;
- closest.y = pY;
- closest.z = pZ;
- b = 3;
- }
- let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z;
- if(mind < 0 || d < mind) {
- mini = b & 1 | (b & 2) << 1;
- mind = d;
- minvX = closest.x;
- minvY = closest.y;
- minvZ = closest.z;
- }
- }
- let b;
- if(mind > 0) {
- closest.x = minvX;
- closest.y = minvY;
- closest.z = minvZ;
- b = mini;
- } else {
- let l = nX * nX + nY * nY + nZ * nZ;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- nX *= l;
- nY *= l;
- nZ *= l;
- let l2 = nX * nX + nY * nY + nZ * nZ;
- l2 = (v1X * nX + v1Y * nY + v1Z * nZ) / l2;
- minvX = nX * l2;
- minvY = nY * l2;
- minvZ = nZ * l2;
- closest.x = minvX;
- closest.y = minvY;
- closest.z = minvZ;
- b = 7;
- }
- let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z;
- if(mind1 < 0 || d < mind1) {
- mini1 = b & 1 | (b & 6) << 1;
- mind1 = d;
- minvX1 = closest.x;
- minvY1 = closest.y;
- minvZ1 = closest.z;
- }
- }
- if((v1X2 * n142X + v1Y2 * n142Y + v1Z2 * n142Z) * sign < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- let v3X;
- let v3Y;
- let v3Z;
- let v12X;
- let v12Y;
- let v12Z;
- let v23X;
- let v23Y;
- let v23Z;
- let v31X;
- let v31Y;
- let v31Z;
- v1X = vec11.x;
- v1Y = vec11.y;
- v1Z = vec11.z;
- v2X = vec21.x;
- v2Y = vec21.y;
- v2Z = vec21.z;
- v3X = vec4.x;
- v3Y = vec4.y;
- v3Z = vec4.z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- v23X = v3X - v2X;
- v23Y = v3Y - v2Y;
- v23Z = v3Z - v2Z;
- v31X = v1X - v3X;
- v31Y = v1Y - v3Y;
- v31Z = v1Z - v3Z;
- let nX;
- let nY;
- let nZ;
- nX = v12Y * v23Z - v12Z * v23Y;
- nY = v12Z * v23X - v12X * v23Z;
- nZ = v12X * v23Y - v12Y * v23X;
- let n12X;
- let n12Y;
- let n12Z;
- let n23X;
- let n23Y;
- let n23Z;
- let n31X;
- let n31Y;
- let n31Z;
- n12X = v12Y * nZ - v12Z * nY;
- n12Y = v12Z * nX - v12X * nZ;
- n12Z = v12X * nY - v12Y * nX;
- n23X = v23Y * nZ - v23Z * nY;
- n23Y = v23Z * nX - v23X * nZ;
- n23Z = v23X * nY - v23Y * nX;
- n31X = v31Y * nZ - v31Z * nY;
- n31Y = v31Z * nX - v31X * nZ;
- n31Z = v31X * nY - v31Y * nX;
- let mind = -1;
- let minvX;
- let minvY;
- let minvZ;
- let mini = 0;
- minvX = 0;
- minvY = 0;
- minvZ = 0;
- if(v1X * n12X + v1Y * n12Y + v1Z * n12Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec11.x;
- v1Y = vec11.y;
- v1Z = vec11.z;
- v2X = vec21.x;
- v2Y = vec21.y;
- v2Z = vec21.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- let b;
- if(t < 0) {
- closest.x = v1X;
- closest.y = v1Y;
- closest.z = v1Z;
- b = 1;
- } else if(t > 1) {
- closest.x = v2X;
- closest.y = v2Y;
- closest.z = v2Z;
- b = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- closest.x = pX;
- closest.y = pY;
- closest.z = pZ;
- b = 3;
- }
- mini = b;
- mind = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z;
- minvX = closest.x;
- minvY = closest.y;
- minvZ = closest.z;
- }
- if(v2X * n23X + v2Y * n23Y + v2Z * n23Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec21.x;
- v1Y = vec21.y;
- v1Z = vec21.z;
- v2X = vec4.x;
- v2Y = vec4.y;
- v2Z = vec4.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- let b;
- if(t < 0) {
- closest.x = v1X;
- closest.y = v1Y;
- closest.z = v1Z;
- b = 1;
- } else if(t > 1) {
- closest.x = v2X;
- closest.y = v2Y;
- closest.z = v2Z;
- b = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- closest.x = pX;
- closest.y = pY;
- closest.z = pZ;
- b = 3;
- }
- let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z;
- if(mind < 0 || d < mind) {
- mini = b << 1;
- mind = d;
- minvX = closest.x;
- minvY = closest.y;
- minvZ = closest.z;
- }
- }
- if(v3X * n31X + v3Y * n31Y + v3Z * n31Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec11.x;
- v1Y = vec11.y;
- v1Z = vec11.z;
- v2X = vec4.x;
- v2Y = vec4.y;
- v2Z = vec4.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- let b;
- if(t < 0) {
- closest.x = v1X;
- closest.y = v1Y;
- closest.z = v1Z;
- b = 1;
- } else if(t > 1) {
- closest.x = v2X;
- closest.y = v2Y;
- closest.z = v2Z;
- b = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- closest.x = pX;
- closest.y = pY;
- closest.z = pZ;
- b = 3;
- }
- let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z;
- if(mind < 0 || d < mind) {
- mini = b & 1 | (b & 2) << 1;
- mind = d;
- minvX = closest.x;
- minvY = closest.y;
- minvZ = closest.z;
- }
- }
- let b;
- if(mind > 0) {
- closest.x = minvX;
- closest.y = minvY;
- closest.z = minvZ;
- b = mini;
- } else {
- let l = nX * nX + nY * nY + nZ * nZ;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- nX *= l;
- nY *= l;
- nZ *= l;
- let l2 = nX * nX + nY * nY + nZ * nZ;
- l2 = (v1X * nX + v1Y * nY + v1Z * nZ) / l2;
- minvX = nX * l2;
- minvY = nY * l2;
- minvZ = nZ * l2;
- closest.x = minvX;
- closest.y = minvY;
- closest.z = minvZ;
- b = 7;
- }
- let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z;
- if(mind1 < 0 || d < mind1) {
- mini1 = b & 3 | (b & 4) << 1;
- mind1 = d;
- minvX1 = closest.x;
- minvY1 = closest.y;
- minvZ1 = closest.z;
- }
- }
- if((v2X2 * n243X + v2Y2 * n243Y + v2Z2 * n243Z) * sign < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- let v3X;
- let v3Y;
- let v3Z;
- let v12X;
- let v12Y;
- let v12Z;
- let v23X;
- let v23Y;
- let v23Z;
- let v31X;
- let v31Y;
- let v31Z;
- v1X = vec21.x;
- v1Y = vec21.y;
- v1Z = vec21.z;
- v2X = vec31.x;
- v2Y = vec31.y;
- v2Z = vec31.z;
- v3X = vec4.x;
- v3Y = vec4.y;
- v3Z = vec4.z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- v23X = v3X - v2X;
- v23Y = v3Y - v2Y;
- v23Z = v3Z - v2Z;
- v31X = v1X - v3X;
- v31Y = v1Y - v3Y;
- v31Z = v1Z - v3Z;
- let nX;
- let nY;
- let nZ;
- nX = v12Y * v23Z - v12Z * v23Y;
- nY = v12Z * v23X - v12X * v23Z;
- nZ = v12X * v23Y - v12Y * v23X;
- let n12X;
- let n12Y;
- let n12Z;
- let n23X;
- let n23Y;
- let n23Z;
- let n31X;
- let n31Y;
- let n31Z;
- n12X = v12Y * nZ - v12Z * nY;
- n12Y = v12Z * nX - v12X * nZ;
- n12Z = v12X * nY - v12Y * nX;
- n23X = v23Y * nZ - v23Z * nY;
- n23Y = v23Z * nX - v23X * nZ;
- n23Z = v23X * nY - v23Y * nX;
- n31X = v31Y * nZ - v31Z * nY;
- n31Y = v31Z * nX - v31X * nZ;
- n31Z = v31X * nY - v31Y * nX;
- let mind = -1;
- let minvX;
- let minvY;
- let minvZ;
- let mini = 0;
- minvX = 0;
- minvY = 0;
- minvZ = 0;
- if(v1X * n12X + v1Y * n12Y + v1Z * n12Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec21.x;
- v1Y = vec21.y;
- v1Z = vec21.z;
- v2X = vec31.x;
- v2Y = vec31.y;
- v2Z = vec31.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- let b;
- if(t < 0) {
- closest.x = v1X;
- closest.y = v1Y;
- closest.z = v1Z;
- b = 1;
- } else if(t > 1) {
- closest.x = v2X;
- closest.y = v2Y;
- closest.z = v2Z;
- b = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- closest.x = pX;
- closest.y = pY;
- closest.z = pZ;
- b = 3;
- }
- mini = b;
- mind = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z;
- minvX = closest.x;
- minvY = closest.y;
- minvZ = closest.z;
- }
- if(v2X * n23X + v2Y * n23Y + v2Z * n23Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec31.x;
- v1Y = vec31.y;
- v1Z = vec31.z;
- v2X = vec4.x;
- v2Y = vec4.y;
- v2Z = vec4.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- let b;
- if(t < 0) {
- closest.x = v1X;
- closest.y = v1Y;
- closest.z = v1Z;
- b = 1;
- } else if(t > 1) {
- closest.x = v2X;
- closest.y = v2Y;
- closest.z = v2Z;
- b = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- closest.x = pX;
- closest.y = pY;
- closest.z = pZ;
- b = 3;
- }
- let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z;
- if(mind < 0 || d < mind) {
- mini = b << 1;
- mind = d;
- minvX = closest.x;
- minvY = closest.y;
- minvZ = closest.z;
- }
- }
- if(v3X * n31X + v3Y * n31Y + v3Z * n31Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec21.x;
- v1Y = vec21.y;
- v1Z = vec21.z;
- v2X = vec4.x;
- v2Y = vec4.y;
- v2Z = vec4.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- let b;
- if(t < 0) {
- closest.x = v1X;
- closest.y = v1Y;
- closest.z = v1Z;
- b = 1;
- } else if(t > 1) {
- closest.x = v2X;
- closest.y = v2Y;
- closest.z = v2Z;
- b = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- closest.x = pX;
- closest.y = pY;
- closest.z = pZ;
- b = 3;
- }
- let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z;
- if(mind < 0 || d < mind) {
- mini = b & 1 | (b & 2) << 1;
- mind = d;
- minvX = closest.x;
- minvY = closest.y;
- minvZ = closest.z;
- }
- }
- let b;
- if(mind > 0) {
- closest.x = minvX;
- closest.y = minvY;
- closest.z = minvZ;
- b = mini;
- } else {
- let l = nX * nX + nY * nY + nZ * nZ;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- nX *= l;
- nY *= l;
- nZ *= l;
- let l2 = nX * nX + nY * nY + nZ * nZ;
- l2 = (v1X * nX + v1Y * nY + v1Z * nZ) / l2;
- minvX = nX * l2;
- minvY = nY * l2;
- minvZ = nZ * l2;
- closest.x = minvX;
- closest.y = minvY;
- closest.z = minvZ;
- b = 7;
- }
- let d = closest.x * closest.x + closest.y * closest.y + closest.z * closest.z;
- if(mind1 < 0 || d < mind1) {
- mini1 = b << 1;
- mind1 = d;
- minvX1 = closest.x;
- minvY1 = closest.y;
- minvZ1 = closest.z;
- }
- }
- if(mind1 > 0) {
- closest.x = minvX1;
- closest.y = minvY1;
- closest.z = minvZ1;
- v = mini1;
- } else {
- closest.zero();
- v = 15;
- }
- break;
- }
- this.shrinkSimplex(v);
- if(closest.x * closest.x + closest.y * closest.y + closest.z * closest.z < 1e-008) {
- if(lambda == 0 || this.simplexSize == 4) {
- hit.fraction = lambda;
- return false;
- }
- this.interpolateClosestPoints();
- hit.fraction = lambda;
- let _this = hit.normal;
- _this.x = dir.x;
- _this.y = dir.y;
- _this.z = dir.z;
- let invLen = Math.sqrt(_this.x * _this.x + _this.y * _this.y + _this.z * _this.z);
- if(invLen > 0) {
- invLen = 1 / invLen;
- }
- _this.x *= invLen;
- _this.y *= invLen;
- _this.z *= invLen;
- let _this1 = hit.position;
- let v = this.closestPoint1;
- _this1.x = v.x;
- _this1.y = v.y;
- _this1.z = v.z;
- _this1.x += tl1.x * lambda;
- _this1.y += tl1.y * lambda;
- _this1.z += tl1.z * lambda;
- return true;
- }
- dir.x = closest.x;
- dir.y = closest.y;
- dir.z = closest.z;
- dir.x = -dir.x;
- dir.y = -dir.y;
- dir.z = -dir.z;
- if(this.c1 != null) {
- this.computeWitnessPoint1(true);
- } else {
- let v = this.w1[this.simplexSize];
- v.x = this.tf1._positionX;
- v.y = this.tf1._positionY;
- v.z = this.tf1._positionZ;
- }
- this.computeWitnessPoint2(true);
- let _this = this.s[this.simplexSize];
- let v4 = this.w1[this.simplexSize];
- _this.x = v4.x;
- _this.y = v4.y;
- _this.z = v4.z;
- let v5 = this.w2[this.simplexSize];
- _this.x -= v5.x;
- _this.y -= v5.y;
- _this.z -= v5.z;
- let _this1 = s[this.simplexSize];
- _this1.x -= rayX.x;
- _this1.y -= rayX.y;
- _this1.z -= rayX.z;
- if(dir.x * dir.x + dir.y * dir.y + dir.z * dir.z < 1e-008) {
- throw new Error("!?");
- }
- let p = s[this.simplexSize];
- let pn = p.x * dir.x + p.y * dir.y + p.z * dir.z;
- if(pn < 0) {
- if(rayR.x * dir.x + rayR.y * dir.y + rayR.z * dir.z >= 0) {
- return false;
- }
- let dLambda = pn / (rayR.x * dir.x + rayR.y * dir.y + rayR.z * dir.z);
- lambda += dLambda;
- if(lambda >= 1) {
- return false;
- }
- rayX.x += rayR.x * dLambda;
- rayX.y += rayR.y * dLambda;
- rayX.z += rayR.z * dLambda;
- let _g = 0;
- let _g1 = this.simplexSize + 1;
- while(_g < _g1) {
- let _this = s[_g++];
- let s1 = -dLambda;
- _this.x += rayR.x * s1;
- _this.y += rayR.y * s1;
- _this.z += rayR.z * s1;
- }
- }
- let duplicate = false;
- let _g = 0;
- let _g1 = this.simplexSize;
- while(_g < _g1) {
- let i = _g++;
- let dx = s[i].x - s[this.simplexSize].x;
- let dy = s[i].y - s[this.simplexSize].y;
- let dz = s[i].z - s[this.simplexSize].z;
- if(dx * dx + dy * dy + dz * dz < 1e-008) {
- duplicate = true;
- break;
- }
- }
- if(!duplicate) {
- this.simplexSize++;
- }
- ++count;
- }
- return false;
- }
- interpolateClosestPoints() {
- switch(this.simplexSize) {
- case 1:
- let _this = this.closestPoint1;
- let v = this.w1[0];
- _this.x = v.x;
- _this.y = v.y;
- _this.z = v.z;
- let _this1 = this.closestPoint2;
- let v1 = this.w2[0];
- _this1.x = v1.x;
- _this1.y = v1.y;
- _this1.z = v1.z;
- break;
- case 2:
- let cX;
- let cY;
- let cZ;
- let v2 = this.closest;
- cX = v2.x;
- cY = v2.y;
- cZ = v2.z;
- let s0X;
- let s0Y;
- let s0Z;
- let w10X;
- let w10Y;
- let w10Z;
- let w20X;
- let w20Y;
- let w20Z;
- let s1X;
- let s1Y;
- let s1Z;
- let w11X;
- let w11Y;
- let w11Z;
- let w21X;
- let w21Y;
- let w21Z;
- let v3 = this.s[0];
- s0X = v3.x;
- s0Y = v3.y;
- s0Z = v3.z;
- let v4 = this.w1[0];
- w10X = v4.x;
- w10Y = v4.y;
- w10Z = v4.z;
- let v5 = this.w2[0];
- w20X = v5.x;
- w20Y = v5.y;
- w20Z = v5.z;
- let v6 = this.s[1];
- s1X = v6.x;
- s1Y = v6.y;
- s1Z = v6.z;
- let v7 = this.w1[1];
- w11X = v7.x;
- w11Y = v7.y;
- w11Z = v7.z;
- let v8 = this.w2[1];
- w21X = v8.x;
- w21Y = v8.y;
- w21Z = v8.z;
- let s01X;
- let s01Y;
- let s01Z;
- s01X = s1X - s0X;
- s01Y = s1Y - s0Y;
- s01Z = s1Z - s0Z;
- let invDet = s01X * s01X + s01Y * s01Y + s01Z * s01Z;
- if(invDet != 0) {
- invDet = 1 / invDet;
- }
- let s0cX;
- let s0cY;
- let s0cZ;
- s0cX = cX - s0X;
- s0cY = cY - s0Y;
- s0cZ = cZ - s0Z;
- let t = (s0cX * s01X + s0cY * s01Y + s0cZ * s01Z) * invDet;
- let diffX;
- let diffY;
- let diffZ;
- let cp1X;
- let cp1Y;
- let cp1Z;
- let cp2X;
- let cp2Y;
- let cp2Z;
- diffX = w11X - w10X;
- diffY = w11Y - w10Y;
- diffZ = w11Z - w10Z;
- cp1X = w10X + diffX * t;
- cp1Y = w10Y + diffY * t;
- cp1Z = w10Z + diffZ * t;
- diffX = w21X - w20X;
- diffY = w21Y - w20Y;
- diffZ = w21Z - w20Z;
- cp2X = w20X + diffX * t;
- cp2Y = w20Y + diffY * t;
- cp2Z = w20Z + diffZ * t;
- let v9 = this.closestPoint1;
- v9.x = cp1X;
- v9.y = cp1Y;
- v9.z = cp1Z;
- let v10 = this.closestPoint2;
- v10.x = cp2X;
- v10.y = cp2Y;
- v10.z = cp2Z;
- break;
- case 3:
- let cX1;
- let cY1;
- let cZ1;
- let v11 = this.closest;
- cX1 = v11.x;
- cY1 = v11.y;
- cZ1 = v11.z;
- let s0X1;
- let s0Y1;
- let s0Z1;
- let w10X1;
- let w10Y1;
- let w10Z1;
- let w20X1;
- let w20Y1;
- let w20Z1;
- let s1X1;
- let s1Y1;
- let s1Z1;
- let w11X1;
- let w11Y1;
- let w11Z1;
- let w21X1;
- let w21Y1;
- let w21Z1;
- let s2X;
- let s2Y;
- let s2Z;
- let w12X;
- let w12Y;
- let w12Z;
- let w22X;
- let w22Y;
- let w22Z;
- let v12 = this.s[0];
- s0X1 = v12.x;
- s0Y1 = v12.y;
- s0Z1 = v12.z;
- let v13 = this.w1[0];
- w10X1 = v13.x;
- w10Y1 = v13.y;
- w10Z1 = v13.z;
- let v14 = this.w2[0];
- w20X1 = v14.x;
- w20Y1 = v14.y;
- w20Z1 = v14.z;
- let v15 = this.s[1];
- s1X1 = v15.x;
- s1Y1 = v15.y;
- s1Z1 = v15.z;
- let v16 = this.w1[1];
- w11X1 = v16.x;
- w11Y1 = v16.y;
- w11Z1 = v16.z;
- let v17 = this.w2[1];
- w21X1 = v17.x;
- w21Y1 = v17.y;
- w21Z1 = v17.z;
- let v18 = this.s[2];
- s2X = v18.x;
- s2Y = v18.y;
- s2Z = v18.z;
- let v19 = this.w1[2];
- w12X = v19.x;
- w12Y = v19.y;
- w12Z = v19.z;
- let v20 = this.w2[2];
- w22X = v20.x;
- w22Y = v20.y;
- w22Z = v20.z;
- let s01X1;
- let s01Y1;
- let s01Z1;
- let s02X;
- let s02Y;
- let s02Z;
- let s0cX1;
- let s0cY1;
- let s0cZ1;
- s01X1 = s1X1 - s0X1;
- s01Y1 = s1Y1 - s0Y1;
- s01Z1 = s1Z1 - s0Z1;
- s02X = s2X - s0X1;
- s02Y = s2Y - s0Y1;
- s02Z = s2Z - s0Z1;
- s0cX1 = cX1 - s0X1;
- s0cY1 = cY1 - s0Y1;
- s0cZ1 = cZ1 - s0Z1;
- let d11 = s01X1 * s01X1 + s01Y1 * s01Y1 + s01Z1 * s01Z1;
- let d12 = s01X1 * s02X + s01Y1 * s02Y + s01Z1 * s02Z;
- let d22 = s02X * s02X + s02Y * s02Y + s02Z * s02Z;
- let d1c = s01X1 * s0cX1 + s01Y1 * s0cY1 + s01Z1 * s0cZ1;
- let d2c = s02X * s0cX1 + s02Y * s0cY1 + s02Z * s0cZ1;
- let invDet1 = d11 * d22 - d12 * d12;
- if(invDet1 != 0) {
- invDet1 = 1 / invDet1;
- }
- let s = (d1c * d22 - d2c * d12) * invDet1;
- let t1 = (-d1c * d12 + d2c * d11) * invDet1;
- let diffX1;
- let diffY1;
- let diffZ1;
- let cp1X1;
- let cp1Y1;
- let cp1Z1;
- let cp2X1;
- let cp2Y1;
- let cp2Z1;
- diffX1 = w11X1 - w10X1;
- diffY1 = w11Y1 - w10Y1;
- diffZ1 = w11Z1 - w10Z1;
- cp1X1 = w10X1 + diffX1 * s;
- cp1Y1 = w10Y1 + diffY1 * s;
- cp1Z1 = w10Z1 + diffZ1 * s;
- diffX1 = w12X - w10X1;
- diffY1 = w12Y - w10Y1;
- diffZ1 = w12Z - w10Z1;
- cp1X1 += diffX1 * t1;
- cp1Y1 += diffY1 * t1;
- cp1Z1 += diffZ1 * t1;
- diffX1 = w21X1 - w20X1;
- diffY1 = w21Y1 - w20Y1;
- diffZ1 = w21Z1 - w20Z1;
- cp2X1 = w20X1 + diffX1 * s;
- cp2Y1 = w20Y1 + diffY1 * s;
- cp2Z1 = w20Z1 + diffZ1 * s;
- diffX1 = w22X - w20X1;
- diffY1 = w22Y - w20Y1;
- diffZ1 = w22Z - w20Z1;
- cp2X1 += diffX1 * t1;
- cp2Y1 += diffY1 * t1;
- cp2Z1 += diffZ1 * t1;
- let v21 = this.closestPoint1;
- v21.x = cp1X1;
- v21.y = cp1Y1;
- v21.z = cp1Z1;
- let v22 = this.closestPoint2;
- v22.x = cp2X1;
- v22.y = cp2Y1;
- v22.z = cp2Z1;
- break;
- default:
- throw new Error("!?");
- }
- }
- loadCache(gjkCache) {
- let _this = this.dir;
- let v = gjkCache.prevClosestDir;
- _this.x = v.x;
- _this.y = v.y;
- _this.z = v.z;
- }
- saveCache(gjkCache) {
- let _this = gjkCache.prevClosestDir;
- let v = this.closest;
- _this.x = v.x;
- _this.y = v.y;
- _this.z = v.z;
- _this.x = -_this.x;
- _this.y = -_this.y;
- _this.z = -_this.z;
- }
- shrinkSimplex(vertexBits) {
- this.simplexSize = vertexBits;
- this.simplexSize = (this.simplexSize & 5) + (this.simplexSize >> 1 & 5);
- this.simplexSize = (this.simplexSize & 3) + (this.simplexSize >> 2 & 3);
- switch(vertexBits) {
- case 2:
- let _this = this.s[0];
- let v = this.s[1];
- _this.x = v.x;
- _this.y = v.y;
- _this.z = v.z;
- let _this1 = this.w1[0];
- let v1 = this.w1[1];
- _this1.x = v1.x;
- _this1.y = v1.y;
- _this1.z = v1.z;
- let _this2 = this.w2[0];
- let v2 = this.w2[1];
- _this2.x = v2.x;
- _this2.y = v2.y;
- _this2.z = v2.z;
- break;
- case 4:
- let _this3 = this.s[0];
- let v3 = this.s[2];
- _this3.x = v3.x;
- _this3.y = v3.y;
- _this3.z = v3.z;
- let _this4 = this.w1[0];
- let v4 = this.w1[2];
- _this4.x = v4.x;
- _this4.y = v4.y;
- _this4.z = v4.z;
- let _this5 = this.w2[0];
- let v5 = this.w2[2];
- _this5.x = v5.x;
- _this5.y = v5.y;
- _this5.z = v5.z;
- break;
- case 5:
- let _this6 = this.s[1];
- let v6 = this.s[2];
- _this6.x = v6.x;
- _this6.y = v6.y;
- _this6.z = v6.z;
- let _this7 = this.w1[1];
- let v7 = this.w1[2];
- _this7.x = v7.x;
- _this7.y = v7.y;
- _this7.z = v7.z;
- let _this8 = this.w2[1];
- let v8 = this.w2[2];
- _this8.x = v8.x;
- _this8.y = v8.y;
- _this8.z = v8.z;
- break;
- case 6:
- let _this9 = this.s[0];
- let v9 = this.s[2];
- _this9.x = v9.x;
- _this9.y = v9.y;
- _this9.z = v9.z;
- let _this10 = this.w1[0];
- let v10 = this.w1[2];
- _this10.x = v10.x;
- _this10.y = v10.y;
- _this10.z = v10.z;
- let _this11 = this.w2[0];
- let v11 = this.w2[2];
- _this11.x = v11.x;
- _this11.y = v11.y;
- _this11.z = v11.z;
- break;
- case 8:
- let _this12 = this.s[0];
- let v12 = this.s[3];
- _this12.x = v12.x;
- _this12.y = v12.y;
- _this12.z = v12.z;
- let _this13 = this.w1[0];
- let v13 = this.w1[3];
- _this13.x = v13.x;
- _this13.y = v13.y;
- _this13.z = v13.z;
- let _this14 = this.w2[0];
- let v14 = this.w2[3];
- _this14.x = v14.x;
- _this14.y = v14.y;
- _this14.z = v14.z;
- break;
- case 9:
- let _this15 = this.s[1];
- let v15 = this.s[3];
- _this15.x = v15.x;
- _this15.y = v15.y;
- _this15.z = v15.z;
- let _this16 = this.w1[1];
- let v16 = this.w1[3];
- _this16.x = v16.x;
- _this16.y = v16.y;
- _this16.z = v16.z;
- let _this17 = this.w2[1];
- let v17 = this.w2[3];
- _this17.x = v17.x;
- _this17.y = v17.y;
- _this17.z = v17.z;
- break;
- case 10:
- let _this18 = this.s[0];
- let v18 = this.s[3];
- _this18.x = v18.x;
- _this18.y = v18.y;
- _this18.z = v18.z;
- let _this19 = this.w1[0];
- let v19 = this.w1[3];
- _this19.x = v19.x;
- _this19.y = v19.y;
- _this19.z = v19.z;
- let _this20 = this.w2[0];
- let v20 = this.w2[3];
- _this20.x = v20.x;
- _this20.y = v20.y;
- _this20.z = v20.z;
- break;
- case 11:
- let _this21 = this.s[2];
- let v21 = this.s[3];
- _this21.x = v21.x;
- _this21.y = v21.y;
- _this21.z = v21.z;
- let _this22 = this.w1[2];
- let v22 = this.w1[3];
- _this22.x = v22.x;
- _this22.y = v22.y;
- _this22.z = v22.z;
- let _this23 = this.w2[2];
- let v23 = this.w2[3];
- _this23.x = v23.x;
- _this23.y = v23.y;
- _this23.z = v23.z;
- break;
- case 12:
- let _this24 = this.s[0];
- let v24 = this.s[2];
- _this24.x = v24.x;
- _this24.y = v24.y;
- _this24.z = v24.z;
- let _this25 = this.w1[0];
- let v25 = this.w1[2];
- _this25.x = v25.x;
- _this25.y = v25.y;
- _this25.z = v25.z;
- let _this26 = this.w2[0];
- let v26 = this.w2[2];
- _this26.x = v26.x;
- _this26.y = v26.y;
- _this26.z = v26.z;
- let _this27 = this.s[1];
- let v27 = this.s[3];
- _this27.x = v27.x;
- _this27.y = v27.y;
- _this27.z = v27.z;
- let _this28 = this.w1[1];
- let v28 = this.w1[3];
- _this28.x = v28.x;
- _this28.y = v28.y;
- _this28.z = v28.z;
- let _this29 = this.w2[1];
- let v29 = this.w2[3];
- _this29.x = v29.x;
- _this29.y = v29.y;
- _this29.z = v29.z;
- break;
- case 13:
- let _this30 = this.s[1];
- let v30 = this.s[3];
- _this30.x = v30.x;
- _this30.y = v30.y;
- _this30.z = v30.z;
- let _this31 = this.w1[1];
- let v31 = this.w1[3];
- _this31.x = v31.x;
- _this31.y = v31.y;
- _this31.z = v31.z;
- let _this32 = this.w2[1];
- let v32 = this.w2[3];
- _this32.x = v32.x;
- _this32.y = v32.y;
- _this32.z = v32.z;
- break;
- case 14:
- let _this33 = this.s[0];
- let v33 = this.s[3];
- _this33.x = v33.x;
- _this33.y = v33.y;
- _this33.z = v33.z;
- let _this34 = this.w1[0];
- let v34 = this.w1[3];
- _this34.x = v34.x;
- _this34.y = v34.y;
- _this34.z = v34.z;
- let _this35 = this.w2[0];
- let v35 = this.w2[3];
- _this35.x = v35.x;
- _this35.y = v35.y;
- _this35.z = v35.z;
- break;
- }
- }
- computeWitnessPoint1(addMargin) {
- let tmpX;
- let tmpY;
- let tmpZ;
- let idirX;
- let idirY;
- let idirZ;
- let v = this.dir;
- idirX = v.x;
- idirY = v.y;
- idirZ = v.z;
- let ldir1X;
- let ldir1Y;
- let ldir1Z;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = this.tf1._rotation00 * idirX + this.tf1._rotation10 * idirY + this.tf1._rotation20 * idirZ;
- __tmp__Y = this.tf1._rotation01 * idirX + this.tf1._rotation11 * idirY + this.tf1._rotation21 * idirZ;
- __tmp__Z = this.tf1._rotation02 * idirX + this.tf1._rotation12 * idirY + this.tf1._rotation22 * idirZ;
- ldir1X = __tmp__X;
- ldir1Y = __tmp__Y;
- ldir1Z = __tmp__Z;
- let iw1X;
- let iw1Y;
- let iw1Z;
- let v1 = this.dir;
- v1.x = ldir1X;
- v1.y = ldir1Y;
- v1.z = ldir1Z;
- this.c1.computeLocalSupportingVertex(this.dir,this.w1[this.simplexSize]);
- if(addMargin) {
- let _this = this.dir;
- let invLen = Math.sqrt(_this.x * _this.x + _this.y * _this.y + _this.z * _this.z);
- if(invLen > 0) {
- invLen = 1 / invLen;
- }
- _this.x *= invLen;
- _this.y *= invLen;
- _this.z *= invLen;
- let _this1 = this.w1[this.simplexSize];
- let v = this.dir;
- let s = this.c1._gjkMargin;
- _this1.x += v.x * s;
- _this1.y += v.y * s;
- _this1.z += v.z * s;
- }
- let v2 = this.w1[this.simplexSize];
- tmpX = v2.x;
- tmpY = v2.y;
- tmpZ = v2.z;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = this.tf1._rotation00 * tmpX + this.tf1._rotation01 * tmpY + this.tf1._rotation02 * tmpZ;
- __tmp__Y1 = this.tf1._rotation10 * tmpX + this.tf1._rotation11 * tmpY + this.tf1._rotation12 * tmpZ;
- __tmp__Z1 = this.tf1._rotation20 * tmpX + this.tf1._rotation21 * tmpY + this.tf1._rotation22 * tmpZ;
- iw1X = __tmp__X1;
- iw1Y = __tmp__Y1;
- iw1Z = __tmp__Z1;
- iw1X += this.tf1._positionX;
- iw1Y += this.tf1._positionY;
- iw1Z += this.tf1._positionZ;
- let v3 = this.w1[this.simplexSize];
- v3.x = iw1X;
- v3.y = iw1Y;
- v3.z = iw1Z;
- let v4 = this.dir;
- v4.x = idirX;
- v4.y = idirY;
- v4.z = idirZ;
- }
- computeWitnessPoint2(addMargin) {
- let tmpX;
- let tmpY;
- let tmpZ;
- let idirX;
- let idirY;
- let idirZ;
- let v = this.dir;
- idirX = v.x;
- idirY = v.y;
- idirZ = v.z;
- let ldir2X;
- let ldir2Y;
- let ldir2Z;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = this.tf2._rotation00 * idirX + this.tf2._rotation10 * idirY + this.tf2._rotation20 * idirZ;
- __tmp__Y = this.tf2._rotation01 * idirX + this.tf2._rotation11 * idirY + this.tf2._rotation21 * idirZ;
- __tmp__Z = this.tf2._rotation02 * idirX + this.tf2._rotation12 * idirY + this.tf2._rotation22 * idirZ;
- ldir2X = __tmp__X;
- ldir2Y = __tmp__Y;
- ldir2Z = __tmp__Z;
- ldir2X = -ldir2X;
- ldir2Y = -ldir2Y;
- ldir2Z = -ldir2Z;
- let iw2X;
- let iw2Y;
- let iw2Z;
- let v1 = this.dir;
- v1.x = ldir2X;
- v1.y = ldir2Y;
- v1.z = ldir2Z;
- this.c2.computeLocalSupportingVertex(this.dir,this.w2[this.simplexSize]);
- if(addMargin) {
- let _this = this.dir;
- let invLen = Math.sqrt(_this.x * _this.x + _this.y * _this.y + _this.z * _this.z);
- if(invLen > 0) {
- invLen = 1 / invLen;
- }
- _this.x *= invLen;
- _this.y *= invLen;
- _this.z *= invLen;
- let _this1 = this.w2[this.simplexSize];
- let v = this.dir;
- let s = this.c2._gjkMargin;
- _this1.x += v.x * s;
- _this1.y += v.y * s;
- _this1.z += v.z * s;
- }
- let v2 = this.w2[this.simplexSize];
- tmpX = v2.x;
- tmpY = v2.y;
- tmpZ = v2.z;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = this.tf2._rotation00 * tmpX + this.tf2._rotation01 * tmpY + this.tf2._rotation02 * tmpZ;
- __tmp__Y1 = this.tf2._rotation10 * tmpX + this.tf2._rotation11 * tmpY + this.tf2._rotation12 * tmpZ;
- __tmp__Z1 = this.tf2._rotation20 * tmpX + this.tf2._rotation21 * tmpY + this.tf2._rotation22 * tmpZ;
- iw2X = __tmp__X1;
- iw2Y = __tmp__Y1;
- iw2Z = __tmp__Z1;
- iw2X += this.tf2._positionX;
- iw2Y += this.tf2._positionY;
- iw2Z += this.tf2._positionZ;
- let v3 = this.w2[this.simplexSize];
- v3.x = iw2X;
- v3.y = iw2Y;
- v3.z = iw2Z;
- let v4 = this.dir;
- v4.x = idirX;
- v4.y = idirY;
- v4.z = idirZ;
- }
- pointToTetrahedron() {
- let _g = 0;
- while(_g < 3) {
- let _this = this.dir;
- let v = this.baseDirs[_g++];
- _this.x = v.x;
- _this.y = v.y;
- _this.z = v.z;
- this.computeWitnessPoint1(false);
- this.computeWitnessPoint2(false);
- let _this1 = this.s[this.simplexSize];
- let v1 = this.w1[this.simplexSize];
- _this1.x = v1.x;
- _this1.y = v1.y;
- _this1.z = v1.z;
- let v2 = this.w2[this.simplexSize];
- _this1.x -= v2.x;
- _this1.y -= v2.y;
- _this1.z -= v2.z;
- this.simplexSize++;
- this.lineToTetrahedron();
- if(this.simplexSize == 4) {
- break;
- }
- this.simplexSize--;
- let _this2 = this.dir;
- _this2.x = -_this2.x;
- _this2.y = -_this2.y;
- _this2.z = -_this2.z;
- this.computeWitnessPoint1(false);
- this.computeWitnessPoint2(false);
- let _this3 = this.s[this.simplexSize];
- let v3 = this.w1[this.simplexSize];
- _this3.x = v3.x;
- _this3.y = v3.y;
- _this3.z = v3.z;
- let v4 = this.w2[this.simplexSize];
- _this3.x -= v4.x;
- _this3.y -= v4.y;
- _this3.z -= v4.z;
- this.simplexSize++;
- this.lineToTetrahedron();
- if(this.simplexSize == 4) {
- break;
- }
- this.simplexSize--;
- }
- }
- lineToTetrahedron() {
- let oldDirX;
- let oldDirY;
- let oldDirZ;
- let v = this.dir;
- oldDirX = v.x;
- oldDirY = v.y;
- oldDirZ = v.z;
- let s0X;
- let s0Y;
- let s0Z;
- let s1X;
- let s1Y;
- let s1Z;
- let lineDirX;
- let lineDirY;
- let lineDirZ;
- let v1 = this.s[0];
- s0X = v1.x;
- s0Y = v1.y;
- s0Z = v1.z;
- let v2 = this.s[1];
- s1X = v2.x;
- s1Y = v2.y;
- s1Z = v2.z;
- lineDirX = s0X - s1X;
- lineDirY = s0Y - s1Y;
- lineDirZ = s0Z - s1Z;
- let _g = 0;
- while(_g < 3) {
- let baseDirX;
- let baseDirY;
- let baseDirZ;
- let v = this.baseDirs[_g++];
- baseDirX = v.x;
- baseDirY = v.y;
- baseDirZ = v.z;
- let newDirX;
- let newDirY;
- let newDirZ;
- newDirX = lineDirY * baseDirZ - lineDirZ * baseDirY;
- newDirY = lineDirZ * baseDirX - lineDirX * baseDirZ;
- newDirZ = lineDirX * baseDirY - lineDirY * baseDirX;
- let v1 = this.dir;
- v1.x = newDirX;
- v1.y = newDirY;
- v1.z = newDirZ;
- this.computeWitnessPoint1(false);
- this.computeWitnessPoint2(false);
- let _this = this.s[this.simplexSize];
- let v2 = this.w1[this.simplexSize];
- _this.x = v2.x;
- _this.y = v2.y;
- _this.z = v2.z;
- let v3 = this.w2[this.simplexSize];
- _this.x -= v3.x;
- _this.y -= v3.y;
- _this.z -= v3.z;
- this.simplexSize++;
- this.triangleToTetrahedron();
- if(this.simplexSize == 4) {
- break;
- }
- this.simplexSize--;
- let _this1 = this.dir;
- _this1.x = -_this1.x;
- _this1.y = -_this1.y;
- _this1.z = -_this1.z;
- this.computeWitnessPoint1(false);
- this.computeWitnessPoint2(false);
- let _this2 = this.s[this.simplexSize];
- let v4 = this.w1[this.simplexSize];
- _this2.x = v4.x;
- _this2.y = v4.y;
- _this2.z = v4.z;
- let v5 = this.w2[this.simplexSize];
- _this2.x -= v5.x;
- _this2.y -= v5.y;
- _this2.z -= v5.z;
- this.simplexSize++;
- this.triangleToTetrahedron();
- if(this.simplexSize == 4) {
- break;
- }
- this.simplexSize--;
- }
- let v3 = this.dir;
- v3.x = oldDirX;
- v3.y = oldDirY;
- v3.z = oldDirZ;
- }
- triangleToTetrahedron() {
- let oldDirX;
- let oldDirY;
- let oldDirZ;
- let v = this.dir;
- oldDirX = v.x;
- oldDirY = v.y;
- oldDirZ = v.z;
- while(true) {
- let s0X;
- let s0Y;
- let s0Z;
- let s1X;
- let s1Y;
- let s1Z;
- let s2X;
- let s2Y;
- let s2Z;
- let s01X;
- let s01Y;
- let s01Z;
- let s02X;
- let s02Y;
- let s02Z;
- let v = this.s[0];
- s0X = v.x;
- s0Y = v.y;
- s0Z = v.z;
- let v1 = this.s[1];
- s1X = v1.x;
- s1Y = v1.y;
- s1Z = v1.z;
- let v2 = this.s[2];
- s2X = v2.x;
- s2Y = v2.y;
- s2Z = v2.z;
- s01X = s1X - s0X;
- s01Y = s1Y - s0Y;
- s01Z = s1Z - s0Z;
- s02X = s2X - s0X;
- s02Y = s2Y - s0Y;
- s02Z = s2Z - s0Z;
- let nX;
- let nY;
- let nZ;
- nX = s01Y * s02Z - s01Z * s02Y;
- nY = s01Z * s02X - s01X * s02Z;
- nZ = s01X * s02Y - s01Y * s02X;
- let v3 = this.dir;
- v3.x = nX;
- v3.y = nY;
- v3.z = nZ;
- this.computeWitnessPoint1(false);
- this.computeWitnessPoint2(false);
- let _this = this.s[this.simplexSize];
- let v4 = this.w1[this.simplexSize];
- _this.x = v4.x;
- _this.y = v4.y;
- _this.z = v4.z;
- let v5 = this.w2[this.simplexSize];
- _this.x -= v5.x;
- _this.y -= v5.y;
- _this.z -= v5.z;
- this.simplexSize++;
- if(this.isValidTetrahedron()) {
- break;
- }
- this.simplexSize--;
- let _this1 = this.dir;
- _this1.x = -_this1.x;
- _this1.y = -_this1.y;
- _this1.z = -_this1.z;
- this.computeWitnessPoint1(false);
- this.computeWitnessPoint2(false);
- let _this2 = this.s[this.simplexSize];
- let v6 = this.w1[this.simplexSize];
- _this2.x = v6.x;
- _this2.y = v6.y;
- _this2.z = v6.z;
- let v7 = this.w2[this.simplexSize];
- _this2.x -= v7.x;
- _this2.y -= v7.y;
- _this2.z -= v7.z;
- this.simplexSize++;
- if(this.isValidTetrahedron()) {
- break;
- }
- this.simplexSize--;
- break;
- }
- let v1 = this.dir;
- v1.x = oldDirX;
- v1.y = oldDirY;
- v1.z = oldDirZ;
- }
- isValidTetrahedron() {
- let e10 = this.s[2].x - this.s[0].x;
- let e11 = this.s[2].y - this.s[0].y;
- let e12 = this.s[2].z - this.s[0].z;
- let e20 = this.s[3].x - this.s[0].x;
- let e21 = this.s[3].y - this.s[0].y;
- let e22 = this.s[3].z - this.s[0].z;
- let det = (this.s[1].x - this.s[0].x) * (e11 * e22 - e12 * e21) - (this.s[1].y - this.s[0].y) * (e10 * e22 - e12 * e20) + (this.s[1].z - this.s[0].z) * (e10 * e21 - e11 * e20);
- if(!(det > 1e-12)) {
- return det < -1e-12;
- } else {
- return true;
- }
- }
- computeDepth(convex1,convex2,tf1,tf2,initialPolyhedron,initialPolyhedron1,initialPolyhedron2) {
- let _this = this.polyhedron;
- while(_this._numTriangles > 0) {
- let t = _this._triangleList;
- _this._numTriangles--;
- let prev = t._prev;
- let next = t._next;
- if(prev != null) {
- prev._next = next;
- }
- if(next != null) {
- next._prev = prev;
- }
- if(t == _this._triangleList) {
- _this._triangleList = _this._triangleList._next;
- }
- if(t == _this._triangleListLast) {
- _this._triangleListLast = _this._triangleListLast._prev;
- }
- t._next = null;
- t._prev = null;
- t.removeReferences();
- t._next = _this._trianglePool;
- _this._trianglePool = t;
- }
- while(_this._numVertices > 0) {
- let v = _this._vertices[--_this._numVertices];
- v.removeReferences();
- v._next = _this._vertexPool;
- _this._vertexPool = v;
- }
- let tmp = this.polyhedron;
- let _this1 = this.polyhedron;
- let first = _this1._vertexPool;
- if(first != null) {
- _this1._vertexPool = first._next;
- first._next = null;
- } else {
- first = new oimo.collision.narrowphase.detector.gjkepa.EpaVertex();
- }
- let tmp1 = first.init(initialPolyhedron[0],initialPolyhedron1[0],initialPolyhedron2[0]);
- let _this2 = this.polyhedron;
- let first1 = _this2._vertexPool;
- if(first1 != null) {
- _this2._vertexPool = first1._next;
- first1._next = null;
- } else {
- first1 = new oimo.collision.narrowphase.detector.gjkepa.EpaVertex();
- }
- let tmp2 = first1.init(initialPolyhedron[1],initialPolyhedron1[1],initialPolyhedron2[1]);
- let _this3 = this.polyhedron;
- let first2 = _this3._vertexPool;
- if(first2 != null) {
- _this3._vertexPool = first2._next;
- first2._next = null;
- } else {
- first2 = new oimo.collision.narrowphase.detector.gjkepa.EpaVertex();
- }
- let tmp3 = first2.init(initialPolyhedron[2],initialPolyhedron1[2],initialPolyhedron2[2]);
- let _this4 = this.polyhedron;
- let first3 = _this4._vertexPool;
- if(first3 != null) {
- _this4._vertexPool = first3._next;
- first3._next = null;
- } else {
- first3 = new oimo.collision.narrowphase.detector.gjkepa.EpaVertex();
- }
- if(!tmp._init(tmp1,tmp2,tmp3,first3.init(initialPolyhedron[3],initialPolyhedron1[3],initialPolyhedron2[3]))) {
- return oimo.collision.narrowphase.detector.gjkepa.GjkEpaResultState.EPA_FAILED_TO_INIT;
- }
- this.simplexSize = 0;
- let supportingVertex = this.s[0];
- let witness1 = this.w1[0];
- let witness2 = this.w2[0];
- let count = 0;
- while(count < 40) {
- let f = this.polyhedron._triangleList;
- let mind = 1e65536;
- let minf = null;
- while(f != null) {
- if(f._distanceSq < mind) {
- mind = f._distanceSq;
- minf = f;
- }
- f = f._next;
- }
- let face = minf;
- let _this = this.dir;
- let v = face._normal;
- _this.x = v.x;
- _this.y = v.y;
- _this.z = v.z;
- let invLen = Math.sqrt(_this.x * _this.x + _this.y * _this.y + _this.z * _this.z);
- if(invLen > 0) {
- invLen = 1 / invLen;
- }
- _this.x *= invLen;
- _this.y *= invLen;
- _this.z *= invLen;
- this.computeWitnessPoint1(false);
- this.computeWitnessPoint2(false);
- let _this1 = this.s[this.simplexSize];
- let v1 = this.w1[this.simplexSize];
- _this1.x = v1.x;
- _this1.y = v1.y;
- _this1.z = v1.z;
- let v2 = this.w2[this.simplexSize];
- _this1.x -= v2.x;
- _this1.y -= v2.y;
- _this1.z -= v2.z;
- let v0 = face._vertices[0];
- let v11 = face._vertices[1];
- let v21 = face._vertices[2];
- let _this2 = v0.v;
- let v3 = this.dir;
- let v4 = this.dir;
- if(supportingVertex.x * v4.x + supportingVertex.y * v4.y + supportingVertex.z * v4.z - (_this2.x * v3.x + _this2.y * v3.y + _this2.z * v3.z) < 1e-6 || count == 39) {
- let _this = this.closest;
- let v = this.dir;
- _this.x = v.x;
- _this.y = v.y;
- _this.z = v.z;
- let _this1 = this.dir;
- let v1 = v0.v;
- let _this2 = this.dir;
- let s = (_this1.x * v1.x + _this1.y * v1.y + _this1.z * v1.z) / (_this2.x * _this2.x + _this2.y * _this2.y + _this2.z * _this2.z);
- _this.x *= s;
- _this.y *= s;
- _this.z *= s;
- let cX;
- let cY;
- let cZ;
- let v2 = this.closest;
- cX = v2.x;
- cY = v2.y;
- cZ = v2.z;
- let s0X;
- let s0Y;
- let s0Z;
- let w10X;
- let w10Y;
- let w10Z;
- let w20X;
- let w20Y;
- let w20Z;
- let s1X;
- let s1Y;
- let s1Z;
- let w11X;
- let w11Y;
- let w11Z;
- let w21X;
- let w21Y;
- let w21Z;
- let s2X;
- let s2Y;
- let s2Z;
- let w12X;
- let w12Y;
- let w12Z;
- let w22X;
- let w22Y;
- let w22Z;
- let v3 = v0.v;
- s0X = v3.x;
- s0Y = v3.y;
- s0Z = v3.z;
- let v4 = v0.w1;
- w10X = v4.x;
- w10Y = v4.y;
- w10Z = v4.z;
- let v5 = v0.w2;
- w20X = v5.x;
- w20Y = v5.y;
- w20Z = v5.z;
- let v6 = v11.v;
- s1X = v6.x;
- s1Y = v6.y;
- s1Z = v6.z;
- let v7 = v11.w1;
- w11X = v7.x;
- w11Y = v7.y;
- w11Z = v7.z;
- let v8 = v11.w2;
- w21X = v8.x;
- w21Y = v8.y;
- w21Z = v8.z;
- let v9 = v21.v;
- s2X = v9.x;
- s2Y = v9.y;
- s2Z = v9.z;
- let v10 = v21.w1;
- w12X = v10.x;
- w12Y = v10.y;
- w12Z = v10.z;
- let v12 = v21.w2;
- w22X = v12.x;
- w22Y = v12.y;
- w22Z = v12.z;
- let s01X;
- let s01Y;
- let s01Z;
- let s02X;
- let s02Y;
- let s02Z;
- let s0cX;
- let s0cY;
- let s0cZ;
- s01X = s1X - s0X;
- s01Y = s1Y - s0Y;
- s01Z = s1Z - s0Z;
- s02X = s2X - s0X;
- s02Y = s2Y - s0Y;
- s02Z = s2Z - s0Z;
- s0cX = cX - s0X;
- s0cY = cY - s0Y;
- s0cZ = cZ - s0Z;
- let d11 = s01X * s01X + s01Y * s01Y + s01Z * s01Z;
- let d12 = s01X * s02X + s01Y * s02Y + s01Z * s02Z;
- let d22 = s02X * s02X + s02Y * s02Y + s02Z * s02Z;
- let d1c = s01X * s0cX + s01Y * s0cY + s01Z * s0cZ;
- let d2c = s02X * s0cX + s02Y * s0cY + s02Z * s0cZ;
- let invDet = d11 * d22 - d12 * d12;
- if(invDet != 0) {
- invDet = 1 / invDet;
- }
- let s1 = (d1c * d22 - d2c * d12) * invDet;
- let t = (-d1c * d12 + d2c * d11) * invDet;
- let diffX;
- let diffY;
- let diffZ;
- let cp1X;
- let cp1Y;
- let cp1Z;
- let cp2X;
- let cp2Y;
- let cp2Z;
- diffX = w11X - w10X;
- diffY = w11Y - w10Y;
- diffZ = w11Z - w10Z;
- cp1X = w10X + diffX * s1;
- cp1Y = w10Y + diffY * s1;
- cp1Z = w10Z + diffZ * s1;
- diffX = w12X - w10X;
- diffY = w12Y - w10Y;
- diffZ = w12Z - w10Z;
- cp1X += diffX * t;
- cp1Y += diffY * t;
- cp1Z += diffZ * t;
- diffX = w21X - w20X;
- diffY = w21Y - w20Y;
- diffZ = w21Z - w20Z;
- cp2X = w20X + diffX * s1;
- cp2Y = w20Y + diffY * s1;
- cp2Z = w20Z + diffZ * s1;
- diffX = w22X - w20X;
- diffY = w22Y - w20Y;
- diffZ = w22Z - w20Z;
- cp2X += diffX * t;
- cp2Y += diffY * t;
- cp2Z += diffZ * t;
- let v13 = this.closestPoint1;
- v13.x = cp1X;
- v13.y = cp1Y;
- v13.z = cp1Z;
- let v14 = this.closestPoint2;
- v14.x = cp2X;
- v14.y = cp2Y;
- v14.z = cp2Z;
- let _this3 = this.closest;
- this.depth = Math.sqrt(_this3.x * _this3.x + _this3.y * _this3.y + _this3.z * _this3.z);
- return oimo.collision.narrowphase.detector.gjkepa.GjkEpaResultState.SUCCEEDED;
- }
- let _this3 = this.polyhedron;
- let first = _this3._vertexPool;
- if(first != null) {
- _this3._vertexPool = first._next;
- first._next = null;
- } else {
- first = new oimo.collision.narrowphase.detector.gjkepa.EpaVertex();
- }
- let epaVertex = first.init(supportingVertex,witness1,witness2);
- if(!this.polyhedron._addVertex(epaVertex,face)) {
- return oimo.collision.narrowphase.detector.gjkepa.GjkEpaResultState.EPA_FAILED_TO_ADD_VERTEX;
- }
- ++count;
- }
- return oimo.collision.narrowphase.detector.gjkepa.GjkEpaResultState.EPA_DID_NOT_CONVERGE;
- }
- computeClosestPoints(c1,c2,tf1,tf2,cache) {
- return this.computeClosestPointsImpl(c1,c2,tf1,tf2,cache,true);
- }
- computeDistance(c1,c2,tf1,tf2,cache) {
- return this.computeClosestPointsImpl(c1,c2,tf1,tf2,cache,false);
- }
- convexCast(c1,c2,tf1,tf2,tl1,tl2,hit) {
- return this.convexCastImpl(c1,c2,tf1,tf2,tl1,tl2,hit);
- }
- rayCast(c,tf,begin,end,hit) {
- let tf1 = this.tempTransform;
- tf1._positionX = begin.x;
- tf1._positionY = begin.y;
- tf1._positionZ = begin.z;
- let tl1 = this.tl1;
- let tl2 = this.tl2;
- tl1.x = end.x;
- tl1.y = end.y;
- tl1.z = end.z;
- tl1.x -= begin.x;
- tl1.y -= begin.y;
- tl1.z -= begin.z;
- tl2.zero();
- return this.convexCastImpl(null,c,tf1,tf,tl1,tl2,hit);
- }
- static getInstance() {
- return oimo.collision.narrowphase.detector.gjkepa.GjkEpa.instance;
- }
- }
- oimo.collision.narrowphase.detector.gjkepa.GjkEpaLog = class oimo_collision_narrowphase_detector_gjkepa_GjkEpaLog {
- }
- oimo.collision.narrowphase.detector.gjkepa.GjkEpaResultState = class oimo_collision_narrowphase_detector_gjkepa_GjkEpaResultState {
- }
- oimo.collision.narrowphase.detector.gjkepa.SimplexUtil = class oimo_collision_narrowphase_detector_gjkepa_SimplexUtil {
- static projectOrigin2(vec1,vec2,out) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec1.x;
- v1Y = vec1.y;
- v1Z = vec1.z;
- v2X = vec2.x;
- v2Y = vec2.y;
- v2Z = vec2.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- if(t < 0) {
- out.x = v1X;
- out.y = v1Y;
- out.z = v1Z;
- return 1;
- }
- if(t > 1) {
- out.x = v2X;
- out.y = v2Y;
- out.z = v2Z;
- return 2;
- }
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- out.x = pX;
- out.y = pY;
- out.z = pZ;
- return 3;
- }
- static projectOrigin3(vec1,vec2,vec3,out) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- let v3X;
- let v3Y;
- let v3Z;
- let v12X;
- let v12Y;
- let v12Z;
- let v23X;
- let v23Y;
- let v23Z;
- let v31X;
- let v31Y;
- let v31Z;
- v1X = vec1.x;
- v1Y = vec1.y;
- v1Z = vec1.z;
- v2X = vec2.x;
- v2Y = vec2.y;
- v2Z = vec2.z;
- v3X = vec3.x;
- v3Y = vec3.y;
- v3Z = vec3.z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- v23X = v3X - v2X;
- v23Y = v3Y - v2Y;
- v23Z = v3Z - v2Z;
- v31X = v1X - v3X;
- v31Y = v1Y - v3Y;
- v31Z = v1Z - v3Z;
- let nX;
- let nY;
- let nZ;
- nX = v12Y * v23Z - v12Z * v23Y;
- nY = v12Z * v23X - v12X * v23Z;
- nZ = v12X * v23Y - v12Y * v23X;
- let n12X;
- let n12Y;
- let n12Z;
- let n23X;
- let n23Y;
- let n23Z;
- let n31X;
- let n31Y;
- let n31Z;
- n12X = v12Y * nZ - v12Z * nY;
- n12Y = v12Z * nX - v12X * nZ;
- n12Z = v12X * nY - v12Y * nX;
- n23X = v23Y * nZ - v23Z * nY;
- n23Y = v23Z * nX - v23X * nZ;
- n23Z = v23X * nY - v23Y * nX;
- n31X = v31Y * nZ - v31Z * nY;
- n31Y = v31Z * nX - v31X * nZ;
- n31Z = v31X * nY - v31Y * nX;
- let mind = -1;
- let minvX;
- let minvY;
- let minvZ;
- let mini = 0;
- minvX = 0;
- minvY = 0;
- minvZ = 0;
- if(v1X * n12X + v1Y * n12Y + v1Z * n12Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec1.x;
- v1Y = vec1.y;
- v1Z = vec1.z;
- v2X = vec2.x;
- v2Y = vec2.y;
- v2Z = vec2.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- let b;
- if(t < 0) {
- out.x = v1X;
- out.y = v1Y;
- out.z = v1Z;
- b = 1;
- } else if(t > 1) {
- out.x = v2X;
- out.y = v2Y;
- out.z = v2Z;
- b = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- out.x = pX;
- out.y = pY;
- out.z = pZ;
- b = 3;
- }
- mini = b;
- mind = out.x * out.x + out.y * out.y + out.z * out.z;
- minvX = out.x;
- minvY = out.y;
- minvZ = out.z;
- }
- if(v2X * n23X + v2Y * n23Y + v2Z * n23Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec2.x;
- v1Y = vec2.y;
- v1Z = vec2.z;
- v2X = vec3.x;
- v2Y = vec3.y;
- v2Z = vec3.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- let b;
- if(t < 0) {
- out.x = v1X;
- out.y = v1Y;
- out.z = v1Z;
- b = 1;
- } else if(t > 1) {
- out.x = v2X;
- out.y = v2Y;
- out.z = v2Z;
- b = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- out.x = pX;
- out.y = pY;
- out.z = pZ;
- b = 3;
- }
- let d = out.x * out.x + out.y * out.y + out.z * out.z;
- if(mind < 0 || d < mind) {
- mini = b << 1;
- mind = d;
- minvX = out.x;
- minvY = out.y;
- minvZ = out.z;
- }
- }
- if(v3X * n31X + v3Y * n31Y + v3Z * n31Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec1.x;
- v1Y = vec1.y;
- v1Z = vec1.z;
- v2X = vec3.x;
- v2Y = vec3.y;
- v2Z = vec3.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- let b;
- if(t < 0) {
- out.x = v1X;
- out.y = v1Y;
- out.z = v1Z;
- b = 1;
- } else if(t > 1) {
- out.x = v2X;
- out.y = v2Y;
- out.z = v2Z;
- b = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- out.x = pX;
- out.y = pY;
- out.z = pZ;
- b = 3;
- }
- let d = out.x * out.x + out.y * out.y + out.z * out.z;
- if(mind < 0 || d < mind) {
- mini = b & 1 | (b & 2) << 1;
- mind = d;
- minvX = out.x;
- minvY = out.y;
- minvZ = out.z;
- }
- }
- if(mind > 0) {
- out.x = minvX;
- out.y = minvY;
- out.z = minvZ;
- return mini;
- }
- let l = nX * nX + nY * nY + nZ * nZ;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- nX *= l;
- nY *= l;
- nZ *= l;
- let l2 = nX * nX + nY * nY + nZ * nZ;
- l2 = (v1X * nX + v1Y * nY + v1Z * nZ) / l2;
- minvX = nX * l2;
- minvY = nY * l2;
- minvZ = nZ * l2;
- out.x = minvX;
- out.y = minvY;
- out.z = minvZ;
- return 7;
- }
- static projectOrigin4(vec1,vec2,vec3,vec4,out) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- let v3X;
- let v3Y;
- let v3Z;
- let v4X;
- let v4Y;
- let v4Z;
- let v12X;
- let v12Y;
- let v12Z;
- let v13X;
- let v13Y;
- let v13Z;
- let v14X;
- let v14Y;
- let v14Z;
- let v23X;
- let v23Y;
- let v23Z;
- let v24X;
- let v24Y;
- let v24Z;
- v1X = vec1.x;
- v1Y = vec1.y;
- v1Z = vec1.z;
- v2X = vec2.x;
- v2Y = vec2.y;
- v2Z = vec2.z;
- v3X = vec3.x;
- v3Y = vec3.y;
- v3Z = vec3.z;
- v4X = vec4.x;
- v4Y = vec4.y;
- v4Z = vec4.z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- v13X = v3X - v1X;
- v13Y = v3Y - v1Y;
- v13Z = v3Z - v1Z;
- v14X = v4X - v1X;
- v14Y = v4Y - v1Y;
- v14Z = v4Z - v1Z;
- v23X = v3X - v2X;
- v23Y = v3Y - v2Y;
- v23Z = v3Z - v2Z;
- v24X = v4X - v2X;
- v24Y = v4Y - v2Y;
- v24Z = v4Z - v2Z;
- let n123X;
- let n123Y;
- let n123Z;
- let n134X;
- let n134Y;
- let n134Z;
- let n142X;
- let n142Y;
- let n142Z;
- let n243X;
- let n243Y;
- let n243Z;
- n123X = v12Y * v13Z - v12Z * v13Y;
- n123Y = v12Z * v13X - v12X * v13Z;
- n123Z = v12X * v13Y - v12Y * v13X;
- n134X = v13Y * v14Z - v13Z * v14Y;
- n134Y = v13Z * v14X - v13X * v14Z;
- n134Z = v13X * v14Y - v13Y * v14X;
- n142X = v14Y * v12Z - v14Z * v12Y;
- n142Y = v14Z * v12X - v14X * v12Z;
- n142Z = v14X * v12Y - v14Y * v12X;
- n243X = v24Y * v23Z - v24Z * v23Y;
- n243Y = v24Z * v23X - v24X * v23Z;
- n243Z = v24X * v23Y - v24Y * v23X;
- let sign = v12X * n243X + v12Y * n243Y + v12Z * n243Z > 0 ? 1 : -1;
- let mind = -1;
- let minvX;
- let minvY;
- let minvZ;
- let mini = 0;
- minvX = 0;
- minvY = 0;
- minvZ = 0;
- if((v1X * n123X + v1Y * n123Y + v1Z * n123Z) * sign < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- let v3X;
- let v3Y;
- let v3Z;
- let v12X;
- let v12Y;
- let v12Z;
- let v23X;
- let v23Y;
- let v23Z;
- let v31X;
- let v31Y;
- let v31Z;
- v1X = vec1.x;
- v1Y = vec1.y;
- v1Z = vec1.z;
- v2X = vec2.x;
- v2Y = vec2.y;
- v2Z = vec2.z;
- v3X = vec3.x;
- v3Y = vec3.y;
- v3Z = vec3.z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- v23X = v3X - v2X;
- v23Y = v3Y - v2Y;
- v23Z = v3Z - v2Z;
- v31X = v1X - v3X;
- v31Y = v1Y - v3Y;
- v31Z = v1Z - v3Z;
- let nX;
- let nY;
- let nZ;
- nX = v12Y * v23Z - v12Z * v23Y;
- nY = v12Z * v23X - v12X * v23Z;
- nZ = v12X * v23Y - v12Y * v23X;
- let n12X;
- let n12Y;
- let n12Z;
- let n23X;
- let n23Y;
- let n23Z;
- let n31X;
- let n31Y;
- let n31Z;
- n12X = v12Y * nZ - v12Z * nY;
- n12Y = v12Z * nX - v12X * nZ;
- n12Z = v12X * nY - v12Y * nX;
- n23X = v23Y * nZ - v23Z * nY;
- n23Y = v23Z * nX - v23X * nZ;
- n23Z = v23X * nY - v23Y * nX;
- n31X = v31Y * nZ - v31Z * nY;
- n31Y = v31Z * nX - v31X * nZ;
- n31Z = v31X * nY - v31Y * nX;
- let mind1 = -1;
- let minvX1;
- let minvY1;
- let minvZ1;
- let mini1 = 0;
- minvX1 = 0;
- minvY1 = 0;
- minvZ1 = 0;
- if(v1X * n12X + v1Y * n12Y + v1Z * n12Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec1.x;
- v1Y = vec1.y;
- v1Z = vec1.z;
- v2X = vec2.x;
- v2Y = vec2.y;
- v2Z = vec2.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- let b;
- if(t < 0) {
- out.x = v1X;
- out.y = v1Y;
- out.z = v1Z;
- b = 1;
- } else if(t > 1) {
- out.x = v2X;
- out.y = v2Y;
- out.z = v2Z;
- b = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- out.x = pX;
- out.y = pY;
- out.z = pZ;
- b = 3;
- }
- mini1 = b;
- mind1 = out.x * out.x + out.y * out.y + out.z * out.z;
- minvX1 = out.x;
- minvY1 = out.y;
- minvZ1 = out.z;
- }
- if(v2X * n23X + v2Y * n23Y + v2Z * n23Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec2.x;
- v1Y = vec2.y;
- v1Z = vec2.z;
- v2X = vec3.x;
- v2Y = vec3.y;
- v2Z = vec3.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- let b;
- if(t < 0) {
- out.x = v1X;
- out.y = v1Y;
- out.z = v1Z;
- b = 1;
- } else if(t > 1) {
- out.x = v2X;
- out.y = v2Y;
- out.z = v2Z;
- b = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- out.x = pX;
- out.y = pY;
- out.z = pZ;
- b = 3;
- }
- let d = out.x * out.x + out.y * out.y + out.z * out.z;
- if(mind1 < 0 || d < mind1) {
- mini1 = b << 1;
- mind1 = d;
- minvX1 = out.x;
- minvY1 = out.y;
- minvZ1 = out.z;
- }
- }
- if(v3X * n31X + v3Y * n31Y + v3Z * n31Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec1.x;
- v1Y = vec1.y;
- v1Z = vec1.z;
- v2X = vec3.x;
- v2Y = vec3.y;
- v2Z = vec3.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- let b;
- if(t < 0) {
- out.x = v1X;
- out.y = v1Y;
- out.z = v1Z;
- b = 1;
- } else if(t > 1) {
- out.x = v2X;
- out.y = v2Y;
- out.z = v2Z;
- b = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- out.x = pX;
- out.y = pY;
- out.z = pZ;
- b = 3;
- }
- let d = out.x * out.x + out.y * out.y + out.z * out.z;
- if(mind1 < 0 || d < mind1) {
- mini1 = b & 1 | (b & 2) << 1;
- mind1 = d;
- minvX1 = out.x;
- minvY1 = out.y;
- minvZ1 = out.z;
- }
- }
- let b;
- if(mind1 > 0) {
- out.x = minvX1;
- out.y = minvY1;
- out.z = minvZ1;
- b = mini1;
- } else {
- let l = nX * nX + nY * nY + nZ * nZ;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- nX *= l;
- nY *= l;
- nZ *= l;
- let l2 = nX * nX + nY * nY + nZ * nZ;
- l2 = (v1X * nX + v1Y * nY + v1Z * nZ) / l2;
- minvX1 = nX * l2;
- minvY1 = nY * l2;
- minvZ1 = nZ * l2;
- out.x = minvX1;
- out.y = minvY1;
- out.z = minvZ1;
- b = 7;
- }
- mini = b;
- mind = out.x * out.x + out.y * out.y + out.z * out.z;
- minvX = out.x;
- minvY = out.y;
- minvZ = out.z;
- }
- if((v1X * n134X + v1Y * n134Y + v1Z * n134Z) * sign < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- let v3X;
- let v3Y;
- let v3Z;
- let v12X;
- let v12Y;
- let v12Z;
- let v23X;
- let v23Y;
- let v23Z;
- let v31X;
- let v31Y;
- let v31Z;
- v1X = vec1.x;
- v1Y = vec1.y;
- v1Z = vec1.z;
- v2X = vec3.x;
- v2Y = vec3.y;
- v2Z = vec3.z;
- v3X = vec4.x;
- v3Y = vec4.y;
- v3Z = vec4.z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- v23X = v3X - v2X;
- v23Y = v3Y - v2Y;
- v23Z = v3Z - v2Z;
- v31X = v1X - v3X;
- v31Y = v1Y - v3Y;
- v31Z = v1Z - v3Z;
- let nX;
- let nY;
- let nZ;
- nX = v12Y * v23Z - v12Z * v23Y;
- nY = v12Z * v23X - v12X * v23Z;
- nZ = v12X * v23Y - v12Y * v23X;
- let n12X;
- let n12Y;
- let n12Z;
- let n23X;
- let n23Y;
- let n23Z;
- let n31X;
- let n31Y;
- let n31Z;
- n12X = v12Y * nZ - v12Z * nY;
- n12Y = v12Z * nX - v12X * nZ;
- n12Z = v12X * nY - v12Y * nX;
- n23X = v23Y * nZ - v23Z * nY;
- n23Y = v23Z * nX - v23X * nZ;
- n23Z = v23X * nY - v23Y * nX;
- n31X = v31Y * nZ - v31Z * nY;
- n31Y = v31Z * nX - v31X * nZ;
- n31Z = v31X * nY - v31Y * nX;
- let mind1 = -1;
- let minvX1;
- let minvY1;
- let minvZ1;
- let mini1 = 0;
- minvX1 = 0;
- minvY1 = 0;
- minvZ1 = 0;
- if(v1X * n12X + v1Y * n12Y + v1Z * n12Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec1.x;
- v1Y = vec1.y;
- v1Z = vec1.z;
- v2X = vec3.x;
- v2Y = vec3.y;
- v2Z = vec3.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- let b;
- if(t < 0) {
- out.x = v1X;
- out.y = v1Y;
- out.z = v1Z;
- b = 1;
- } else if(t > 1) {
- out.x = v2X;
- out.y = v2Y;
- out.z = v2Z;
- b = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- out.x = pX;
- out.y = pY;
- out.z = pZ;
- b = 3;
- }
- mini1 = b;
- mind1 = out.x * out.x + out.y * out.y + out.z * out.z;
- minvX1 = out.x;
- minvY1 = out.y;
- minvZ1 = out.z;
- }
- if(v2X * n23X + v2Y * n23Y + v2Z * n23Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec3.x;
- v1Y = vec3.y;
- v1Z = vec3.z;
- v2X = vec4.x;
- v2Y = vec4.y;
- v2Z = vec4.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- let b;
- if(t < 0) {
- out.x = v1X;
- out.y = v1Y;
- out.z = v1Z;
- b = 1;
- } else if(t > 1) {
- out.x = v2X;
- out.y = v2Y;
- out.z = v2Z;
- b = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- out.x = pX;
- out.y = pY;
- out.z = pZ;
- b = 3;
- }
- let d = out.x * out.x + out.y * out.y + out.z * out.z;
- if(mind1 < 0 || d < mind1) {
- mini1 = b << 1;
- mind1 = d;
- minvX1 = out.x;
- minvY1 = out.y;
- minvZ1 = out.z;
- }
- }
- if(v3X * n31X + v3Y * n31Y + v3Z * n31Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec1.x;
- v1Y = vec1.y;
- v1Z = vec1.z;
- v2X = vec4.x;
- v2Y = vec4.y;
- v2Z = vec4.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- let b;
- if(t < 0) {
- out.x = v1X;
- out.y = v1Y;
- out.z = v1Z;
- b = 1;
- } else if(t > 1) {
- out.x = v2X;
- out.y = v2Y;
- out.z = v2Z;
- b = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- out.x = pX;
- out.y = pY;
- out.z = pZ;
- b = 3;
- }
- let d = out.x * out.x + out.y * out.y + out.z * out.z;
- if(mind1 < 0 || d < mind1) {
- mini1 = b & 1 | (b & 2) << 1;
- mind1 = d;
- minvX1 = out.x;
- minvY1 = out.y;
- minvZ1 = out.z;
- }
- }
- let b;
- if(mind1 > 0) {
- out.x = minvX1;
- out.y = minvY1;
- out.z = minvZ1;
- b = mini1;
- } else {
- let l = nX * nX + nY * nY + nZ * nZ;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- nX *= l;
- nY *= l;
- nZ *= l;
- let l2 = nX * nX + nY * nY + nZ * nZ;
- l2 = (v1X * nX + v1Y * nY + v1Z * nZ) / l2;
- minvX1 = nX * l2;
- minvY1 = nY * l2;
- minvZ1 = nZ * l2;
- out.x = minvX1;
- out.y = minvY1;
- out.z = minvZ1;
- b = 7;
- }
- let d = out.x * out.x + out.y * out.y + out.z * out.z;
- if(mind < 0 || d < mind) {
- mini = b & 1 | (b & 6) << 1;
- mind = d;
- minvX = out.x;
- minvY = out.y;
- minvZ = out.z;
- }
- }
- if((v1X * n142X + v1Y * n142Y + v1Z * n142Z) * sign < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- let v3X;
- let v3Y;
- let v3Z;
- let v12X;
- let v12Y;
- let v12Z;
- let v23X;
- let v23Y;
- let v23Z;
- let v31X;
- let v31Y;
- let v31Z;
- v1X = vec1.x;
- v1Y = vec1.y;
- v1Z = vec1.z;
- v2X = vec2.x;
- v2Y = vec2.y;
- v2Z = vec2.z;
- v3X = vec4.x;
- v3Y = vec4.y;
- v3Z = vec4.z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- v23X = v3X - v2X;
- v23Y = v3Y - v2Y;
- v23Z = v3Z - v2Z;
- v31X = v1X - v3X;
- v31Y = v1Y - v3Y;
- v31Z = v1Z - v3Z;
- let nX;
- let nY;
- let nZ;
- nX = v12Y * v23Z - v12Z * v23Y;
- nY = v12Z * v23X - v12X * v23Z;
- nZ = v12X * v23Y - v12Y * v23X;
- let n12X;
- let n12Y;
- let n12Z;
- let n23X;
- let n23Y;
- let n23Z;
- let n31X;
- let n31Y;
- let n31Z;
- n12X = v12Y * nZ - v12Z * nY;
- n12Y = v12Z * nX - v12X * nZ;
- n12Z = v12X * nY - v12Y * nX;
- n23X = v23Y * nZ - v23Z * nY;
- n23Y = v23Z * nX - v23X * nZ;
- n23Z = v23X * nY - v23Y * nX;
- n31X = v31Y * nZ - v31Z * nY;
- n31Y = v31Z * nX - v31X * nZ;
- n31Z = v31X * nY - v31Y * nX;
- let mind1 = -1;
- let minvX1;
- let minvY1;
- let minvZ1;
- let mini1 = 0;
- minvX1 = 0;
- minvY1 = 0;
- minvZ1 = 0;
- if(v1X * n12X + v1Y * n12Y + v1Z * n12Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec1.x;
- v1Y = vec1.y;
- v1Z = vec1.z;
- v2X = vec2.x;
- v2Y = vec2.y;
- v2Z = vec2.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- let b;
- if(t < 0) {
- out.x = v1X;
- out.y = v1Y;
- out.z = v1Z;
- b = 1;
- } else if(t > 1) {
- out.x = v2X;
- out.y = v2Y;
- out.z = v2Z;
- b = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- out.x = pX;
- out.y = pY;
- out.z = pZ;
- b = 3;
- }
- mini1 = b;
- mind1 = out.x * out.x + out.y * out.y + out.z * out.z;
- minvX1 = out.x;
- minvY1 = out.y;
- minvZ1 = out.z;
- }
- if(v2X * n23X + v2Y * n23Y + v2Z * n23Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec2.x;
- v1Y = vec2.y;
- v1Z = vec2.z;
- v2X = vec4.x;
- v2Y = vec4.y;
- v2Z = vec4.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- let b;
- if(t < 0) {
- out.x = v1X;
- out.y = v1Y;
- out.z = v1Z;
- b = 1;
- } else if(t > 1) {
- out.x = v2X;
- out.y = v2Y;
- out.z = v2Z;
- b = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- out.x = pX;
- out.y = pY;
- out.z = pZ;
- b = 3;
- }
- let d = out.x * out.x + out.y * out.y + out.z * out.z;
- if(mind1 < 0 || d < mind1) {
- mini1 = b << 1;
- mind1 = d;
- minvX1 = out.x;
- minvY1 = out.y;
- minvZ1 = out.z;
- }
- }
- if(v3X * n31X + v3Y * n31Y + v3Z * n31Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec1.x;
- v1Y = vec1.y;
- v1Z = vec1.z;
- v2X = vec4.x;
- v2Y = vec4.y;
- v2Z = vec4.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- let b;
- if(t < 0) {
- out.x = v1X;
- out.y = v1Y;
- out.z = v1Z;
- b = 1;
- } else if(t > 1) {
- out.x = v2X;
- out.y = v2Y;
- out.z = v2Z;
- b = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- out.x = pX;
- out.y = pY;
- out.z = pZ;
- b = 3;
- }
- let d = out.x * out.x + out.y * out.y + out.z * out.z;
- if(mind1 < 0 || d < mind1) {
- mini1 = b & 1 | (b & 2) << 1;
- mind1 = d;
- minvX1 = out.x;
- minvY1 = out.y;
- minvZ1 = out.z;
- }
- }
- let b;
- if(mind1 > 0) {
- out.x = minvX1;
- out.y = minvY1;
- out.z = minvZ1;
- b = mini1;
- } else {
- let l = nX * nX + nY * nY + nZ * nZ;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- nX *= l;
- nY *= l;
- nZ *= l;
- let l2 = nX * nX + nY * nY + nZ * nZ;
- l2 = (v1X * nX + v1Y * nY + v1Z * nZ) / l2;
- minvX1 = nX * l2;
- minvY1 = nY * l2;
- minvZ1 = nZ * l2;
- out.x = minvX1;
- out.y = minvY1;
- out.z = minvZ1;
- b = 7;
- }
- let d = out.x * out.x + out.y * out.y + out.z * out.z;
- if(mind < 0 || d < mind) {
- mini = b & 3 | (b & 4) << 1;
- mind = d;
- minvX = out.x;
- minvY = out.y;
- minvZ = out.z;
- }
- }
- if((v2X * n243X + v2Y * n243Y + v2Z * n243Z) * sign < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- let v3X;
- let v3Y;
- let v3Z;
- let v12X;
- let v12Y;
- let v12Z;
- let v23X;
- let v23Y;
- let v23Z;
- let v31X;
- let v31Y;
- let v31Z;
- v1X = vec2.x;
- v1Y = vec2.y;
- v1Z = vec2.z;
- v2X = vec3.x;
- v2Y = vec3.y;
- v2Z = vec3.z;
- v3X = vec4.x;
- v3Y = vec4.y;
- v3Z = vec4.z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- v23X = v3X - v2X;
- v23Y = v3Y - v2Y;
- v23Z = v3Z - v2Z;
- v31X = v1X - v3X;
- v31Y = v1Y - v3Y;
- v31Z = v1Z - v3Z;
- let nX;
- let nY;
- let nZ;
- nX = v12Y * v23Z - v12Z * v23Y;
- nY = v12Z * v23X - v12X * v23Z;
- nZ = v12X * v23Y - v12Y * v23X;
- let n12X;
- let n12Y;
- let n12Z;
- let n23X;
- let n23Y;
- let n23Z;
- let n31X;
- let n31Y;
- let n31Z;
- n12X = v12Y * nZ - v12Z * nY;
- n12Y = v12Z * nX - v12X * nZ;
- n12Z = v12X * nY - v12Y * nX;
- n23X = v23Y * nZ - v23Z * nY;
- n23Y = v23Z * nX - v23X * nZ;
- n23Z = v23X * nY - v23Y * nX;
- n31X = v31Y * nZ - v31Z * nY;
- n31Y = v31Z * nX - v31X * nZ;
- n31Z = v31X * nY - v31Y * nX;
- let mind1 = -1;
- let minvX1;
- let minvY1;
- let minvZ1;
- let mini1 = 0;
- minvX1 = 0;
- minvY1 = 0;
- minvZ1 = 0;
- if(v1X * n12X + v1Y * n12Y + v1Z * n12Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec2.x;
- v1Y = vec2.y;
- v1Z = vec2.z;
- v2X = vec3.x;
- v2Y = vec3.y;
- v2Z = vec3.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- let b;
- if(t < 0) {
- out.x = v1X;
- out.y = v1Y;
- out.z = v1Z;
- b = 1;
- } else if(t > 1) {
- out.x = v2X;
- out.y = v2Y;
- out.z = v2Z;
- b = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- out.x = pX;
- out.y = pY;
- out.z = pZ;
- b = 3;
- }
- mini1 = b;
- mind1 = out.x * out.x + out.y * out.y + out.z * out.z;
- minvX1 = out.x;
- minvY1 = out.y;
- minvZ1 = out.z;
- }
- if(v2X * n23X + v2Y * n23Y + v2Z * n23Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec3.x;
- v1Y = vec3.y;
- v1Z = vec3.z;
- v2X = vec4.x;
- v2Y = vec4.y;
- v2Z = vec4.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- let b;
- if(t < 0) {
- out.x = v1X;
- out.y = v1Y;
- out.z = v1Z;
- b = 1;
- } else if(t > 1) {
- out.x = v2X;
- out.y = v2Y;
- out.z = v2Z;
- b = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- out.x = pX;
- out.y = pY;
- out.z = pZ;
- b = 3;
- }
- let d = out.x * out.x + out.y * out.y + out.z * out.z;
- if(mind1 < 0 || d < mind1) {
- mini1 = b << 1;
- mind1 = d;
- minvX1 = out.x;
- minvY1 = out.y;
- minvZ1 = out.z;
- }
- }
- if(v3X * n31X + v3Y * n31Y + v3Z * n31Z < 0) {
- let v1X;
- let v1Y;
- let v1Z;
- let v2X;
- let v2Y;
- let v2Z;
- v1X = vec2.x;
- v1Y = vec2.y;
- v1Z = vec2.z;
- v2X = vec4.x;
- v2Y = vec4.y;
- v2Z = vec4.z;
- let v12X;
- let v12Y;
- let v12Z;
- v12X = v2X - v1X;
- v12Y = v2Y - v1Y;
- v12Z = v2Z - v1Z;
- let t = v12X * v1X + v12Y * v1Y + v12Z * v1Z;
- t = -t / (v12X * v12X + v12Y * v12Y + v12Z * v12Z);
- let b;
- if(t < 0) {
- out.x = v1X;
- out.y = v1Y;
- out.z = v1Z;
- b = 1;
- } else if(t > 1) {
- out.x = v2X;
- out.y = v2Y;
- out.z = v2Z;
- b = 2;
- } else {
- let pX;
- let pY;
- let pZ;
- pX = v1X + v12X * t;
- pY = v1Y + v12Y * t;
- pZ = v1Z + v12Z * t;
- out.x = pX;
- out.y = pY;
- out.z = pZ;
- b = 3;
- }
- let d = out.x * out.x + out.y * out.y + out.z * out.z;
- if(mind1 < 0 || d < mind1) {
- mini1 = b & 1 | (b & 2) << 1;
- mind1 = d;
- minvX1 = out.x;
- minvY1 = out.y;
- minvZ1 = out.z;
- }
- }
- let b;
- if(mind1 > 0) {
- out.x = minvX1;
- out.y = minvY1;
- out.z = minvZ1;
- b = mini1;
- } else {
- let l = nX * nX + nY * nY + nZ * nZ;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- nX *= l;
- nY *= l;
- nZ *= l;
- let l2 = nX * nX + nY * nY + nZ * nZ;
- l2 = (v1X * nX + v1Y * nY + v1Z * nZ) / l2;
- minvX1 = nX * l2;
- minvY1 = nY * l2;
- minvZ1 = nZ * l2;
- out.x = minvX1;
- out.y = minvY1;
- out.z = minvZ1;
- b = 7;
- }
- let d = out.x * out.x + out.y * out.y + out.z * out.z;
- if(mind < 0 || d < mind) {
- mini = b << 1;
- mind = d;
- minvX = out.x;
- minvY = out.y;
- minvZ = out.z;
- }
- }
- if(mind > 0) {
- out.x = minvX;
- out.y = minvY;
- out.z = minvZ;
- return mini;
- }
- out.zero();
- return 15;
- }
- }
- oimo.common.Mat3 = class oimo_common_Mat3 {
- constructor(e00,e01,e02,e10,e11,e12,e20,e21,e22) {
- if(e22 == null) {
- e22 = 1;
- }
- if(e21 == null) {
- e21 = 0;
- }
- if(e20 == null) {
- e20 = 0;
- }
- if(e12 == null) {
- e12 = 0;
- }
- if(e11 == null) {
- e11 = 1;
- }
- if(e10 == null) {
- e10 = 0;
- }
- if(e02 == null) {
- e02 = 0;
- }
- if(e01 == null) {
- e01 = 0;
- }
- if(e00 == null) {
- e00 = 1;
- }
- this.e00 = e00;
- this.e01 = e01;
- this.e02 = e02;
- this.e10 = e10;
- this.e11 = e11;
- this.e12 = e12;
- this.e20 = e20;
- this.e21 = e21;
- this.e22 = e22;
- oimo.common.Mat3.numCreations++;
- }
- init(e00,e01,e02,e10,e11,e12,e20,e21,e22) {
- this.e00 = e00;
- this.e01 = e01;
- this.e02 = e02;
- this.e10 = e10;
- this.e11 = e11;
- this.e12 = e12;
- this.e20 = e20;
- this.e21 = e21;
- this.e22 = e22;
- return this;
- }
- identity() {
- this.e00 = 1;
- this.e01 = 0;
- this.e02 = 0;
- this.e10 = 0;
- this.e11 = 1;
- this.e12 = 0;
- this.e20 = 0;
- this.e21 = 0;
- this.e22 = 1;
- return this;
- }
- add(m) {
- return new oimo.common.Mat3(this.e00 + m.e00,this.e01 + m.e01,this.e02 + m.e02,this.e10 + m.e10,this.e11 + m.e11,this.e12 + m.e12,this.e20 + m.e20,this.e21 + m.e21,this.e22 + m.e22);
- }
- sub(m) {
- return new oimo.common.Mat3(this.e00 - m.e00,this.e01 - m.e01,this.e02 - m.e02,this.e10 - m.e10,this.e11 - m.e11,this.e12 - m.e12,this.e20 - m.e20,this.e21 - m.e21,this.e22 - m.e22);
- }
- scale(s) {
- return new oimo.common.Mat3(this.e00 * s,this.e01 * s,this.e02 * s,this.e10 * s,this.e11 * s,this.e12 * s,this.e20 * s,this.e21 * s,this.e22 * s);
- }
- mul(m) {
- return new oimo.common.Mat3(this.e00 * m.e00 + this.e01 * m.e10 + this.e02 * m.e20,this.e00 * m.e01 + this.e01 * m.e11 + this.e02 * m.e21,this.e00 * m.e02 + this.e01 * m.e12 + this.e02 * m.e22,this.e10 * m.e00 + this.e11 * m.e10 + this.e12 * m.e20,this.e10 * m.e01 + this.e11 * m.e11 + this.e12 * m.e21,this.e10 * m.e02 + this.e11 * m.e12 + this.e12 * m.e22,this.e20 * m.e00 + this.e21 * m.e10 + this.e22 * m.e20,this.e20 * m.e01 + this.e21 * m.e11 + this.e22 * m.e21,this.e20 * m.e02 + this.e21 * m.e12 + this.e22 * m.e22);
- }
- addEq(m) {
- this.e00 += m.e00;
- this.e01 += m.e01;
- this.e02 += m.e02;
- this.e10 += m.e10;
- this.e11 += m.e11;
- this.e12 += m.e12;
- this.e20 += m.e20;
- this.e21 += m.e21;
- this.e22 += m.e22;
- return this;
- }
- subEq(m) {
- this.e00 -= m.e00;
- this.e01 -= m.e01;
- this.e02 -= m.e02;
- this.e10 -= m.e10;
- this.e11 -= m.e11;
- this.e12 -= m.e12;
- this.e20 -= m.e20;
- this.e21 -= m.e21;
- this.e22 -= m.e22;
- return this;
- }
- scaleEq(s) {
- this.e00 *= s;
- this.e01 *= s;
- this.e02 *= s;
- this.e10 *= s;
- this.e11 *= s;
- this.e12 *= s;
- this.e20 *= s;
- this.e21 *= s;
- this.e22 *= s;
- return this;
- }
- mulEq(m) {
- let e01 = this.e00 * m.e01 + this.e01 * m.e11 + this.e02 * m.e21;
- let e02 = this.e00 * m.e02 + this.e01 * m.e12 + this.e02 * m.e22;
- let e10 = this.e10 * m.e00 + this.e11 * m.e10 + this.e12 * m.e20;
- let e11 = this.e10 * m.e01 + this.e11 * m.e11 + this.e12 * m.e21;
- let e12 = this.e10 * m.e02 + this.e11 * m.e12 + this.e12 * m.e22;
- let e20 = this.e20 * m.e00 + this.e21 * m.e10 + this.e22 * m.e20;
- let e21 = this.e20 * m.e01 + this.e21 * m.e11 + this.e22 * m.e21;
- let e22 = this.e20 * m.e02 + this.e21 * m.e12 + this.e22 * m.e22;
- this.e00 = this.e00 * m.e00 + this.e01 * m.e10 + this.e02 * m.e20;
- this.e01 = e01;
- this.e02 = e02;
- this.e10 = e10;
- this.e11 = e11;
- this.e12 = e12;
- this.e20 = e20;
- this.e21 = e21;
- this.e22 = e22;
- return this;
- }
- prependScale(sx,sy,sz) {
- return new oimo.common.Mat3(this.e00 * sx,this.e01 * sx,this.e02 * sx,this.e10 * sy,this.e11 * sy,this.e12 * sy,this.e20 * sz,this.e21 * sz,this.e22 * sz);
- }
- appendScale(sx,sy,sz) {
- return new oimo.common.Mat3(this.e00 * sx,this.e01 * sy,this.e02 * sz,this.e10 * sx,this.e11 * sy,this.e12 * sz,this.e20 * sx,this.e21 * sy,this.e22 * sz);
- }
- prependRotation(rad,axisX,axisY,axisZ) {
- let s = Math.sin(rad);
- let c = Math.cos(rad);
- let c1 = 1 - c;
- let r00 = axisX * axisX * c1 + c;
- let r01 = axisX * axisY * c1 - axisZ * s;
- let r02 = axisX * axisZ * c1 + axisY * s;
- let r10 = axisY * axisX * c1 + axisZ * s;
- let r11 = axisY * axisY * c1 + c;
- let r12 = axisY * axisZ * c1 - axisX * s;
- let r20 = axisZ * axisX * c1 - axisY * s;
- let r21 = axisZ * axisY * c1 + axisX * s;
- let r22 = axisZ * axisZ * c1 + c;
- return new oimo.common.Mat3(r00 * this.e00 + r01 * this.e10 + r02 * this.e20,r00 * this.e01 + r01 * this.e11 + r02 * this.e21,r00 * this.e02 + r01 * this.e12 + r02 * this.e22,r10 * this.e00 + r11 * this.e10 + r12 * this.e20,r10 * this.e01 + r11 * this.e11 + r12 * this.e21,r10 * this.e02 + r11 * this.e12 + r12 * this.e22,r20 * this.e00 + r21 * this.e10 + r22 * this.e20,r20 * this.e01 + r21 * this.e11 + r22 * this.e21,r20 * this.e02 + r21 * this.e12 + r22 * this.e22);
- }
- appendRotation(rad,axisX,axisY,axisZ) {
- let s = Math.sin(rad);
- let c = Math.cos(rad);
- let c1 = 1 - c;
- let r00 = axisX * axisX * c1 + c;
- let r01 = axisX * axisY * c1 - axisZ * s;
- let r02 = axisX * axisZ * c1 + axisY * s;
- let r10 = axisY * axisX * c1 + axisZ * s;
- let r11 = axisY * axisY * c1 + c;
- let r12 = axisY * axisZ * c1 - axisX * s;
- let r20 = axisZ * axisX * c1 - axisY * s;
- let r21 = axisZ * axisY * c1 + axisX * s;
- let r22 = axisZ * axisZ * c1 + c;
- return new oimo.common.Mat3(this.e00 * r00 + this.e01 * r10 + this.e02 * r20,this.e00 * r01 + this.e01 * r11 + this.e02 * r21,this.e00 * r02 + this.e01 * r12 + this.e02 * r22,this.e10 * r00 + this.e11 * r10 + this.e12 * r20,this.e10 * r01 + this.e11 * r11 + this.e12 * r21,this.e10 * r02 + this.e11 * r12 + this.e12 * r22,this.e20 * r00 + this.e21 * r10 + this.e22 * r20,this.e20 * r01 + this.e21 * r11 + this.e22 * r21,this.e20 * r02 + this.e21 * r12 + this.e22 * r22);
- }
- prependScaleEq(sx,sy,sz) {
- this.e00 *= sx;
- this.e01 *= sx;
- this.e02 *= sx;
- this.e10 *= sy;
- this.e11 *= sy;
- this.e12 *= sy;
- this.e20 *= sz;
- this.e21 *= sz;
- this.e22 *= sz;
- return this;
- }
- appendScaleEq(sx,sy,sz) {
- this.e00 *= sx;
- this.e01 *= sy;
- this.e02 *= sz;
- this.e10 *= sx;
- this.e11 *= sy;
- this.e12 *= sz;
- this.e20 *= sx;
- this.e21 *= sy;
- this.e22 *= sz;
- return this;
- }
- prependRotationEq(rad,axisX,axisY,axisZ) {
- let s = Math.sin(rad);
- let c = Math.cos(rad);
- let c1 = 1 - c;
- let r00 = axisX * axisX * c1 + c;
- let r01 = axisX * axisY * c1 - axisZ * s;
- let r02 = axisX * axisZ * c1 + axisY * s;
- let r10 = axisY * axisX * c1 + axisZ * s;
- let r11 = axisY * axisY * c1 + c;
- let r12 = axisY * axisZ * c1 - axisX * s;
- let r20 = axisZ * axisX * c1 - axisY * s;
- let r21 = axisZ * axisY * c1 + axisX * s;
- let r22 = axisZ * axisZ * c1 + c;
- let e10 = r10 * this.e00 + r11 * this.e10 + r12 * this.e20;
- let e11 = r10 * this.e01 + r11 * this.e11 + r12 * this.e21;
- let e12 = r10 * this.e02 + r11 * this.e12 + r12 * this.e22;
- let e20 = r20 * this.e00 + r21 * this.e10 + r22 * this.e20;
- let e21 = r20 * this.e01 + r21 * this.e11 + r22 * this.e21;
- let e22 = r20 * this.e02 + r21 * this.e12 + r22 * this.e22;
- this.e00 = r00 * this.e00 + r01 * this.e10 + r02 * this.e20;
- this.e01 = r00 * this.e01 + r01 * this.e11 + r02 * this.e21;
- this.e02 = r00 * this.e02 + r01 * this.e12 + r02 * this.e22;
- this.e10 = e10;
- this.e11 = e11;
- this.e12 = e12;
- this.e20 = e20;
- this.e21 = e21;
- this.e22 = e22;
- return this;
- }
- appendRotationEq(rad,axisX,axisY,axisZ) {
- let s = Math.sin(rad);
- let c = Math.cos(rad);
- let c1 = 1 - c;
- let r00 = axisX * axisX * c1 + c;
- let r01 = axisX * axisY * c1 - axisZ * s;
- let r02 = axisX * axisZ * c1 + axisY * s;
- let r10 = axisY * axisX * c1 + axisZ * s;
- let r11 = axisY * axisY * c1 + c;
- let r12 = axisY * axisZ * c1 - axisX * s;
- let r20 = axisZ * axisX * c1 - axisY * s;
- let r21 = axisZ * axisY * c1 + axisX * s;
- let r22 = axisZ * axisZ * c1 + c;
- let e01 = this.e00 * r01 + this.e01 * r11 + this.e02 * r21;
- let e02 = this.e00 * r02 + this.e01 * r12 + this.e02 * r22;
- let e11 = this.e10 * r01 + this.e11 * r11 + this.e12 * r21;
- let e12 = this.e10 * r02 + this.e11 * r12 + this.e12 * r22;
- let e21 = this.e20 * r01 + this.e21 * r11 + this.e22 * r21;
- let e22 = this.e20 * r02 + this.e21 * r12 + this.e22 * r22;
- this.e00 = this.e00 * r00 + this.e01 * r10 + this.e02 * r20;
- this.e01 = e01;
- this.e02 = e02;
- this.e10 = this.e10 * r00 + this.e11 * r10 + this.e12 * r20;
- this.e11 = e11;
- this.e12 = e12;
- this.e20 = this.e20 * r00 + this.e21 * r10 + this.e22 * r20;
- this.e21 = e21;
- this.e22 = e22;
- return this;
- }
- transpose() {
- return new oimo.common.Mat3(this.e00,this.e10,this.e20,this.e01,this.e11,this.e21,this.e02,this.e12,this.e22);
- }
- transposeEq() {
- let e10 = this.e01;
- let e20 = this.e02;
- let e21 = this.e12;
- this.e01 = this.e10;
- this.e02 = this.e20;
- this.e10 = e10;
- this.e12 = this.e21;
- this.e20 = e20;
- this.e21 = e21;
- return this;
- }
- determinant() {
- return this.e00 * (this.e11 * this.e22 - this.e12 * this.e21) - this.e01 * (this.e10 * this.e22 - this.e12 * this.e20) + this.e02 * (this.e10 * this.e21 - this.e11 * this.e20);
- }
- trace() {
- return this.e00 + this.e11 + this.e22;
- }
- inverse() {
- let d00 = this.e11 * this.e22 - this.e12 * this.e21;
- let d01 = this.e10 * this.e22 - this.e12 * this.e20;
- let d02 = this.e10 * this.e21 - this.e11 * this.e20;
- let invDet = this.e00 * d00 - this.e01 * d01 + this.e02 * d02;
- if(invDet != 0) {
- invDet = 1 / invDet;
- }
- return new oimo.common.Mat3(d00 * invDet,-(this.e01 * this.e22 - this.e02 * this.e21) * invDet,(this.e01 * this.e12 - this.e02 * this.e11) * invDet,-d01 * invDet,(this.e00 * this.e22 - this.e02 * this.e20) * invDet,-(this.e00 * this.e12 - this.e02 * this.e10) * invDet,d02 * invDet,-(this.e00 * this.e21 - this.e01 * this.e20) * invDet,(this.e00 * this.e11 - this.e01 * this.e10) * invDet);
- }
- inverseEq() {
- let d00 = this.e11 * this.e22 - this.e12 * this.e21;
- let d01 = this.e10 * this.e22 - this.e12 * this.e20;
- let d02 = this.e10 * this.e21 - this.e11 * this.e20;
- let invDet = this.e00 * d00 - this.e01 * d01 + this.e02 * d02;
- if(invDet != 0) {
- invDet = 1 / invDet;
- }
- let t02 = (this.e01 * this.e12 - this.e02 * this.e11) * invDet;
- let t11 = (this.e00 * this.e22 - this.e02 * this.e20) * invDet;
- let t12 = -(this.e00 * this.e12 - this.e02 * this.e10) * invDet;
- let t21 = -(this.e00 * this.e21 - this.e01 * this.e20) * invDet;
- let t22 = (this.e00 * this.e11 - this.e01 * this.e10) * invDet;
- this.e00 = d00 * invDet;
- this.e01 = -(this.e01 * this.e22 - this.e02 * this.e21) * invDet;
- this.e02 = t02;
- this.e10 = -d01 * invDet;
- this.e11 = t11;
- this.e12 = t12;
- this.e20 = d02 * invDet;
- this.e21 = t21;
- this.e22 = t22;
- return this;
- }
- toArray(columnMajor) {
- if(columnMajor == null) {
- columnMajor = false;
- }
- if(columnMajor) {
- return [this.e00,this.e10,this.e20,this.e01,this.e11,this.e21,this.e02,this.e12,this.e22];
- } else {
- return [this.e00,this.e01,this.e02,this.e10,this.e11,this.e12,this.e20,this.e21,this.e22];
- }
- }
- copyFrom(m) {
- this.e00 = m.e00;
- this.e01 = m.e01;
- this.e02 = m.e02;
- this.e10 = m.e10;
- this.e11 = m.e11;
- this.e12 = m.e12;
- this.e20 = m.e20;
- this.e21 = m.e21;
- this.e22 = m.e22;
- return this;
- }
- clone() {
- return new oimo.common.Mat3(this.e00,this.e01,this.e02,this.e10,this.e11,this.e12,this.e20,this.e21,this.e22);
- }
- fromQuat(q) {
- let x = q.x;
- let y = q.y;
- let z = q.z;
- let w = q.w;
- let x2 = 2 * x;
- let y2 = 2 * y;
- let z2 = 2 * z;
- let xx = x * x2;
- let yy = y * y2;
- let zz = z * z2;
- let xy = x * y2;
- let yz = y * z2;
- let xz = x * z2;
- let wx = w * x2;
- let wy = w * y2;
- let wz = w * z2;
- this.e00 = 1 - yy - zz;
- this.e01 = xy - wz;
- this.e02 = xz + wy;
- this.e10 = xy + wz;
- this.e11 = 1 - xx - zz;
- this.e12 = yz - wx;
- this.e20 = xz - wy;
- this.e21 = yz + wx;
- this.e22 = 1 - xx - yy;
- return this;
- }
- toQuat() {
- let _this = new oimo.common.Quat();
- let e00 = this.e00;
- let e11 = this.e11;
- let e22 = this.e22;
- let t = e00 + e11 + e22;
- let s;
- if(t > 0) {
- s = Math.sqrt(t + 1);
- _this.w = 0.5 * s;
- s = 0.5 / s;
- _this.x = (this.e21 - this.e12) * s;
- _this.y = (this.e02 - this.e20) * s;
- _this.z = (this.e10 - this.e01) * s;
- } else if(e00 > e11) {
- if(e00 > e22) {
- s = Math.sqrt(e00 - e11 - e22 + 1);
- _this.x = 0.5 * s;
- s = 0.5 / s;
- _this.y = (this.e01 + this.e10) * s;
- _this.z = (this.e02 + this.e20) * s;
- _this.w = (this.e21 - this.e12) * s;
- } else {
- s = Math.sqrt(e22 - e00 - e11 + 1);
- _this.z = 0.5 * s;
- s = 0.5 / s;
- _this.x = (this.e02 + this.e20) * s;
- _this.y = (this.e12 + this.e21) * s;
- _this.w = (this.e10 - this.e01) * s;
- }
- } else if(e11 > e22) {
- s = Math.sqrt(e11 - e22 - e00 + 1);
- _this.y = 0.5 * s;
- s = 0.5 / s;
- _this.x = (this.e01 + this.e10) * s;
- _this.z = (this.e12 + this.e21) * s;
- _this.w = (this.e02 - this.e20) * s;
- } else {
- s = Math.sqrt(e22 - e00 - e11 + 1);
- _this.z = 0.5 * s;
- s = 0.5 / s;
- _this.x = (this.e02 + this.e20) * s;
- _this.y = (this.e12 + this.e21) * s;
- _this.w = (this.e10 - this.e01) * s;
- }
- return _this;
- }
- fromEulerXyz(eulerAngles) {
- let sx = Math.sin(eulerAngles.x);
- let sy = Math.sin(eulerAngles.y);
- let sz = Math.sin(eulerAngles.z);
- let cx = Math.cos(eulerAngles.x);
- let cy = Math.cos(eulerAngles.y);
- let cz = Math.cos(eulerAngles.z);
- this.e00 = cy * cz;
- this.e01 = -cy * sz;
- this.e02 = sy;
- this.e10 = cx * sz + cz * sx * sy;
- this.e11 = cx * cz - sx * sy * sz;
- this.e12 = -cy * sx;
- this.e20 = sx * sz - cx * cz * sy;
- this.e21 = cz * sx + cx * sy * sz;
- this.e22 = cx * cy;
- return this;
- }
- toEulerXyz() {
- let sy = this.e02;
- if(sy <= -1) {
- let xSubZ = Math.atan2(this.e21,this.e11);
- return new oimo.common.Vec3(xSubZ * 0.5,-1.570796326794895,-xSubZ * 0.5);
- }
- if(sy >= 1) {
- let xAddZ = Math.atan2(this.e21,this.e11);
- return new oimo.common.Vec3(xAddZ * 0.5,1.570796326794895,xAddZ * 0.5);
- }
- return new oimo.common.Vec3(Math.atan2(-this.e12,this.e22),Math.asin(sy),Math.atan2(-this.e01,this.e00));
- }
- getRow(index) {
- if(index == 0) {
- return new oimo.common.Vec3(this.e00,this.e01,this.e02);
- } else if(index == 1) {
- return new oimo.common.Vec3(this.e10,this.e11,this.e12);
- } else if(index == 2) {
- return new oimo.common.Vec3(this.e20,this.e21,this.e22);
- } else {
- return null;
- }
- }
- getCol(index) {
- if(index == 0) {
- return new oimo.common.Vec3(this.e00,this.e10,this.e20);
- } else if(index == 1) {
- return new oimo.common.Vec3(this.e01,this.e11,this.e21);
- } else if(index == 2) {
- return new oimo.common.Vec3(this.e02,this.e12,this.e22);
- } else {
- return null;
- }
- }
- getRowTo(index,dst) {
- if(index == 0) {
- dst.init(this.e00,this.e01,this.e02);
- } else if(index == 1) {
- dst.init(this.e10,this.e11,this.e12);
- } else if(index == 2) {
- dst.init(this.e20,this.e21,this.e22);
- } else {
- dst.zero();
- }
- }
- getColTo(index,dst) {
- if(index == 0) {
- dst.init(this.e00,this.e10,this.e20);
- } else if(index == 1) {
- dst.init(this.e01,this.e11,this.e21);
- } else if(index == 2) {
- dst.init(this.e02,this.e12,this.e22);
- } else {
- dst.zero();
- }
- }
- fromRows(row0,row1,row2) {
- this.e00 = row0.x;
- this.e01 = row0.y;
- this.e02 = row0.z;
- this.e10 = row1.x;
- this.e11 = row1.y;
- this.e12 = row1.z;
- this.e20 = row2.x;
- this.e21 = row2.y;
- this.e22 = row2.z;
- return this;
- }
- fromCols(col0,col1,col2) {
- this.e00 = col0.x;
- this.e01 = col1.x;
- this.e02 = col2.x;
- this.e10 = col0.y;
- this.e11 = col1.y;
- this.e12 = col2.y;
- this.e20 = col0.z;
- this.e21 = col1.z;
- this.e22 = col2.z;
- return this;
- }
- toString() {
- return "Mat3[" + (this.e00 > 0 ? (this.e00 * 10000000 + 0.5 | 0) / 10000000 : (this.e00 * 10000000 - 0.5 | 0) / 10000000) + ", " + (this.e01 > 0 ? (this.e01 * 10000000 + 0.5 | 0) / 10000000 : (this.e01 * 10000000 - 0.5 | 0) / 10000000) + ", " + (this.e02 > 0 ? (this.e02 * 10000000 + 0.5 | 0) / 10000000 : (this.e02 * 10000000 - 0.5 | 0) / 10000000) + ",\n" + " " + (this.e10 > 0 ? (this.e10 * 10000000 + 0.5 | 0) / 10000000 : (this.e10 * 10000000 - 0.5 | 0) / 10000000) + ", " + (this.e11 > 0 ? (this.e11 * 10000000 + 0.5 | 0) / 10000000 : (this.e11 * 10000000 - 0.5 | 0) / 10000000) + ", " + (this.e12 > 0 ? (this.e12 * 10000000 + 0.5 | 0) / 10000000 : (this.e12 * 10000000 - 0.5 | 0) / 10000000) + ",\n" + " " + (this.e20 > 0 ? (this.e20 * 10000000 + 0.5 | 0) / 10000000 : (this.e20 * 10000000 - 0.5 | 0) / 10000000) + ", " + (this.e21 > 0 ? (this.e21 * 10000000 + 0.5 | 0) / 10000000 : (this.e21 * 10000000 - 0.5 | 0) / 10000000) + ", " + (this.e22 > 0 ? (this.e22 * 10000000 + 0.5 | 0) / 10000000 : (this.e22 * 10000000 - 0.5 | 0) / 10000000) + "]";
- }
- }
- oimo.common.Mat4 = class oimo_common_Mat4 {
- constructor(e00,e01,e02,e03,e10,e11,e12,e13,e20,e21,e22,e23,e30,e31,e32,e33) {
- if(e33 == null) {
- e33 = 1;
- }
- if(e32 == null) {
- e32 = 0;
- }
- if(e31 == null) {
- e31 = 0;
- }
- if(e30 == null) {
- e30 = 0;
- }
- if(e23 == null) {
- e23 = 0;
- }
- if(e22 == null) {
- e22 = 1;
- }
- if(e21 == null) {
- e21 = 0;
- }
- if(e20 == null) {
- e20 = 0;
- }
- if(e13 == null) {
- e13 = 0;
- }
- if(e12 == null) {
- e12 = 0;
- }
- if(e11 == null) {
- e11 = 1;
- }
- if(e10 == null) {
- e10 = 0;
- }
- if(e03 == null) {
- e03 = 0;
- }
- if(e02 == null) {
- e02 = 0;
- }
- if(e01 == null) {
- e01 = 0;
- }
- if(e00 == null) {
- e00 = 1;
- }
- this.e00 = e00;
- this.e01 = e01;
- this.e02 = e02;
- this.e03 = e03;
- this.e10 = e10;
- this.e11 = e11;
- this.e12 = e12;
- this.e13 = e13;
- this.e20 = e20;
- this.e21 = e21;
- this.e22 = e22;
- this.e23 = e23;
- this.e30 = e30;
- this.e31 = e31;
- this.e32 = e32;
- this.e33 = e33;
- oimo.common.Mat4.numCreations++;
- }
- init(e00,e01,e02,e03,e10,e11,e12,e13,e20,e21,e22,e23,e30,e31,e32,e33) {
- this.e00 = e00;
- this.e01 = e01;
- this.e02 = e02;
- this.e03 = e03;
- this.e10 = e10;
- this.e11 = e11;
- this.e12 = e12;
- this.e13 = e13;
- this.e20 = e20;
- this.e21 = e21;
- this.e22 = e22;
- this.e23 = e23;
- this.e30 = e30;
- this.e31 = e31;
- this.e32 = e32;
- this.e33 = e33;
- return this;
- }
- identity() {
- this.e00 = 1;
- this.e01 = 0;
- this.e02 = 0;
- this.e03 = 0;
- this.e10 = 0;
- this.e11 = 1;
- this.e12 = 0;
- this.e13 = 0;
- this.e20 = 0;
- this.e21 = 0;
- this.e22 = 1;
- this.e23 = 0;
- this.e30 = 0;
- this.e31 = 0;
- this.e32 = 0;
- this.e33 = 1;
- return this;
- }
- add(m) {
- return new oimo.common.Mat4(this.e00 + m.e00,this.e01 + m.e01,this.e02 + m.e02,this.e03 + m.e03,this.e10 + m.e10,this.e11 + m.e11,this.e12 + m.e12,this.e13 + m.e13,this.e20 + m.e20,this.e21 + m.e21,this.e22 + m.e22,this.e23 + m.e23,this.e30 + m.e30,this.e31 + m.e31,this.e32 + m.e32,this.e33 + m.e33);
- }
- sub(m) {
- return new oimo.common.Mat4(this.e00 - m.e00,this.e01 - m.e01,this.e02 - m.e02,this.e03 - m.e03,this.e10 - m.e10,this.e11 - m.e11,this.e12 - m.e12,this.e13 - m.e13,this.e20 - m.e20,this.e21 - m.e21,this.e22 - m.e22,this.e23 - m.e23,this.e30 - m.e30,this.e31 - m.e31,this.e32 - m.e32,this.e33 - m.e33);
- }
- scale(s) {
- return new oimo.common.Mat4(this.e00 * s,this.e01 * s,this.e02 * s,this.e03 * s,this.e10 * s,this.e11 * s,this.e12 * s,this.e13 * s,this.e20 * s,this.e21 * s,this.e22 * s,this.e23 * s,this.e30 * s,this.e31 * s,this.e32 * s,this.e33 * s);
- }
- mul(m) {
- return new oimo.common.Mat4(this.e00 * m.e00 + this.e01 * m.e10 + this.e02 * m.e20 + this.e03 * m.e30,this.e00 * m.e01 + this.e01 * m.e11 + this.e02 * m.e21 + this.e03 * m.e31,this.e00 * m.e02 + this.e01 * m.e12 + this.e02 * m.e22 + this.e03 * m.e32,this.e00 * m.e03 + this.e01 * m.e13 + this.e02 * m.e23 + this.e03 * m.e33,this.e10 * m.e00 + this.e11 * m.e10 + this.e12 * m.e20 + this.e13 * m.e30,this.e10 * m.e01 + this.e11 * m.e11 + this.e12 * m.e21 + this.e13 * m.e31,this.e10 * m.e02 + this.e11 * m.e12 + this.e12 * m.e22 + this.e13 * m.e32,this.e10 * m.e03 + this.e11 * m.e13 + this.e12 * m.e23 + this.e13 * m.e33,this.e20 * m.e00 + this.e21 * m.e10 + this.e22 * m.e20 + this.e23 * m.e30,this.e20 * m.e01 + this.e21 * m.e11 + this.e22 * m.e21 + this.e23 * m.e31,this.e20 * m.e02 + this.e21 * m.e12 + this.e22 * m.e22 + this.e23 * m.e32,this.e20 * m.e03 + this.e21 * m.e13 + this.e22 * m.e23 + this.e23 * m.e33,this.e30 * m.e00 + this.e31 * m.e10 + this.e32 * m.e20 + this.e33 * m.e30,this.e30 * m.e01 + this.e31 * m.e11 + this.e32 * m.e21 + this.e33 * m.e31,this.e30 * m.e02 + this.e31 * m.e12 + this.e32 * m.e22 + this.e33 * m.e32,this.e30 * m.e03 + this.e31 * m.e13 + this.e32 * m.e23 + this.e33 * m.e33);
- }
- addEq(m) {
- this.e00 += m.e00;
- this.e01 += m.e01;
- this.e02 += m.e02;
- this.e03 += m.e03;
- this.e10 += m.e10;
- this.e11 += m.e11;
- this.e12 += m.e12;
- this.e13 += m.e13;
- this.e20 += m.e20;
- this.e21 += m.e21;
- this.e22 += m.e22;
- this.e23 += m.e23;
- this.e30 += m.e30;
- this.e31 += m.e31;
- this.e32 += m.e32;
- this.e33 += m.e33;
- return this;
- }
- subEq(m) {
- this.e00 -= m.e00;
- this.e01 -= m.e01;
- this.e02 -= m.e02;
- this.e03 -= m.e03;
- this.e10 -= m.e10;
- this.e11 -= m.e11;
- this.e12 -= m.e12;
- this.e13 -= m.e13;
- this.e20 -= m.e20;
- this.e21 -= m.e21;
- this.e22 -= m.e22;
- this.e23 -= m.e23;
- this.e30 -= m.e30;
- this.e31 -= m.e31;
- this.e32 -= m.e32;
- this.e33 -= m.e33;
- return this;
- }
- scaleEq(s) {
- this.e00 *= s;
- this.e01 *= s;
- this.e02 *= s;
- this.e03 *= s;
- this.e10 *= s;
- this.e11 *= s;
- this.e12 *= s;
- this.e13 *= s;
- this.e20 *= s;
- this.e21 *= s;
- this.e22 *= s;
- this.e23 *= s;
- this.e30 *= s;
- this.e31 *= s;
- this.e32 *= s;
- this.e33 *= s;
- return this;
- }
- mulEq(m) {
- let e01 = this.e00 * m.e01 + this.e01 * m.e11 + this.e02 * m.e21 + this.e03 * m.e31;
- let e02 = this.e00 * m.e02 + this.e01 * m.e12 + this.e02 * m.e22 + this.e03 * m.e32;
- let e03 = this.e00 * m.e03 + this.e01 * m.e13 + this.e02 * m.e23 + this.e03 * m.e33;
- let e10 = this.e10 * m.e00 + this.e11 * m.e10 + this.e12 * m.e20 + this.e13 * m.e30;
- let e11 = this.e10 * m.e01 + this.e11 * m.e11 + this.e12 * m.e21 + this.e13 * m.e31;
- let e12 = this.e10 * m.e02 + this.e11 * m.e12 + this.e12 * m.e22 + this.e13 * m.e32;
- let e13 = this.e10 * m.e03 + this.e11 * m.e13 + this.e12 * m.e23 + this.e13 * m.e33;
- let e20 = this.e20 * m.e00 + this.e21 * m.e10 + this.e22 * m.e20 + this.e23 * m.e30;
- let e21 = this.e20 * m.e01 + this.e21 * m.e11 + this.e22 * m.e21 + this.e23 * m.e31;
- let e22 = this.e20 * m.e02 + this.e21 * m.e12 + this.e22 * m.e22 + this.e23 * m.e32;
- let e23 = this.e20 * m.e03 + this.e21 * m.e13 + this.e22 * m.e23 + this.e23 * m.e33;
- let e30 = this.e30 * m.e00 + this.e31 * m.e10 + this.e32 * m.e20 + this.e33 * m.e30;
- let e31 = this.e30 * m.e01 + this.e31 * m.e11 + this.e32 * m.e21 + this.e33 * m.e31;
- let e32 = this.e30 * m.e02 + this.e31 * m.e12 + this.e32 * m.e22 + this.e33 * m.e32;
- let e33 = this.e30 * m.e03 + this.e31 * m.e13 + this.e32 * m.e23 + this.e33 * m.e33;
- this.e00 = this.e00 * m.e00 + this.e01 * m.e10 + this.e02 * m.e20 + this.e03 * m.e30;
- this.e01 = e01;
- this.e02 = e02;
- this.e03 = e03;
- this.e10 = e10;
- this.e11 = e11;
- this.e12 = e12;
- this.e13 = e13;
- this.e20 = e20;
- this.e21 = e21;
- this.e22 = e22;
- this.e23 = e23;
- this.e30 = e30;
- this.e31 = e31;
- this.e32 = e32;
- this.e33 = e33;
- return this;
- }
- prependScale(sx,sy,sz) {
- return new oimo.common.Mat4(this.e00 * sx,this.e01 * sx,this.e02 * sx,this.e03 * sx,this.e10 * sy,this.e11 * sy,this.e12 * sy,this.e13 * sy,this.e20 * sz,this.e21 * sz,this.e22 * sz,this.e23 * sz,this.e30,this.e31,this.e32,this.e33);
- }
- appendScale(sx,sy,sz) {
- return new oimo.common.Mat4(this.e00 * sx,this.e01 * sy,this.e02 * sz,this.e03,this.e10 * sx,this.e11 * sy,this.e12 * sz,this.e13,this.e20 * sx,this.e21 * sy,this.e22 * sz,this.e23,this.e30 * sx,this.e31 * sy,this.e32 * sz,this.e33);
- }
- prependRotation(rad,axisX,axisY,axisZ) {
- let s = Math.sin(rad);
- let c = Math.cos(rad);
- let c1 = 1 - c;
- let r00 = axisX * axisX * c1 + c;
- let r01 = axisX * axisY * c1 - axisZ * s;
- let r02 = axisX * axisZ * c1 + axisY * s;
- let r10 = axisY * axisX * c1 + axisZ * s;
- let r11 = axisY * axisY * c1 + c;
- let r12 = axisY * axisZ * c1 - axisX * s;
- let r20 = axisZ * axisX * c1 - axisY * s;
- let r21 = axisZ * axisY * c1 + axisX * s;
- let r22 = axisZ * axisZ * c1 + c;
- return new oimo.common.Mat4(r00 * this.e00 + r01 * this.e10 + r02 * this.e20,r00 * this.e01 + r01 * this.e11 + r02 * this.e21,r00 * this.e02 + r01 * this.e12 + r02 * this.e22,r00 * this.e03 + r01 * this.e13 + r02 * this.e23,r10 * this.e00 + r11 * this.e10 + r12 * this.e20,r10 * this.e01 + r11 * this.e11 + r12 * this.e21,r10 * this.e02 + r11 * this.e12 + r12 * this.e22,r10 * this.e03 + r11 * this.e13 + r12 * this.e23,r20 * this.e00 + r21 * this.e10 + r22 * this.e20,r20 * this.e01 + r21 * this.e11 + r22 * this.e21,r20 * this.e02 + r21 * this.e12 + r22 * this.e22,r20 * this.e03 + r21 * this.e13 + r22 * this.e23,this.e30,this.e31,this.e32,this.e33);
- }
- appendRotation(rad,axisX,axisY,axisZ) {
- let s = Math.sin(rad);
- let c = Math.cos(rad);
- let c1 = 1 - c;
- let r00 = axisX * axisX * c1 + c;
- let r01 = axisX * axisY * c1 - axisZ * s;
- let r02 = axisX * axisZ * c1 + axisY * s;
- let r10 = axisY * axisX * c1 + axisZ * s;
- let r11 = axisY * axisY * c1 + c;
- let r12 = axisY * axisZ * c1 - axisX * s;
- let r20 = axisZ * axisX * c1 - axisY * s;
- let r21 = axisZ * axisY * c1 + axisX * s;
- let r22 = axisZ * axisZ * c1 + c;
- return new oimo.common.Mat4(this.e00 * r00 + this.e01 * r10 + this.e02 * r20,this.e00 * r01 + this.e01 * r11 + this.e02 * r21,this.e00 * r02 + this.e01 * r12 + this.e02 * r22,this.e03,this.e10 * r00 + this.e11 * r10 + this.e12 * r20,this.e10 * r01 + this.e11 * r11 + this.e12 * r21,this.e10 * r02 + this.e11 * r12 + this.e12 * r22,this.e13,this.e20 * r00 + this.e21 * r10 + this.e22 * r20,this.e20 * r01 + this.e21 * r11 + this.e22 * r21,this.e20 * r02 + this.e21 * r12 + this.e22 * r22,this.e23,this.e30 * r00 + this.e31 * r10 + this.e32 * r20,this.e30 * r01 + this.e31 * r11 + this.e32 * r21,this.e30 * r02 + this.e31 * r12 + this.e32 * r22,this.e33);
- }
- prependTranslation(tx,ty,tz) {
- return new oimo.common.Mat4(this.e00 + tx * this.e30,this.e01 + tx * this.e31,this.e02 + tx * this.e32,this.e03 + tx * this.e33,this.e10 + ty * this.e30,this.e11 + ty * this.e31,this.e12 + ty * this.e32,this.e13 + ty * this.e33,this.e20 + tz * this.e30,this.e21 + tz * this.e31,this.e22 + tz * this.e32,this.e23 + tz * this.e33,this.e30,this.e31,this.e32,this.e33);
- }
- appendTranslation(tx,ty,tz) {
- return new oimo.common.Mat4(this.e00,this.e01,this.e02,this.e00 * tx + this.e01 * ty + this.e02 * tz + this.e03,this.e10,this.e11,this.e12,this.e10 * tx + this.e11 * ty + this.e12 * tz + this.e13,this.e20,this.e21,this.e22,this.e20 * tx + this.e21 * ty + this.e22 * tz + this.e23,this.e30,this.e31,this.e32,this.e30 * tx + this.e31 * ty + this.e32 * tz + this.e33);
- }
- prependScaleEq(sx,sy,sz) {
- this.e00 *= sx;
- this.e01 *= sx;
- this.e02 *= sx;
- this.e03 *= sx;
- this.e10 *= sy;
- this.e11 *= sy;
- this.e12 *= sy;
- this.e13 *= sy;
- this.e20 *= sz;
- this.e21 *= sz;
- this.e22 *= sz;
- this.e23 *= sz;
- return this;
- }
- appendScaleEq(sx,sy,sz) {
- this.e00 *= sx;
- this.e01 *= sy;
- this.e02 *= sz;
- this.e10 *= sx;
- this.e11 *= sy;
- this.e12 *= sz;
- this.e20 *= sx;
- this.e21 *= sy;
- this.e22 *= sz;
- this.e30 *= sx;
- this.e31 *= sy;
- this.e32 *= sz;
- return this;
- }
- prependRotationEq(rad,axisX,axisY,axisZ) {
- let s = Math.sin(rad);
- let c = Math.cos(rad);
- let c1 = 1 - c;
- let r00 = axisX * axisX * c1 + c;
- let r01 = axisX * axisY * c1 - axisZ * s;
- let r02 = axisX * axisZ * c1 + axisY * s;
- let r10 = axisY * axisX * c1 + axisZ * s;
- let r11 = axisY * axisY * c1 + c;
- let r12 = axisY * axisZ * c1 - axisX * s;
- let r20 = axisZ * axisX * c1 - axisY * s;
- let r21 = axisZ * axisY * c1 + axisX * s;
- let r22 = axisZ * axisZ * c1 + c;
- let e10 = r10 * this.e00 + r11 * this.e10 + r12 * this.e20;
- let e11 = r10 * this.e01 + r11 * this.e11 + r12 * this.e21;
- let e12 = r10 * this.e02 + r11 * this.e12 + r12 * this.e22;
- let e13 = r10 * this.e03 + r11 * this.e13 + r12 * this.e23;
- let e20 = r20 * this.e00 + r21 * this.e10 + r22 * this.e20;
- let e21 = r20 * this.e01 + r21 * this.e11 + r22 * this.e21;
- let e22 = r20 * this.e02 + r21 * this.e12 + r22 * this.e22;
- let e23 = r20 * this.e03 + r21 * this.e13 + r22 * this.e23;
- this.e00 = r00 * this.e00 + r01 * this.e10 + r02 * this.e20;
- this.e01 = r00 * this.e01 + r01 * this.e11 + r02 * this.e21;
- this.e02 = r00 * this.e02 + r01 * this.e12 + r02 * this.e22;
- this.e03 = r00 * this.e03 + r01 * this.e13 + r02 * this.e23;
- this.e10 = e10;
- this.e11 = e11;
- this.e12 = e12;
- this.e13 = e13;
- this.e20 = e20;
- this.e21 = e21;
- this.e22 = e22;
- this.e23 = e23;
- return this;
- }
- appendRotationEq(rad,axisX,axisY,axisZ) {
- let s = Math.sin(rad);
- let c = Math.cos(rad);
- let c1 = 1 - c;
- let r00 = axisX * axisX * c1 + c;
- let r01 = axisX * axisY * c1 - axisZ * s;
- let r02 = axisX * axisZ * c1 + axisY * s;
- let r10 = axisY * axisX * c1 + axisZ * s;
- let r11 = axisY * axisY * c1 + c;
- let r12 = axisY * axisZ * c1 - axisX * s;
- let r20 = axisZ * axisX * c1 - axisY * s;
- let r21 = axisZ * axisY * c1 + axisX * s;
- let r22 = axisZ * axisZ * c1 + c;
- let e01 = this.e00 * r01 + this.e01 * r11 + this.e02 * r21;
- let e02 = this.e00 * r02 + this.e01 * r12 + this.e02 * r22;
- let e11 = this.e10 * r01 + this.e11 * r11 + this.e12 * r21;
- let e12 = this.e10 * r02 + this.e11 * r12 + this.e12 * r22;
- let e21 = this.e20 * r01 + this.e21 * r11 + this.e22 * r21;
- let e22 = this.e20 * r02 + this.e21 * r12 + this.e22 * r22;
- let e31 = this.e30 * r01 + this.e31 * r11 + this.e32 * r21;
- let e32 = this.e30 * r02 + this.e31 * r12 + this.e32 * r22;
- this.e00 = this.e00 * r00 + this.e01 * r10 + this.e02 * r20;
- this.e01 = e01;
- this.e02 = e02;
- this.e10 = this.e10 * r00 + this.e11 * r10 + this.e12 * r20;
- this.e11 = e11;
- this.e12 = e12;
- this.e20 = this.e20 * r00 + this.e21 * r10 + this.e22 * r20;
- this.e21 = e21;
- this.e22 = e22;
- this.e30 = this.e30 * r00 + this.e31 * r10 + this.e32 * r20;
- this.e31 = e31;
- this.e32 = e32;
- return this;
- }
- prependTranslationEq(tx,ty,tz) {
- this.e00 += tx * this.e30;
- this.e01 += tx * this.e31;
- this.e02 += tx * this.e32;
- this.e03 += tx * this.e33;
- this.e10 += ty * this.e30;
- this.e11 += ty * this.e31;
- this.e12 += ty * this.e32;
- this.e13 += ty * this.e33;
- this.e20 += tz * this.e30;
- this.e21 += tz * this.e31;
- this.e22 += tz * this.e32;
- this.e23 += tz * this.e33;
- return this;
- }
- appendTranslationEq(tx,ty,tz) {
- let e03 = this.e00 * tx + this.e01 * ty + this.e02 * tz + this.e03;
- let e13 = this.e10 * tx + this.e11 * ty + this.e12 * tz + this.e13;
- let e23 = this.e20 * tx + this.e21 * ty + this.e22 * tz + this.e23;
- let e33 = this.e30 * tx + this.e31 * ty + this.e32 * tz + this.e33;
- this.e03 = e03;
- this.e13 = e13;
- this.e23 = e23;
- this.e33 = e33;
- return this;
- }
- transpose() {
- return new oimo.common.Mat4(this.e00,this.e10,this.e20,this.e30,this.e01,this.e11,this.e21,this.e31,this.e02,this.e12,this.e22,this.e32,this.e03,this.e13,this.e23,this.e33);
- }
- transposeEq() {
- let e10 = this.e01;
- let e20 = this.e02;
- let e21 = this.e12;
- let e30 = this.e03;
- let e31 = this.e13;
- let e32 = this.e23;
- this.e01 = this.e10;
- this.e02 = this.e20;
- this.e03 = this.e30;
- this.e10 = e10;
- this.e12 = this.e21;
- this.e13 = this.e31;
- this.e20 = e20;
- this.e21 = e21;
- this.e23 = this.e32;
- this.e30 = e30;
- this.e31 = e31;
- this.e32 = e32;
- return this;
- }
- determinant() {
- let d23_01 = this.e20 * this.e31 - this.e21 * this.e30;
- let d23_02 = this.e20 * this.e32 - this.e22 * this.e30;
- let d23_03 = this.e20 * this.e33 - this.e23 * this.e30;
- let d23_12 = this.e21 * this.e32 - this.e22 * this.e31;
- let d23_13 = this.e21 * this.e33 - this.e23 * this.e31;
- let d23_23 = this.e22 * this.e33 - this.e23 * this.e32;
- return this.e00 * (this.e11 * d23_23 - this.e12 * d23_13 + this.e13 * d23_12) - this.e01 * (this.e10 * d23_23 - this.e12 * d23_03 + this.e13 * d23_02) + this.e02 * (this.e10 * d23_13 - this.e11 * d23_03 + this.e13 * d23_01) - this.e03 * (this.e10 * d23_12 - this.e11 * d23_02 + this.e12 * d23_01);
- }
- trace() {
- return this.e00 + this.e11 + this.e22 + this.e33;
- }
- inverse() {
- let d01_01 = this.e00 * this.e11 - this.e01 * this.e10;
- let d01_02 = this.e00 * this.e12 - this.e02 * this.e10;
- let d01_03 = this.e00 * this.e13 - this.e03 * this.e10;
- let d01_12 = this.e01 * this.e12 - this.e02 * this.e11;
- let d01_13 = this.e01 * this.e13 - this.e03 * this.e11;
- let d01_23 = this.e02 * this.e13 - this.e03 * this.e12;
- let d23_01 = this.e20 * this.e31 - this.e21 * this.e30;
- let d23_02 = this.e20 * this.e32 - this.e22 * this.e30;
- let d23_03 = this.e20 * this.e33 - this.e23 * this.e30;
- let d23_12 = this.e21 * this.e32 - this.e22 * this.e31;
- let d23_13 = this.e21 * this.e33 - this.e23 * this.e31;
- let d23_23 = this.e22 * this.e33 - this.e23 * this.e32;
- let d00 = this.e11 * d23_23 - this.e12 * d23_13 + this.e13 * d23_12;
- let d01 = this.e10 * d23_23 - this.e12 * d23_03 + this.e13 * d23_02;
- let d02 = this.e10 * d23_13 - this.e11 * d23_03 + this.e13 * d23_01;
- let d03 = this.e10 * d23_12 - this.e11 * d23_02 + this.e12 * d23_01;
- let invDet = this.e00 * d00 - this.e01 * d01 + this.e02 * d02 - this.e03 * d03;
- if(invDet != 0) {
- invDet = 1 / invDet;
- }
- return new oimo.common.Mat4(d00 * invDet,-(this.e01 * d23_23 - this.e02 * d23_13 + this.e03 * d23_12) * invDet,(this.e31 * d01_23 - this.e32 * d01_13 + this.e33 * d01_12) * invDet,-(this.e21 * d01_23 - this.e22 * d01_13 + this.e23 * d01_12) * invDet,-d01 * invDet,(this.e00 * d23_23 - this.e02 * d23_03 + this.e03 * d23_02) * invDet,-(this.e30 * d01_23 - this.e32 * d01_03 + this.e33 * d01_02) * invDet,(this.e20 * d01_23 - this.e22 * d01_03 + this.e23 * d01_02) * invDet,d02 * invDet,-(this.e00 * d23_13 - this.e01 * d23_03 + this.e03 * d23_01) * invDet,(this.e30 * d01_13 - this.e31 * d01_03 + this.e33 * d01_01) * invDet,-(this.e20 * d01_13 - this.e21 * d01_03 + this.e23 * d01_01) * invDet,-d03 * invDet,(this.e00 * d23_12 - this.e01 * d23_02 + this.e02 * d23_01) * invDet,-(this.e30 * d01_12 - this.e31 * d01_02 + this.e32 * d01_01) * invDet,(this.e20 * d01_12 - this.e21 * d01_02 + this.e22 * d01_01) * invDet);
- }
- inverseEq() {
- let d01_01 = this.e00 * this.e11 - this.e01 * this.e10;
- let d01_02 = this.e00 * this.e12 - this.e02 * this.e10;
- let d01_03 = this.e00 * this.e13 - this.e03 * this.e10;
- let d01_12 = this.e01 * this.e12 - this.e02 * this.e11;
- let d01_13 = this.e01 * this.e13 - this.e03 * this.e11;
- let d01_23 = this.e02 * this.e13 - this.e03 * this.e12;
- let d23_01 = this.e20 * this.e31 - this.e21 * this.e30;
- let d23_02 = this.e20 * this.e32 - this.e22 * this.e30;
- let d23_03 = this.e20 * this.e33 - this.e23 * this.e30;
- let d23_12 = this.e21 * this.e32 - this.e22 * this.e31;
- let d23_13 = this.e21 * this.e33 - this.e23 * this.e31;
- let d23_23 = this.e22 * this.e33 - this.e23 * this.e32;
- let d00 = this.e11 * d23_23 - this.e12 * d23_13 + this.e13 * d23_12;
- let d01 = this.e10 * d23_23 - this.e12 * d23_03 + this.e13 * d23_02;
- let d02 = this.e10 * d23_13 - this.e11 * d23_03 + this.e13 * d23_01;
- let d03 = this.e10 * d23_12 - this.e11 * d23_02 + this.e12 * d23_01;
- let invDet = this.e00 * d00 - this.e01 * d01 + this.e02 * d02 - this.e03 * d03;
- if(invDet != 0) {
- invDet = 1 / invDet;
- }
- let t11 = (this.e00 * d23_23 - this.e02 * d23_03 + this.e03 * d23_02) * invDet;
- let t21 = -(this.e00 * d23_13 - this.e01 * d23_03 + this.e03 * d23_01) * invDet;
- let t23 = -(this.e20 * d01_13 - this.e21 * d01_03 + this.e23 * d01_01) * invDet;
- let t31 = (this.e00 * d23_12 - this.e01 * d23_02 + this.e02 * d23_01) * invDet;
- let t32 = -(this.e30 * d01_12 - this.e31 * d01_02 + this.e32 * d01_01) * invDet;
- let t33 = (this.e20 * d01_12 - this.e21 * d01_02 + this.e22 * d01_01) * invDet;
- this.e00 = d00 * invDet;
- this.e01 = -(this.e01 * d23_23 - this.e02 * d23_13 + this.e03 * d23_12) * invDet;
- this.e02 = (this.e31 * d01_23 - this.e32 * d01_13 + this.e33 * d01_12) * invDet;
- this.e03 = -(this.e21 * d01_23 - this.e22 * d01_13 + this.e23 * d01_12) * invDet;
- this.e10 = -d01 * invDet;
- this.e11 = t11;
- this.e12 = -(this.e30 * d01_23 - this.e32 * d01_03 + this.e33 * d01_02) * invDet;
- this.e13 = (this.e20 * d01_23 - this.e22 * d01_03 + this.e23 * d01_02) * invDet;
- this.e20 = d02 * invDet;
- this.e21 = t21;
- this.e22 = (this.e30 * d01_13 - this.e31 * d01_03 + this.e33 * d01_01) * invDet;
- this.e23 = t23;
- this.e30 = -d03 * invDet;
- this.e31 = t31;
- this.e32 = t32;
- this.e33 = t33;
- return this;
- }
- lookAt(eyeX,eyeY,eyeZ,atX,atY,atZ,upX,upY,upZ) {
- let zx = eyeX - atX;
- let zy = eyeY - atY;
- let zz = eyeZ - atZ;
- let tmp = 1 / Math.sqrt(zx * zx + zy * zy + zz * zz);
- zx *= tmp;
- zy *= tmp;
- zz *= tmp;
- let xx = upY * zz - upZ * zy;
- let xy = upZ * zx - upX * zz;
- let xz = upX * zy - upY * zx;
- tmp = 1 / Math.sqrt(xx * xx + xy * xy + xz * xz);
- xx *= tmp;
- xy *= tmp;
- xz *= tmp;
- let yx = zy * xz - zz * xy;
- let yy = zz * xx - zx * xz;
- let yz = zx * xy - zy * xx;
- this.e00 = xx;
- this.e01 = xy;
- this.e02 = xz;
- this.e03 = -(xx * eyeX + xy * eyeY + xz * eyeZ);
- this.e10 = yx;
- this.e11 = yy;
- this.e12 = yz;
- this.e13 = -(yx * eyeX + yy * eyeY + yz * eyeZ);
- this.e20 = zx;
- this.e21 = zy;
- this.e22 = zz;
- this.e23 = -(zx * eyeX + zy * eyeY + zz * eyeZ);
- this.e30 = 0;
- this.e31 = 0;
- this.e32 = 0;
- this.e33 = 1;
- return this;
- }
- perspective(fovY,aspect,near,far) {
- let h = 1 / Math.tan(fovY * 0.5);
- let fnf = far / (near - far);
- this.e00 = h / aspect;
- this.e01 = 0;
- this.e02 = 0;
- this.e03 = 0;
- this.e10 = 0;
- this.e11 = h;
- this.e12 = 0;
- this.e13 = 0;
- this.e20 = 0;
- this.e21 = 0;
- this.e22 = fnf;
- this.e23 = near * fnf;
- this.e30 = 0;
- this.e31 = 0;
- this.e32 = -1;
- this.e33 = 0;
- return this;
- }
- ortho(width,height,near,far) {
- let nf = 1 / (near - far);
- this.e00 = 2 / width;
- this.e01 = 0;
- this.e02 = 0;
- this.e03 = 0;
- this.e10 = 0;
- this.e11 = 2 / height;
- this.e12 = 0;
- this.e13 = 0;
- this.e20 = 0;
- this.e21 = 0;
- this.e22 = nf;
- this.e23 = near * nf;
- this.e30 = 0;
- this.e31 = 0;
- this.e32 = 0;
- this.e33 = 1;
- return this;
- }
- toArray(columnMajor) {
- if(columnMajor == null) {
- columnMajor = false;
- }
- if(columnMajor) {
- return [this.e00,this.e10,this.e20,this.e30,this.e01,this.e11,this.e21,this.e31,this.e02,this.e12,this.e22,this.e32,this.e03,this.e13,this.e23,this.e33];
- } else {
- return [this.e00,this.e01,this.e02,this.e03,this.e10,this.e11,this.e12,this.e13,this.e20,this.e21,this.e22,this.e23,this.e30,this.e31,this.e32,this.e33];
- }
- }
- copyFrom(m) {
- this.e00 = m.e00;
- this.e01 = m.e01;
- this.e02 = m.e02;
- this.e03 = m.e03;
- this.e10 = m.e10;
- this.e11 = m.e11;
- this.e12 = m.e12;
- this.e13 = m.e13;
- this.e20 = m.e20;
- this.e21 = m.e21;
- this.e22 = m.e22;
- this.e23 = m.e23;
- this.e30 = m.e30;
- this.e31 = m.e31;
- this.e32 = m.e32;
- this.e33 = m.e33;
- return this;
- }
- fromMat3(m) {
- this.e00 = m.e00;
- this.e01 = m.e01;
- this.e02 = m.e02;
- this.e03 = 0;
- this.e10 = m.e10;
- this.e11 = m.e11;
- this.e12 = m.e12;
- this.e13 = 0;
- this.e20 = m.e20;
- this.e21 = m.e21;
- this.e22 = m.e22;
- this.e23 = 0;
- this.e30 = 0;
- this.e31 = 0;
- this.e32 = 0;
- this.e33 = 1;
- return this;
- }
- fromTransform(transform) {
- this.e00 = transform._rotation00;
- this.e01 = transform._rotation01;
- this.e02 = transform._rotation02;
- this.e10 = transform._rotation10;
- this.e11 = transform._rotation11;
- this.e12 = transform._rotation12;
- this.e20 = transform._rotation20;
- this.e21 = transform._rotation21;
- this.e22 = transform._rotation22;
- this.e03 = transform._positionX;
- this.e13 = transform._positionY;
- this.e23 = transform._positionZ;
- this.e30 = 0;
- this.e31 = 0;
- this.e32 = 0;
- this.e33 = 1;
- return this;
- }
- clone() {
- return new oimo.common.Mat4(this.e00,this.e01,this.e02,this.e03,this.e10,this.e11,this.e12,this.e13,this.e20,this.e21,this.e22,this.e23,this.e30,this.e31,this.e32,this.e33);
- }
- toString() {
- return "Mat4[" + (this.e00 > 0 ? (this.e00 * 10000000 + 0.5 | 0) / 10000000 : (this.e00 * 10000000 - 0.5 | 0) / 10000000) + ", " + (this.e01 > 0 ? (this.e01 * 10000000 + 0.5 | 0) / 10000000 : (this.e01 * 10000000 - 0.5 | 0) / 10000000) + ", " + (this.e02 > 0 ? (this.e02 * 10000000 + 0.5 | 0) / 10000000 : (this.e02 * 10000000 - 0.5 | 0) / 10000000) + ", " + (this.e03 > 0 ? (this.e03 * 10000000 + 0.5 | 0) / 10000000 : (this.e03 * 10000000 - 0.5 | 0) / 10000000) + ",\n" + " " + (this.e10 > 0 ? (this.e10 * 10000000 + 0.5 | 0) / 10000000 : (this.e10 * 10000000 - 0.5 | 0) / 10000000) + ", " + (this.e11 > 0 ? (this.e11 * 10000000 + 0.5 | 0) / 10000000 : (this.e11 * 10000000 - 0.5 | 0) / 10000000) + ", " + (this.e12 > 0 ? (this.e12 * 10000000 + 0.5 | 0) / 10000000 : (this.e12 * 10000000 - 0.5 | 0) / 10000000) + ", " + (this.e13 > 0 ? (this.e13 * 10000000 + 0.5 | 0) / 10000000 : (this.e13 * 10000000 - 0.5 | 0) / 10000000) + ",\n" + " " + (this.e20 > 0 ? (this.e20 * 10000000 + 0.5 | 0) / 10000000 : (this.e20 * 10000000 - 0.5 | 0) / 10000000) + ", " + (this.e21 > 0 ? (this.e21 * 10000000 + 0.5 | 0) / 10000000 : (this.e21 * 10000000 - 0.5 | 0) / 10000000) + ", " + (this.e22 > 0 ? (this.e22 * 10000000 + 0.5 | 0) / 10000000 : (this.e22 * 10000000 - 0.5 | 0) / 10000000) + ", " + (this.e23 > 0 ? (this.e23 * 10000000 + 0.5 | 0) / 10000000 : (this.e23 * 10000000 - 0.5 | 0) / 10000000) + ",\n" + " " + (this.e30 > 0 ? (this.e30 * 10000000 + 0.5 | 0) / 10000000 : (this.e30 * 10000000 - 0.5 | 0) / 10000000) + ", " + (this.e31 > 0 ? (this.e31 * 10000000 + 0.5 | 0) / 10000000 : (this.e31 * 10000000 - 0.5 | 0) / 10000000) + ", " + (this.e32 > 0 ? (this.e32 * 10000000 + 0.5 | 0) / 10000000 : (this.e32 * 10000000 - 0.5 | 0) / 10000000) + ", " + (this.e33 > 0 ? (this.e33 * 10000000 + 0.5 | 0) / 10000000 : (this.e33 * 10000000 - 0.5 | 0) / 10000000) + "]";
- }
- }
- oimo.common.MathUtil = class oimo_common_MathUtil {
- static abs(x) {
- if(x > 0) {
- return x;
- } else {
- return -x;
- }
- }
- static sin(x) {
- return Math.sin(x);
- }
- static cos(x) {
- return Math.cos(x);
- }
- static tan(x) {
- return Math.tan(x);
- }
- static asin(x) {
- return Math.asin(x);
- }
- static acos(x) {
- return Math.acos(x);
- }
- static atan(x) {
- return Math.atan(x);
- }
- static safeAsin(x) {
- if(x <= -1) {
- return -1.570796326794895;
- }
- if(x >= 1) {
- return 1.570796326794895;
- }
- return Math.asin(x);
- }
- static safeAcos(x) {
- if(x <= -1) {
- return 3.14159265358979;
- }
- if(x >= 1) {
- return 0;
- }
- return Math.acos(x);
- }
- static atan2(y,x) {
- return Math.atan2(y,x);
- }
- static sqrt(x) {
- return Math.sqrt(x);
- }
- static clamp(x,min,max) {
- if(x < min) {
- return min;
- } else if(x > max) {
- return max;
- } else {
- return x;
- }
- }
- static rand() {
- return Math.random();
- }
- static randIn(min,max) {
- return min + Math.random() * (max - min);
- }
- static randVec3In(min,max) {
- return new oimo.common.Vec3(min + Math.random() * (max - min),min + Math.random() * (max - min),min + Math.random() * (max - min));
- }
- static randVec3() {
- return new oimo.common.Vec3(-1 + Math.random() * 2,-1 + Math.random() * 2,-1 + Math.random() * 2);
- }
- }
- oimo.common.Pool = class oimo_common_Pool {
- constructor() {
- this.stackVec3 = new Array(256);
- this.sizeVec3 = 0;
- this.stackMat3 = new Array(256);
- this.sizeMat3 = 0;
- this.stackMat4 = new Array(256);
- this.sizeMat4 = 0;
- this.stackQuat = new Array(256);
- this.sizeQuat = 0;
- }
- vec3() {
- if(this.sizeVec3 == 0) {
- return new oimo.common.Vec3();
- } else {
- return this.stackVec3[--this.sizeVec3];
- }
- }
- mat3() {
- if(this.sizeMat3 == 0) {
- return new oimo.common.Mat3();
- } else {
- return this.stackMat3[--this.sizeMat3];
- }
- }
- mat4() {
- if(this.sizeMat4 == 0) {
- return new oimo.common.Mat4();
- } else {
- return this.stackMat4[--this.sizeMat4];
- }
- }
- quat() {
- if(this.sizeQuat == 0) {
- return new oimo.common.Quat();
- } else {
- return this.stackQuat[--this.sizeQuat];
- }
- }
- dispose(vec3,mat3,mat4,quat) {
- if(vec3 != null) {
- vec3.zero();
- if(this.sizeVec3 == this.stackVec3.length) {
- let newArray = new Array(this.sizeVec3 << 1);
- let _g = 0;
- let _g1 = this.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = this.stackVec3[i];
- this.stackVec3[i] = null;
- }
- this.stackVec3 = newArray;
- }
- this.stackVec3[this.sizeVec3++] = vec3;
- }
- if(mat3 != null) {
- mat3.e00 = 1;
- mat3.e01 = 0;
- mat3.e02 = 0;
- mat3.e10 = 0;
- mat3.e11 = 1;
- mat3.e12 = 0;
- mat3.e20 = 0;
- mat3.e21 = 0;
- mat3.e22 = 1;
- if(this.sizeMat3 == this.stackMat3.length) {
- let newArray = new Array(this.sizeMat3 << 1);
- let _g = 0;
- let _g1 = this.sizeMat3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = this.stackMat3[i];
- this.stackMat3[i] = null;
- }
- this.stackMat3 = newArray;
- }
- this.stackMat3[this.sizeMat3++] = mat3;
- }
- if(mat4 != null) {
- mat4.e00 = 1;
- mat4.e01 = 0;
- mat4.e02 = 0;
- mat4.e03 = 0;
- mat4.e10 = 0;
- mat4.e11 = 1;
- mat4.e12 = 0;
- mat4.e13 = 0;
- mat4.e20 = 0;
- mat4.e21 = 0;
- mat4.e22 = 1;
- mat4.e23 = 0;
- mat4.e30 = 0;
- mat4.e31 = 0;
- mat4.e32 = 0;
- mat4.e33 = 1;
- if(this.sizeMat4 == this.stackMat4.length) {
- let newArray = new Array(this.sizeMat4 << 1);
- let _g = 0;
- let _g1 = this.sizeMat4;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = this.stackMat4[i];
- this.stackMat4[i] = null;
- }
- this.stackMat4 = newArray;
- }
- this.stackMat4[this.sizeMat4++] = mat4;
- }
- if(quat != null) {
- quat.x = 0;
- quat.y = 0;
- quat.z = 0;
- quat.w = 1;
- if(this.sizeQuat == this.stackQuat.length) {
- let newArray = new Array(this.sizeQuat << 1);
- let _g = 0;
- let _g1 = this.sizeQuat;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = this.stackQuat[i];
- this.stackQuat[i] = null;
- }
- this.stackQuat = newArray;
- }
- this.stackQuat[this.sizeQuat++] = quat;
- }
- }
- disposeVec3(v) {
- v.zero();
- if(this.sizeVec3 == this.stackVec3.length) {
- let newArray = new Array(this.sizeVec3 << 1);
- let _g = 0;
- let _g1 = this.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = this.stackVec3[i];
- this.stackVec3[i] = null;
- }
- this.stackVec3 = newArray;
- }
- this.stackVec3[this.sizeVec3++] = v;
- }
- disposeMat3(m) {
- m.e00 = 1;
- m.e01 = 0;
- m.e02 = 0;
- m.e10 = 0;
- m.e11 = 1;
- m.e12 = 0;
- m.e20 = 0;
- m.e21 = 0;
- m.e22 = 1;
- if(this.sizeMat3 == this.stackMat3.length) {
- let newArray = new Array(this.sizeMat3 << 1);
- let _g = 0;
- let _g1 = this.sizeMat3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = this.stackMat3[i];
- this.stackMat3[i] = null;
- }
- this.stackMat3 = newArray;
- }
- this.stackMat3[this.sizeMat3++] = m;
- }
- disposeMat4(m) {
- m.e00 = 1;
- m.e01 = 0;
- m.e02 = 0;
- m.e03 = 0;
- m.e10 = 0;
- m.e11 = 1;
- m.e12 = 0;
- m.e13 = 0;
- m.e20 = 0;
- m.e21 = 0;
- m.e22 = 1;
- m.e23 = 0;
- m.e30 = 0;
- m.e31 = 0;
- m.e32 = 0;
- m.e33 = 1;
- if(this.sizeMat4 == this.stackMat4.length) {
- let newArray = new Array(this.sizeMat4 << 1);
- let _g = 0;
- let _g1 = this.sizeMat4;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = this.stackMat4[i];
- this.stackMat4[i] = null;
- }
- this.stackMat4 = newArray;
- }
- this.stackMat4[this.sizeMat4++] = m;
- }
- disposeQuat(q) {
- q.x = 0;
- q.y = 0;
- q.z = 0;
- q.w = 1;
- if(this.sizeQuat == this.stackQuat.length) {
- let newArray = new Array(this.sizeQuat << 1);
- let _g = 0;
- let _g1 = this.sizeQuat;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = this.stackQuat[i];
- this.stackQuat[i] = null;
- }
- this.stackQuat = newArray;
- }
- this.stackQuat[this.sizeQuat++] = q;
- }
- }
- oimo.common.Quat = class oimo_common_Quat {
- constructor(x,y,z,w) {
- if(w == null) {
- w = 1;
- }
- if(z == null) {
- z = 0;
- }
- if(y == null) {
- y = 0;
- }
- if(x == null) {
- x = 0;
- }
- this.x = x;
- this.y = y;
- this.z = z;
- this.w = w;
- oimo.common.Quat.numCreations++;
- }
- identity() {
- this.x = 0;
- this.y = 0;
- this.z = 0;
- this.w = 1;
- return this;
- }
- init(x,y,z,w) {
- this.x = x;
- this.y = y;
- this.z = z;
- this.w = w;
- return this;
- }
- add(q) {
- return new oimo.common.Quat(this.x + q.x,this.y + q.y,this.z + q.z,this.w + q.w);
- }
- sub(q) {
- return new oimo.common.Quat(this.x - q.x,this.y - q.y,this.z - q.z,this.w - q.w);
- }
- scale(s) {
- return new oimo.common.Quat(this.x * s,this.y * s,this.z * s,this.w * s);
- }
- addEq(q) {
- this.x += q.x;
- this.y += q.y;
- this.z += q.z;
- this.w += q.w;
- return this;
- }
- subEq(q) {
- this.x -= q.x;
- this.y -= q.y;
- this.z -= q.z;
- this.w -= q.w;
- return this;
- }
- scaleEq(s) {
- this.x *= s;
- this.y *= s;
- this.z *= s;
- this.w *= s;
- return this;
- }
- length() {
- return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w);
- }
- lengthSq() {
- return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;
- }
- dot(q) {
- return this.x * q.x + this.y * q.y + this.z * q.z + this.w * q.w;
- }
- normalized() {
- let invLen = Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w);
- if(invLen > 0) {
- invLen = 1 / invLen;
- }
- return new oimo.common.Quat(this.x * invLen,this.y * invLen,this.z * invLen,this.w * invLen);
- }
- normalize() {
- let invLen = Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w);
- if(invLen > 0) {
- invLen = 1 / invLen;
- }
- this.x *= invLen;
- this.y *= invLen;
- this.z *= invLen;
- this.w *= invLen;
- return this;
- }
- setArc(v1,v2) {
- let x1 = v1.x;
- let y1 = v1.y;
- let z1 = v1.z;
- let x2 = v2.x;
- let y2 = v2.y;
- let z2 = v2.z;
- let d = x1 * x2 + y1 * y2 + z1 * z2;
- this.w = Math.sqrt((1 + d) * 0.5);
- if(this.w == 0) {
- x2 = x1 * x1;
- y2 = y1 * y1;
- z2 = z1 * z1;
- if(x2 < y2) {
- if(x2 < z2) {
- d = 1 / Math.sqrt(y2 + z2);
- this.x = 0;
- this.y = z1 * d;
- this.z = -y1 * d;
- } else {
- d = 1 / Math.sqrt(x2 + y2);
- this.z = 0;
- this.x = y1 * d;
- this.y = -x1 * d;
- }
- } else if(y2 < z2) {
- d = 1 / Math.sqrt(z2 + x2);
- this.y = 0;
- this.z = x1 * d;
- this.x = -z1 * d;
- } else {
- d = 1 / Math.sqrt(x2 + y2);
- this.z = 0;
- this.x = y1 * d;
- this.y = -x1 * d;
- }
- return this;
- }
- d = 0.5 / this.w;
- this.x = (y1 * z2 - z1 * y2) * d;
- this.y = (z1 * x2 - x1 * z2) * d;
- this.z = (x1 * y2 - y1 * x2) * d;
- return this;
- }
- slerp(q,t) {
- let qx;
- let qy;
- let qz;
- let qw;
- let d = this.x * q.x + this.y * q.y + this.z * q.z + this.w * q.w;
- if(d < 0) {
- d = -d;
- qx = -q.x;
- qy = -q.y;
- qz = -q.z;
- qw = -q.w;
- } else {
- qx = q.x;
- qy = q.y;
- qz = q.z;
- qw = q.w;
- }
- if(d > 0.999999) {
- let _this = new oimo.common.Quat(this.x + (qx - this.x) * t,this.y + (qy - this.y) * t,this.z + (qz - this.z) * t,this.w + (qw - this.w) * t);
- let invLen = Math.sqrt(_this.x * _this.x + _this.y * _this.y + _this.z * _this.z + _this.w * _this.w);
- if(invLen > 0) {
- invLen = 1 / invLen;
- }
- _this.x *= invLen;
- _this.y *= invLen;
- _this.z *= invLen;
- _this.w *= invLen;
- return _this;
- }
- let theta = t * Math.acos(d);
- qx -= this.x * d;
- qy -= this.y * d;
- qz -= this.z * d;
- qw -= this.w * d;
- let invLen = 1 / Math.sqrt(qx * qx + qy * qy + qz * qz + qw * qw);
- qx *= invLen;
- qy *= invLen;
- qz *= invLen;
- qw *= invLen;
- let sin = Math.sin(theta);
- let cos = Math.cos(theta);
- return new oimo.common.Quat(this.x * cos + qx * sin,this.y * cos + qy * sin,this.z * cos + qz * sin,this.w * cos + qw * sin);
- }
- copyFrom(q) {
- this.x = q.x;
- this.y = q.y;
- this.z = q.z;
- this.w = q.w;
- return this;
- }
- clone() {
- return new oimo.common.Quat(this.x,this.y,this.z,this.w);
- }
- fromMat3(m) {
- let e00 = m.e00;
- let e11 = m.e11;
- let e22 = m.e22;
- let t = e00 + e11 + e22;
- let s;
- if(t > 0) {
- s = Math.sqrt(t + 1);
- this.w = 0.5 * s;
- s = 0.5 / s;
- this.x = (m.e21 - m.e12) * s;
- this.y = (m.e02 - m.e20) * s;
- this.z = (m.e10 - m.e01) * s;
- } else if(e00 > e11) {
- if(e00 > e22) {
- s = Math.sqrt(e00 - e11 - e22 + 1);
- this.x = 0.5 * s;
- s = 0.5 / s;
- this.y = (m.e01 + m.e10) * s;
- this.z = (m.e02 + m.e20) * s;
- this.w = (m.e21 - m.e12) * s;
- } else {
- s = Math.sqrt(e22 - e00 - e11 + 1);
- this.z = 0.5 * s;
- s = 0.5 / s;
- this.x = (m.e02 + m.e20) * s;
- this.y = (m.e12 + m.e21) * s;
- this.w = (m.e10 - m.e01) * s;
- }
- } else if(e11 > e22) {
- s = Math.sqrt(e11 - e22 - e00 + 1);
- this.y = 0.5 * s;
- s = 0.5 / s;
- this.x = (m.e01 + m.e10) * s;
- this.z = (m.e12 + m.e21) * s;
- this.w = (m.e02 - m.e20) * s;
- } else {
- s = Math.sqrt(e22 - e00 - e11 + 1);
- this.z = 0.5 * s;
- s = 0.5 / s;
- this.x = (m.e02 + m.e20) * s;
- this.y = (m.e12 + m.e21) * s;
- this.w = (m.e10 - m.e01) * s;
- }
- return this;
- }
- toMat3() {
- let _this = new oimo.common.Mat3();
- let x = this.x;
- let y = this.y;
- let z = this.z;
- let w = this.w;
- let x2 = 2 * x;
- let y2 = 2 * y;
- let z2 = 2 * z;
- let xx = x * x2;
- let yy = y * y2;
- let zz = z * z2;
- let xy = x * y2;
- let yz = y * z2;
- let xz = x * z2;
- let wx = w * x2;
- let wy = w * y2;
- let wz = w * z2;
- _this.e00 = 1 - yy - zz;
- _this.e01 = xy - wz;
- _this.e02 = xz + wy;
- _this.e10 = xy + wz;
- _this.e11 = 1 - xx - zz;
- _this.e12 = yz - wx;
- _this.e20 = xz - wy;
- _this.e21 = yz + wx;
- _this.e22 = 1 - xx - yy;
- return _this;
- }
- toString() {
- return "Quat[" + (this.x > 0 ? (this.x * 10000000 + 0.5 | 0) / 10000000 : (this.x * 10000000 - 0.5 | 0) / 10000000) + " i,\n" + " " + (this.y > 0 ? (this.y * 10000000 + 0.5 | 0) / 10000000 : (this.y * 10000000 - 0.5 | 0) / 10000000) + " j,\n" + " " + (this.z > 0 ? (this.z * 10000000 + 0.5 | 0) / 10000000 : (this.z * 10000000 - 0.5 | 0) / 10000000) + " k,\n" + " " + (this.w > 0 ? (this.w * 10000000 + 0.5 | 0) / 10000000 : (this.w * 10000000 - 0.5 | 0) / 10000000) + "]";
- }
- }
- if(!oimo.dynamics) oimo.dynamics = {};
- oimo.dynamics.Contact = class oimo_dynamics_Contact {
- constructor() {
- this._next = null;
- this._prev = null;
- this._link1 = new oimo.dynamics.ContactLink();
- this._link2 = new oimo.dynamics.ContactLink();
- this._s1 = null;
- this._s2 = null;
- this._b1 = null;
- this._b2 = null;
- this._detector = null;
- this._cachedDetectorData = new oimo.collision.narrowphase.detector.CachedDetectorData();
- this._detectorResult = new oimo.collision.narrowphase.DetectorResult();
- this._latest = false;
- this._shouldBeSkipped = false;
- this._manifold = new oimo.dynamics.constraint.contact.Manifold();
- this._updater = new oimo.dynamics.constraint.contact.ManifoldUpdater(this._manifold);
- this._contactConstraint = new oimo.dynamics.constraint.contact.ContactConstraint(this._manifold);
- this._touching = false;
- }
- _updateManifold() {
- if(this._detector == null) {
- return;
- }
- let ptouching = this._touching;
- let result = this._detectorResult;
- this._detector.detect(result,this._s1._geom,this._s2._geom,this._s1._transform,this._s2._transform,this._cachedDetectorData);
- this._touching = result.numPoints > 0;
- if(this._touching) {
- this._manifold._buildBasis(result.normal);
- if(result.getMaxDepth() > oimo.common.Setting.contactUseAlternativePositionCorrectionAlgorithmDepthThreshold) {
- this._contactConstraint._positionCorrectionAlgorithm = oimo.common.Setting.alternativeContactPositionCorrectionAlgorithm;
- } else {
- this._contactConstraint._positionCorrectionAlgorithm = oimo.common.Setting.defaultContactPositionCorrectionAlgorithm;
- }
- if(result.incremental) {
- this._updater.incrementalUpdate(result,this._b1._transform,this._b2._transform);
- } else {
- this._updater.totalUpdate(result,this._b1._transform,this._b2._transform);
- }
- } else {
- this._manifold._clear();
- }
- if(this._touching && !ptouching) {
- let cc1 = this._s1._contactCallback;
- let cc2 = this._s2._contactCallback;
- if(cc1 == cc2) {
- cc2 = null;
- }
- if(cc1 != null) {
- cc1.beginContact(this);
- }
- if(cc2 != null) {
- cc2.beginContact(this);
- }
- }
- if(!this._touching && ptouching) {
- let cc1 = this._s1._contactCallback;
- let cc2 = this._s2._contactCallback;
- if(cc1 == cc2) {
- cc2 = null;
- }
- if(cc1 != null) {
- cc1.endContact(this);
- }
- if(cc2 != null) {
- cc2.endContact(this);
- }
- }
- if(this._touching) {
- let cc1 = this._s1._contactCallback;
- let cc2 = this._s2._contactCallback;
- if(cc1 == cc2) {
- cc2 = null;
- }
- if(cc1 != null) {
- cc1.preSolve(this);
- }
- if(cc2 != null) {
- cc2.preSolve(this);
- }
- }
- }
- _postSolve() {
- let cc1 = this._s1._contactCallback;
- let cc2 = this._s2._contactCallback;
- if(cc1 == cc2) {
- cc2 = null;
- }
- if(cc1 != null) {
- cc1.postSolve(this);
- }
- if(cc2 != null) {
- cc2.postSolve(this);
- }
- }
- getShape1() {
- return this._s1;
- }
- getShape2() {
- return this._s2;
- }
- isTouching() {
- return this._touching;
- }
- getManifold() {
- return this._manifold;
- }
- getContactConstraint() {
- return this._contactConstraint;
- }
- getPrev() {
- return this._prev;
- }
- getNext() {
- return this._next;
- }
- }
- oimo.dynamics.ContactLink = class oimo_dynamics_ContactLink {
- constructor() {
- this._prev = null;
- this._next = null;
- this._contact = null;
- this._other = null;
- }
- getContact() {
- return this._contact;
- }
- getOther() {
- return this._other;
- }
- getPrev() {
- return this._prev;
- }
- getNext() {
- return this._next;
- }
- }
- oimo.dynamics.ContactManager = class oimo_dynamics_ContactManager {
- constructor(broadPhase) {
- this._broadPhase = broadPhase;
- this._collisionMatrix = new oimo.collision.narrowphase.CollisionMatrix();
- this._numContacts = 0;
- }
- createContacts() {
- let pp = this._broadPhase._proxyPairList;
- while(pp != null) {
- let n = pp._next;
- while(true) {
- let s1;
- let s2;
- if(pp._p1._id < pp._p2._id) {
- s1 = pp._p1.userData;
- s2 = pp._p2.userData;
- } else {
- s1 = pp._p2.userData;
- s2 = pp._p1.userData;
- }
- if(!this.shouldCollide(s1,s2)) {
- break;
- }
- let b1 = s1._rigidBody;
- let b2 = s2._rigidBody;
- let l;
- if(b1._numContactLinks < b2._numContactLinks) {
- l = b1._contactLinkList;
- } else {
- l = b2._contactLinkList;
- }
- let id1 = s1._id;
- let id2 = s2._id;
- let found = false;
- while(l != null) {
- let c = l._contact;
- if(c._s1._id == id1 && c._s2._id == id2) {
- c._latest = true;
- found = true;
- break;
- }
- l = l._next;
- }
- if(!found) {
- let first = this._contactPool;
- if(first != null) {
- this._contactPool = first._next;
- first._next = null;
- } else {
- first = new oimo.dynamics.Contact();
- }
- let c = first;
- if(this._contactList == null) {
- this._contactList = c;
- this._contactListLast = c;
- } else {
- this._contactListLast._next = c;
- c._prev = this._contactListLast;
- this._contactListLast = c;
- }
- c._latest = true;
- let detector = this._collisionMatrix.detectors[s1._geom._type][s2._geom._type];
- c._s1 = s1;
- c._s2 = s2;
- c._b1 = s1._rigidBody;
- c._b2 = s2._rigidBody;
- c._touching = false;
- if(c._b1._contactLinkList == null) {
- c._b1._contactLinkList = c._link1;
- c._b1._contactLinkListLast = c._link1;
- } else {
- c._b1._contactLinkListLast._next = c._link1;
- c._link1._prev = c._b1._contactLinkListLast;
- c._b1._contactLinkListLast = c._link1;
- }
- if(c._b2._contactLinkList == null) {
- c._b2._contactLinkList = c._link2;
- c._b2._contactLinkListLast = c._link2;
- } else {
- c._b2._contactLinkListLast._next = c._link2;
- c._link2._prev = c._b2._contactLinkListLast;
- c._b2._contactLinkListLast = c._link2;
- }
- c._b1._numContactLinks++;
- c._b2._numContactLinks++;
- c._link1._other = c._b2;
- c._link2._other = c._b1;
- c._link1._contact = c;
- c._link2._contact = c;
- c._detector = detector;
- let _this = c._contactConstraint;
- _this._s1 = s1;
- _this._s2 = s2;
- _this._b1 = _this._s1._rigidBody;
- _this._b2 = _this._s2._rigidBody;
- _this._tf1 = _this._b1._transform;
- _this._tf2 = _this._b2._transform;
- this._numContacts++;
- }
- break;
- }
- pp = n;
- }
- }
- destroyOutdatedContacts() {
- let incremental = this._broadPhase._incremental;
- let c = this._contactList;
- while(c != null) {
- let n = c._next;
- while(true) {
- if(c._latest) {
- c._latest = false;
- c._shouldBeSkipped = false;
- break;
- }
- if(!incremental) {
- let prev = c._prev;
- let next = c._next;
- if(prev != null) {
- prev._next = next;
- }
- if(next != null) {
- next._prev = prev;
- }
- if(c == this._contactList) {
- this._contactList = this._contactList._next;
- }
- if(c == this._contactListLast) {
- this._contactListLast = this._contactListLast._prev;
- }
- c._next = null;
- c._prev = null;
- if(c._touching) {
- let cc1 = c._s1._contactCallback;
- let cc2 = c._s2._contactCallback;
- if(cc1 == cc2) {
- cc2 = null;
- }
- if(cc1 != null) {
- cc1.endContact(c);
- }
- if(cc2 != null) {
- cc2.endContact(c);
- }
- }
- let prev1 = c._link1._prev;
- let next1 = c._link1._next;
- if(prev1 != null) {
- prev1._next = next1;
- }
- if(next1 != null) {
- next1._prev = prev1;
- }
- if(c._link1 == c._b1._contactLinkList) {
- c._b1._contactLinkList = c._b1._contactLinkList._next;
- }
- if(c._link1 == c._b1._contactLinkListLast) {
- c._b1._contactLinkListLast = c._b1._contactLinkListLast._prev;
- }
- c._link1._next = null;
- c._link1._prev = null;
- let prev2 = c._link2._prev;
- let next2 = c._link2._next;
- if(prev2 != null) {
- prev2._next = next2;
- }
- if(next2 != null) {
- next2._prev = prev2;
- }
- if(c._link2 == c._b2._contactLinkList) {
- c._b2._contactLinkList = c._b2._contactLinkList._next;
- }
- if(c._link2 == c._b2._contactLinkListLast) {
- c._b2._contactLinkListLast = c._b2._contactLinkListLast._prev;
- }
- c._link2._next = null;
- c._link2._prev = null;
- c._b1._numContactLinks--;
- c._b2._numContactLinks--;
- c._link1._other = null;
- c._link2._other = null;
- c._link1._contact = null;
- c._link2._contact = null;
- c._s1 = null;
- c._s2 = null;
- c._b1 = null;
- c._b2 = null;
- c._touching = false;
- c._cachedDetectorData._clear();
- c._manifold._clear();
- c._detector = null;
- let _this = c._contactConstraint;
- _this._s1 = null;
- _this._s2 = null;
- _this._b1 = null;
- _this._b2 = null;
- _this._tf1 = null;
- _this._tf2 = null;
- c._next = this._contactPool;
- this._contactPool = c;
- this._numContacts--;
- break;
- }
- let s1 = c._s1;
- let s2 = c._s2;
- let r1 = s1._rigidBody;
- let r2 = s2._rigidBody;
- if(!(!r1._sleeping && r1._type != 1) && !(!r2._sleeping && r2._type != 1)) {
- c._shouldBeSkipped = true;
- break;
- }
- let aabb1 = s1._aabb;
- let aabb2 = s2._aabb;
- let proxy1 = s1._proxy;
- let proxy2 = s2._proxy;
- if(!(proxy1._aabbMinX < proxy2._aabbMaxX && proxy1._aabbMaxX > proxy2._aabbMinX && proxy1._aabbMinY < proxy2._aabbMaxY && proxy1._aabbMaxY > proxy2._aabbMinY && proxy1._aabbMinZ < proxy2._aabbMaxZ && proxy1._aabbMaxZ > proxy2._aabbMinZ) || !this.shouldCollide(s1,s2)) {
- let prev = c._prev;
- let next = c._next;
- if(prev != null) {
- prev._next = next;
- }
- if(next != null) {
- next._prev = prev;
- }
- if(c == this._contactList) {
- this._contactList = this._contactList._next;
- }
- if(c == this._contactListLast) {
- this._contactListLast = this._contactListLast._prev;
- }
- c._next = null;
- c._prev = null;
- if(c._touching) {
- let cc1 = c._s1._contactCallback;
- let cc2 = c._s2._contactCallback;
- if(cc1 == cc2) {
- cc2 = null;
- }
- if(cc1 != null) {
- cc1.endContact(c);
- }
- if(cc2 != null) {
- cc2.endContact(c);
- }
- }
- let prev1 = c._link1._prev;
- let next1 = c._link1._next;
- if(prev1 != null) {
- prev1._next = next1;
- }
- if(next1 != null) {
- next1._prev = prev1;
- }
- if(c._link1 == c._b1._contactLinkList) {
- c._b1._contactLinkList = c._b1._contactLinkList._next;
- }
- if(c._link1 == c._b1._contactLinkListLast) {
- c._b1._contactLinkListLast = c._b1._contactLinkListLast._prev;
- }
- c._link1._next = null;
- c._link1._prev = null;
- let prev2 = c._link2._prev;
- let next2 = c._link2._next;
- if(prev2 != null) {
- prev2._next = next2;
- }
- if(next2 != null) {
- next2._prev = prev2;
- }
- if(c._link2 == c._b2._contactLinkList) {
- c._b2._contactLinkList = c._b2._contactLinkList._next;
- }
- if(c._link2 == c._b2._contactLinkListLast) {
- c._b2._contactLinkListLast = c._b2._contactLinkListLast._prev;
- }
- c._link2._next = null;
- c._link2._prev = null;
- c._b1._numContactLinks--;
- c._b2._numContactLinks--;
- c._link1._other = null;
- c._link2._other = null;
- c._link1._contact = null;
- c._link2._contact = null;
- c._s1 = null;
- c._s2 = null;
- c._b1 = null;
- c._b2 = null;
- c._touching = false;
- c._cachedDetectorData._clear();
- c._manifold._clear();
- c._detector = null;
- let _this = c._contactConstraint;
- _this._s1 = null;
- _this._s2 = null;
- _this._b1 = null;
- _this._b2 = null;
- _this._tf1 = null;
- _this._tf2 = null;
- c._next = this._contactPool;
- this._contactPool = c;
- this._numContacts--;
- break;
- }
- c._shouldBeSkipped = !(aabb1._minX < aabb2._maxX && aabb1._maxX > aabb2._minX && aabb1._minY < aabb2._maxY && aabb1._maxY > aabb2._minY && aabb1._minZ < aabb2._maxZ && aabb1._maxZ > aabb2._minZ);
- break;
- }
- c = n;
- }
- }
- shouldCollide(s1,s2) {
- let r1 = s1._rigidBody;
- let r2 = s2._rigidBody;
- if(r1 == r2) {
- return false;
- }
- if(r1._type != 0 && r2._type != 0) {
- return false;
- }
- if((s1._collisionGroup & s2._collisionMask) == 0 || (s2._collisionGroup & s1._collisionMask) == 0) {
- return false;
- }
- let jl;
- let other;
- if(r1._numJointLinks < r2._numJointLinks) {
- jl = r1._jointLinkList;
- other = r2;
- } else {
- jl = r2._jointLinkList;
- other = r1;
- }
- while(jl != null) {
- if(jl._other == other && !jl._joint._allowCollision) {
- return false;
- }
- jl = jl._next;
- }
- return true;
- }
- _updateContacts() {
- this._broadPhase.collectPairs();
- this.createContacts();
- this.destroyOutdatedContacts();
- }
- _postSolve() {
- let c = this._contactList;
- while(c != null) {
- let n = c._next;
- if(c._touching) {
- c._postSolve();
- }
- c = n;
- }
- }
- getNumContacts() {
- return this._numContacts;
- }
- getContactList() {
- return this._contactList;
- }
- }
- oimo.dynamics.Island = class oimo_dynamics_Island {
- constructor() {
- this.rigidBodies = new Array(oimo.common.Setting.islandInitialRigidBodyArraySize);
- this.solvers = new Array(oimo.common.Setting.islandInitialConstraintArraySize);
- this.solversSi = new Array(oimo.common.Setting.islandInitialConstraintArraySize);
- this.solversNgs = new Array(oimo.common.Setting.islandInitialConstraintArraySize);
- this.numRigidBodies = 0;
- this.numSolvers = 0;
- this.numSolversSi = 0;
- this.numSolversNgs = 0;
- }
- _clear() {
- while(this.numRigidBodies > 0) this.rigidBodies[--this.numRigidBodies] = null;
- while(this.numSolvers > 0) this.solvers[--this.numSolvers] = null;
- while(this.numSolversSi > 0) this.solversSi[--this.numSolversSi] = null;
- while(this.numSolversNgs > 0) this.solversNgs[--this.numSolversNgs] = null;
- }
- _addRigidBody(rigidBody) {
- if(this.numRigidBodies == this.rigidBodies.length) {
- let newArray = new Array(this.numRigidBodies << 1);
- let _g = 0;
- let _g1 = this.numRigidBodies;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = this.rigidBodies[i];
- this.rigidBodies[i] = null;
- }
- this.rigidBodies = newArray;
- }
- rigidBody._addedToIsland = true;
- this.rigidBodies[this.numRigidBodies++] = rigidBody;
- }
- _addConstraintSolver(solver,positionCorrection) {
- if(this.numSolvers == this.solvers.length) {
- let newArray = new Array(this.numSolvers << 1);
- let _g = 0;
- let _g1 = this.numSolvers;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = this.solvers[i];
- this.solvers[i] = null;
- }
- this.solvers = newArray;
- }
- solver._addedToIsland = true;
- this.solvers[this.numSolvers++] = solver;
- if(positionCorrection == oimo.dynamics.constraint.PositionCorrectionAlgorithm.SPLIT_IMPULSE) {
- if(this.numSolversSi == this.solversSi.length) {
- let newArray = new Array(this.numSolversSi << 1);
- let _g = 0;
- let _g1 = this.numSolversSi;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = this.solversSi[i];
- this.solversSi[i] = null;
- }
- this.solversSi = newArray;
- }
- this.solversSi[this.numSolversSi++] = solver;
- }
- if(positionCorrection == oimo.dynamics.constraint.PositionCorrectionAlgorithm.NGS) {
- if(this.numSolversNgs == this.solversNgs.length) {
- let newArray = new Array(this.numSolversNgs << 1);
- let _g = 0;
- let _g1 = this.numSolversNgs;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = this.solversNgs[i];
- this.solversNgs[i] = null;
- }
- this.solversNgs = newArray;
- }
- this.solversNgs[this.numSolversNgs++] = solver;
- }
- }
- _stepSingleRigidBody(timeStep,rb) {
- let dt = timeStep.dt;
- let dst = rb._ptransform;
- let src = rb._transform;
- dst._positionX = src._positionX;
- dst._positionY = src._positionY;
- dst._positionZ = src._positionZ;
- dst._rotation00 = src._rotation00;
- dst._rotation01 = src._rotation01;
- dst._rotation02 = src._rotation02;
- dst._rotation10 = src._rotation10;
- dst._rotation11 = src._rotation11;
- dst._rotation12 = src._rotation12;
- dst._rotation20 = src._rotation20;
- dst._rotation21 = src._rotation21;
- dst._rotation22 = src._rotation22;
- rb._linearContactImpulseX = 0;
- rb._linearContactImpulseY = 0;
- rb._linearContactImpulseZ = 0;
- rb._angularContactImpulseX = 0;
- rb._angularContactImpulseY = 0;
- rb._angularContactImpulseZ = 0;
- if(rb._autoSleep && rb._velX * rb._velX + rb._velY * rb._velY + rb._velZ * rb._velZ < oimo.common.Setting.sleepingVelocityThreshold * oimo.common.Setting.sleepingVelocityThreshold && rb._angVelX * rb._angVelX + rb._angVelY * rb._angVelY + rb._angVelZ * rb._angVelZ < oimo.common.Setting.sleepingAngularVelocityThreshold * oimo.common.Setting.sleepingAngularVelocityThreshold) {
- rb._sleepTime += dt;
- if(rb._sleepTime > oimo.common.Setting.sleepingTimeThreshold) {
- rb._sleeping = true;
- rb._sleepTime = 0;
- }
- } else {
- rb._sleepTime = 0;
- }
- if(!rb._sleeping) {
- if(rb._type == 0) {
- let x = dt * rb._linearDamping;
- let x2 = x * x;
- let linScale = 1 / (1 + x + x2 * (0.5 + x * 0.16666666666666666 + x2 * 0.041666666666666664));
- let x1 = dt * rb._angularDamping;
- let x21 = x1 * x1;
- let angScale = 1 / (1 + x1 + x21 * (0.5 + x1 * 0.16666666666666666 + x21 * 0.041666666666666664));
- let linAccX;
- let linAccY;
- let linAccZ;
- let angAccX;
- let angAccY;
- let angAccZ;
- linAccX = this.gravityX * rb._gravityScale;
- linAccY = this.gravityY * rb._gravityScale;
- linAccZ = this.gravityZ * rb._gravityScale;
- linAccX += rb._forceX * rb._invMass;
- linAccY += rb._forceY * rb._invMass;
- linAccZ += rb._forceZ * rb._invMass;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = rb._invInertia00 * rb._torqueX + rb._invInertia01 * rb._torqueY + rb._invInertia02 * rb._torqueZ;
- __tmp__Y = rb._invInertia10 * rb._torqueX + rb._invInertia11 * rb._torqueY + rb._invInertia12 * rb._torqueZ;
- __tmp__Z = rb._invInertia20 * rb._torqueX + rb._invInertia21 * rb._torqueY + rb._invInertia22 * rb._torqueZ;
- angAccX = __tmp__X;
- angAccY = __tmp__Y;
- angAccZ = __tmp__Z;
- rb._velX += linAccX * dt;
- rb._velY += linAccY * dt;
- rb._velZ += linAccZ * dt;
- rb._velX *= linScale;
- rb._velY *= linScale;
- rb._velZ *= linScale;
- rb._angVelX += angAccX * dt;
- rb._angVelY += angAccY * dt;
- rb._angVelZ += angAccZ * dt;
- rb._angVelX *= angScale;
- rb._angVelY *= angScale;
- rb._angVelZ *= angScale;
- }
- rb._integrate(dt);
- let s = rb._shapeList;
- while(s != null) {
- let n = s._next;
- let tf1 = rb._ptransform;
- let tf2 = rb._transform;
- let dst = s._ptransform;
- let src1 = s._localTransform;
- let __tmp__00;
- let __tmp__01;
- let __tmp__02;
- let __tmp__10;
- let __tmp__11;
- let __tmp__12;
- let __tmp__20;
- let __tmp__21;
- let __tmp__22;
- __tmp__00 = tf1._rotation00 * src1._rotation00 + tf1._rotation01 * src1._rotation10 + tf1._rotation02 * src1._rotation20;
- __tmp__01 = tf1._rotation00 * src1._rotation01 + tf1._rotation01 * src1._rotation11 + tf1._rotation02 * src1._rotation21;
- __tmp__02 = tf1._rotation00 * src1._rotation02 + tf1._rotation01 * src1._rotation12 + tf1._rotation02 * src1._rotation22;
- __tmp__10 = tf1._rotation10 * src1._rotation00 + tf1._rotation11 * src1._rotation10 + tf1._rotation12 * src1._rotation20;
- __tmp__11 = tf1._rotation10 * src1._rotation01 + tf1._rotation11 * src1._rotation11 + tf1._rotation12 * src1._rotation21;
- __tmp__12 = tf1._rotation10 * src1._rotation02 + tf1._rotation11 * src1._rotation12 + tf1._rotation12 * src1._rotation22;
- __tmp__20 = tf1._rotation20 * src1._rotation00 + tf1._rotation21 * src1._rotation10 + tf1._rotation22 * src1._rotation20;
- __tmp__21 = tf1._rotation20 * src1._rotation01 + tf1._rotation21 * src1._rotation11 + tf1._rotation22 * src1._rotation21;
- __tmp__22 = tf1._rotation20 * src1._rotation02 + tf1._rotation21 * src1._rotation12 + tf1._rotation22 * src1._rotation22;
- dst._rotation00 = __tmp__00;
- dst._rotation01 = __tmp__01;
- dst._rotation02 = __tmp__02;
- dst._rotation10 = __tmp__10;
- dst._rotation11 = __tmp__11;
- dst._rotation12 = __tmp__12;
- dst._rotation20 = __tmp__20;
- dst._rotation21 = __tmp__21;
- dst._rotation22 = __tmp__22;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = tf1._rotation00 * src1._positionX + tf1._rotation01 * src1._positionY + tf1._rotation02 * src1._positionZ;
- __tmp__Y = tf1._rotation10 * src1._positionX + tf1._rotation11 * src1._positionY + tf1._rotation12 * src1._positionZ;
- __tmp__Z = tf1._rotation20 * src1._positionX + tf1._rotation21 * src1._positionY + tf1._rotation22 * src1._positionZ;
- dst._positionX = __tmp__X;
- dst._positionY = __tmp__Y;
- dst._positionZ = __tmp__Z;
- dst._positionX += tf1._positionX;
- dst._positionY += tf1._positionY;
- dst._positionZ += tf1._positionZ;
- let dst1 = s._transform;
- let src11 = s._localTransform;
- let __tmp__001;
- let __tmp__011;
- let __tmp__021;
- let __tmp__101;
- let __tmp__111;
- let __tmp__121;
- let __tmp__201;
- let __tmp__211;
- let __tmp__221;
- __tmp__001 = tf2._rotation00 * src11._rotation00 + tf2._rotation01 * src11._rotation10 + tf2._rotation02 * src11._rotation20;
- __tmp__011 = tf2._rotation00 * src11._rotation01 + tf2._rotation01 * src11._rotation11 + tf2._rotation02 * src11._rotation21;
- __tmp__021 = tf2._rotation00 * src11._rotation02 + tf2._rotation01 * src11._rotation12 + tf2._rotation02 * src11._rotation22;
- __tmp__101 = tf2._rotation10 * src11._rotation00 + tf2._rotation11 * src11._rotation10 + tf2._rotation12 * src11._rotation20;
- __tmp__111 = tf2._rotation10 * src11._rotation01 + tf2._rotation11 * src11._rotation11 + tf2._rotation12 * src11._rotation21;
- __tmp__121 = tf2._rotation10 * src11._rotation02 + tf2._rotation11 * src11._rotation12 + tf2._rotation12 * src11._rotation22;
- __tmp__201 = tf2._rotation20 * src11._rotation00 + tf2._rotation21 * src11._rotation10 + tf2._rotation22 * src11._rotation20;
- __tmp__211 = tf2._rotation20 * src11._rotation01 + tf2._rotation21 * src11._rotation11 + tf2._rotation22 * src11._rotation21;
- __tmp__221 = tf2._rotation20 * src11._rotation02 + tf2._rotation21 * src11._rotation12 + tf2._rotation22 * src11._rotation22;
- dst1._rotation00 = __tmp__001;
- dst1._rotation01 = __tmp__011;
- dst1._rotation02 = __tmp__021;
- dst1._rotation10 = __tmp__101;
- dst1._rotation11 = __tmp__111;
- dst1._rotation12 = __tmp__121;
- dst1._rotation20 = __tmp__201;
- dst1._rotation21 = __tmp__211;
- dst1._rotation22 = __tmp__221;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = tf2._rotation00 * src11._positionX + tf2._rotation01 * src11._positionY + tf2._rotation02 * src11._positionZ;
- __tmp__Y1 = tf2._rotation10 * src11._positionX + tf2._rotation11 * src11._positionY + tf2._rotation12 * src11._positionZ;
- __tmp__Z1 = tf2._rotation20 * src11._positionX + tf2._rotation21 * src11._positionY + tf2._rotation22 * src11._positionZ;
- dst1._positionX = __tmp__X1;
- dst1._positionY = __tmp__Y1;
- dst1._positionZ = __tmp__Z1;
- dst1._positionX += tf2._positionX;
- dst1._positionY += tf2._positionY;
- dst1._positionZ += tf2._positionZ;
- let minX;
- let minY;
- let minZ;
- let maxX;
- let maxY;
- let maxZ;
- s._geom._computeAabb(s._aabb,s._ptransform);
- minX = s._aabb._minX;
- minY = s._aabb._minY;
- minZ = s._aabb._minZ;
- maxX = s._aabb._maxX;
- maxY = s._aabb._maxY;
- maxZ = s._aabb._maxZ;
- s._geom._computeAabb(s._aabb,s._transform);
- s._aabb._minX = minX < s._aabb._minX ? minX : s._aabb._minX;
- s._aabb._minY = minY < s._aabb._minY ? minY : s._aabb._minY;
- s._aabb._minZ = minZ < s._aabb._minZ ? minZ : s._aabb._minZ;
- s._aabb._maxX = maxX > s._aabb._maxX ? maxX : s._aabb._maxX;
- s._aabb._maxY = maxY > s._aabb._maxY ? maxY : s._aabb._maxY;
- s._aabb._maxZ = maxZ > s._aabb._maxZ ? maxZ : s._aabb._maxZ;
- if(s._proxy != null) {
- let dX;
- let dY;
- let dZ;
- dX = s._transform._positionX - s._ptransform._positionX;
- dY = s._transform._positionY - s._ptransform._positionY;
- dZ = s._transform._positionZ - s._ptransform._positionZ;
- let v = s.displacement;
- v.x = dX;
- v.y = dY;
- v.z = dZ;
- s._rigidBody._world._broadPhase.moveProxy(s._proxy,s._aabb,s.displacement);
- }
- s = n;
- }
- }
- }
- _step(timeStep,numVelocityIterations,numPositionIterations) {
- let dt = timeStep.dt;
- let sleepIsland = true;
- let _g = 0;
- let _g1 = this.numRigidBodies;
- while(_g < _g1) {
- let rb = this.rigidBodies[_g++];
- let dst = rb._ptransform;
- let src = rb._transform;
- dst._positionX = src._positionX;
- dst._positionY = src._positionY;
- dst._positionZ = src._positionZ;
- dst._rotation00 = src._rotation00;
- dst._rotation01 = src._rotation01;
- dst._rotation02 = src._rotation02;
- dst._rotation10 = src._rotation10;
- dst._rotation11 = src._rotation11;
- dst._rotation12 = src._rotation12;
- dst._rotation20 = src._rotation20;
- dst._rotation21 = src._rotation21;
- dst._rotation22 = src._rotation22;
- rb._linearContactImpulseX = 0;
- rb._linearContactImpulseY = 0;
- rb._linearContactImpulseZ = 0;
- rb._angularContactImpulseX = 0;
- rb._angularContactImpulseY = 0;
- rb._angularContactImpulseZ = 0;
- rb._sleeping = false;
- if(rb._autoSleep && rb._velX * rb._velX + rb._velY * rb._velY + rb._velZ * rb._velZ < oimo.common.Setting.sleepingVelocityThreshold * oimo.common.Setting.sleepingVelocityThreshold && rb._angVelX * rb._angVelX + rb._angVelY * rb._angVelY + rb._angVelZ * rb._angVelZ < oimo.common.Setting.sleepingAngularVelocityThreshold * oimo.common.Setting.sleepingAngularVelocityThreshold) {
- rb._sleepTime += dt;
- } else {
- rb._sleepTime = 0;
- }
- if(rb._sleepTime < oimo.common.Setting.sleepingTimeThreshold) {
- sleepIsland = false;
- }
- if(rb._type == 0) {
- let x = dt * rb._linearDamping;
- let x2 = x * x;
- let linScale = 1 / (1 + x + x2 * (0.5 + x * 0.16666666666666666 + x2 * 0.041666666666666664));
- let x1 = dt * rb._angularDamping;
- let x21 = x1 * x1;
- let angScale = 1 / (1 + x1 + x21 * (0.5 + x1 * 0.16666666666666666 + x21 * 0.041666666666666664));
- let linAccX;
- let linAccY;
- let linAccZ;
- let angAccX;
- let angAccY;
- let angAccZ;
- linAccX = this.gravityX * rb._gravityScale;
- linAccY = this.gravityY * rb._gravityScale;
- linAccZ = this.gravityZ * rb._gravityScale;
- linAccX += rb._forceX * rb._invMass;
- linAccY += rb._forceY * rb._invMass;
- linAccZ += rb._forceZ * rb._invMass;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = rb._invInertia00 * rb._torqueX + rb._invInertia01 * rb._torqueY + rb._invInertia02 * rb._torqueZ;
- __tmp__Y = rb._invInertia10 * rb._torqueX + rb._invInertia11 * rb._torqueY + rb._invInertia12 * rb._torqueZ;
- __tmp__Z = rb._invInertia20 * rb._torqueX + rb._invInertia21 * rb._torqueY + rb._invInertia22 * rb._torqueZ;
- angAccX = __tmp__X;
- angAccY = __tmp__Y;
- angAccZ = __tmp__Z;
- rb._velX += linAccX * dt;
- rb._velY += linAccY * dt;
- rb._velZ += linAccZ * dt;
- rb._velX *= linScale;
- rb._velY *= linScale;
- rb._velZ *= linScale;
- rb._angVelX += angAccX * dt;
- rb._angVelY += angAccY * dt;
- rb._angVelZ += angAccZ * dt;
- rb._angVelX *= angScale;
- rb._angVelY *= angScale;
- rb._angVelZ *= angScale;
- }
- }
- if(sleepIsland) {
- let _g = 0;
- let _g1 = this.numRigidBodies;
- while(_g < _g1) {
- let rb = this.rigidBodies[_g++];
- rb._sleeping = true;
- rb._sleepTime = 0;
- }
- return;
- }
- let _g2 = 0;
- let _g3 = this.numSolvers;
- while(_g2 < _g3) this.solvers[_g2++].preSolveVelocity(timeStep);
- let _g4 = 0;
- let _g5 = this.numSolvers;
- while(_g4 < _g5) this.solvers[_g4++].warmStart(timeStep);
- let _g6 = 0;
- while(_g6 < numVelocityIterations) {
- ++_g6;
- let _g = 0;
- let _g1 = this.numSolvers;
- while(_g < _g1) this.solvers[_g++].solveVelocity();
- }
- let _g7 = 0;
- let _g8 = this.numSolvers;
- while(_g7 < _g8) this.solvers[_g7++].postSolveVelocity(timeStep);
- let _g9 = 0;
- let _g10 = this.numRigidBodies;
- while(_g9 < _g10) this.rigidBodies[_g9++]._integrate(dt);
- let _g11 = 0;
- let _g12 = this.numSolversSi;
- while(_g11 < _g12) this.solversSi[_g11++].preSolvePosition(timeStep);
- let _g13 = 0;
- while(_g13 < numPositionIterations) {
- ++_g13;
- let _g = 0;
- let _g1 = this.numSolversSi;
- while(_g < _g1) this.solversSi[_g++].solvePositionSplitImpulse();
- }
- let _g14 = 0;
- let _g15 = this.numRigidBodies;
- while(_g14 < _g15) this.rigidBodies[_g14++]._integratePseudoVelocity();
- let _g16 = 0;
- let _g17 = this.numSolversNgs;
- while(_g16 < _g17) this.solversNgs[_g16++].preSolvePosition(timeStep);
- let _g18 = 0;
- while(_g18 < numPositionIterations) {
- ++_g18;
- let _g = 0;
- let _g1 = this.numSolversNgs;
- while(_g < _g1) this.solversNgs[_g++].solvePositionNgs(timeStep);
- }
- let _g19 = 0;
- let _g20 = this.numSolvers;
- while(_g19 < _g20) this.solvers[_g19++].postSolve();
- let _g21 = 0;
- let _g22 = this.numRigidBodies;
- while(_g21 < _g22) {
- let rb = this.rigidBodies[_g21++];
- let s = rb._shapeList;
- while(s != null) {
- let n = s._next;
- let tf1 = rb._ptransform;
- let tf2 = rb._transform;
- let dst = s._ptransform;
- let src1 = s._localTransform;
- let __tmp__00;
- let __tmp__01;
- let __tmp__02;
- let __tmp__10;
- let __tmp__11;
- let __tmp__12;
- let __tmp__20;
- let __tmp__21;
- let __tmp__22;
- __tmp__00 = tf1._rotation00 * src1._rotation00 + tf1._rotation01 * src1._rotation10 + tf1._rotation02 * src1._rotation20;
- __tmp__01 = tf1._rotation00 * src1._rotation01 + tf1._rotation01 * src1._rotation11 + tf1._rotation02 * src1._rotation21;
- __tmp__02 = tf1._rotation00 * src1._rotation02 + tf1._rotation01 * src1._rotation12 + tf1._rotation02 * src1._rotation22;
- __tmp__10 = tf1._rotation10 * src1._rotation00 + tf1._rotation11 * src1._rotation10 + tf1._rotation12 * src1._rotation20;
- __tmp__11 = tf1._rotation10 * src1._rotation01 + tf1._rotation11 * src1._rotation11 + tf1._rotation12 * src1._rotation21;
- __tmp__12 = tf1._rotation10 * src1._rotation02 + tf1._rotation11 * src1._rotation12 + tf1._rotation12 * src1._rotation22;
- __tmp__20 = tf1._rotation20 * src1._rotation00 + tf1._rotation21 * src1._rotation10 + tf1._rotation22 * src1._rotation20;
- __tmp__21 = tf1._rotation20 * src1._rotation01 + tf1._rotation21 * src1._rotation11 + tf1._rotation22 * src1._rotation21;
- __tmp__22 = tf1._rotation20 * src1._rotation02 + tf1._rotation21 * src1._rotation12 + tf1._rotation22 * src1._rotation22;
- dst._rotation00 = __tmp__00;
- dst._rotation01 = __tmp__01;
- dst._rotation02 = __tmp__02;
- dst._rotation10 = __tmp__10;
- dst._rotation11 = __tmp__11;
- dst._rotation12 = __tmp__12;
- dst._rotation20 = __tmp__20;
- dst._rotation21 = __tmp__21;
- dst._rotation22 = __tmp__22;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = tf1._rotation00 * src1._positionX + tf1._rotation01 * src1._positionY + tf1._rotation02 * src1._positionZ;
- __tmp__Y = tf1._rotation10 * src1._positionX + tf1._rotation11 * src1._positionY + tf1._rotation12 * src1._positionZ;
- __tmp__Z = tf1._rotation20 * src1._positionX + tf1._rotation21 * src1._positionY + tf1._rotation22 * src1._positionZ;
- dst._positionX = __tmp__X;
- dst._positionY = __tmp__Y;
- dst._positionZ = __tmp__Z;
- dst._positionX += tf1._positionX;
- dst._positionY += tf1._positionY;
- dst._positionZ += tf1._positionZ;
- let dst1 = s._transform;
- let src11 = s._localTransform;
- let __tmp__001;
- let __tmp__011;
- let __tmp__021;
- let __tmp__101;
- let __tmp__111;
- let __tmp__121;
- let __tmp__201;
- let __tmp__211;
- let __tmp__221;
- __tmp__001 = tf2._rotation00 * src11._rotation00 + tf2._rotation01 * src11._rotation10 + tf2._rotation02 * src11._rotation20;
- __tmp__011 = tf2._rotation00 * src11._rotation01 + tf2._rotation01 * src11._rotation11 + tf2._rotation02 * src11._rotation21;
- __tmp__021 = tf2._rotation00 * src11._rotation02 + tf2._rotation01 * src11._rotation12 + tf2._rotation02 * src11._rotation22;
- __tmp__101 = tf2._rotation10 * src11._rotation00 + tf2._rotation11 * src11._rotation10 + tf2._rotation12 * src11._rotation20;
- __tmp__111 = tf2._rotation10 * src11._rotation01 + tf2._rotation11 * src11._rotation11 + tf2._rotation12 * src11._rotation21;
- __tmp__121 = tf2._rotation10 * src11._rotation02 + tf2._rotation11 * src11._rotation12 + tf2._rotation12 * src11._rotation22;
- __tmp__201 = tf2._rotation20 * src11._rotation00 + tf2._rotation21 * src11._rotation10 + tf2._rotation22 * src11._rotation20;
- __tmp__211 = tf2._rotation20 * src11._rotation01 + tf2._rotation21 * src11._rotation11 + tf2._rotation22 * src11._rotation21;
- __tmp__221 = tf2._rotation20 * src11._rotation02 + tf2._rotation21 * src11._rotation12 + tf2._rotation22 * src11._rotation22;
- dst1._rotation00 = __tmp__001;
- dst1._rotation01 = __tmp__011;
- dst1._rotation02 = __tmp__021;
- dst1._rotation10 = __tmp__101;
- dst1._rotation11 = __tmp__111;
- dst1._rotation12 = __tmp__121;
- dst1._rotation20 = __tmp__201;
- dst1._rotation21 = __tmp__211;
- dst1._rotation22 = __tmp__221;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = tf2._rotation00 * src11._positionX + tf2._rotation01 * src11._positionY + tf2._rotation02 * src11._positionZ;
- __tmp__Y1 = tf2._rotation10 * src11._positionX + tf2._rotation11 * src11._positionY + tf2._rotation12 * src11._positionZ;
- __tmp__Z1 = tf2._rotation20 * src11._positionX + tf2._rotation21 * src11._positionY + tf2._rotation22 * src11._positionZ;
- dst1._positionX = __tmp__X1;
- dst1._positionY = __tmp__Y1;
- dst1._positionZ = __tmp__Z1;
- dst1._positionX += tf2._positionX;
- dst1._positionY += tf2._positionY;
- dst1._positionZ += tf2._positionZ;
- let minX;
- let minY;
- let minZ;
- let maxX;
- let maxY;
- let maxZ;
- s._geom._computeAabb(s._aabb,s._ptransform);
- minX = s._aabb._minX;
- minY = s._aabb._minY;
- minZ = s._aabb._minZ;
- maxX = s._aabb._maxX;
- maxY = s._aabb._maxY;
- maxZ = s._aabb._maxZ;
- s._geom._computeAabb(s._aabb,s._transform);
- s._aabb._minX = minX < s._aabb._minX ? minX : s._aabb._minX;
- s._aabb._minY = minY < s._aabb._minY ? minY : s._aabb._minY;
- s._aabb._minZ = minZ < s._aabb._minZ ? minZ : s._aabb._minZ;
- s._aabb._maxX = maxX > s._aabb._maxX ? maxX : s._aabb._maxX;
- s._aabb._maxY = maxY > s._aabb._maxY ? maxY : s._aabb._maxY;
- s._aabb._maxZ = maxZ > s._aabb._maxZ ? maxZ : s._aabb._maxZ;
- if(s._proxy != null) {
- let dX;
- let dY;
- let dZ;
- dX = s._transform._positionX - s._ptransform._positionX;
- dY = s._transform._positionY - s._ptransform._positionY;
- dZ = s._transform._positionZ - s._ptransform._positionZ;
- let v = s.displacement;
- v.x = dX;
- v.y = dY;
- v.z = dZ;
- s._rigidBody._world._broadPhase.moveProxy(s._proxy,s._aabb,s.displacement);
- }
- s = n;
- }
- }
- }
- }
- oimo.dynamics.TimeStep = class oimo_dynamics_TimeStep {
- constructor() {
- this.dt = 0;
- this.invDt = 0;
- this.dtRatio = 1;
- }
- }
- oimo.dynamics.World = class oimo_dynamics_World {
- constructor(broadPhaseType,gravity) {
- if(broadPhaseType == null) {
- broadPhaseType = 2;
- }
- switch(broadPhaseType) {
- case 1:
- this._broadPhase = new oimo.collision.broadphase.bruteforce.BruteForceBroadPhase();
- break;
- case 2:
- this._broadPhase = new oimo.collision.broadphase.bvh.BvhBroadPhase();
- break;
- }
- this._contactManager = new oimo.dynamics.ContactManager(this._broadPhase);
- if(gravity == null) {
- gravity = new oimo.common.Vec3(0,-9.80665,0);
- }
- this._gravity = new oimo.common.Vec3(gravity.x,gravity.y,gravity.z);
- this._rigidBodyList = null;
- this._rigidBodyListLast = null;
- this._jointList = null;
- this._jointListLast = null;
- this._numRigidBodies = 0;
- this._numShapes = 0;
- this._numJoints = 0;
- this._numIslands = 0;
- this._numVelocityIterations = 10;
- this._numPositionIterations = 5;
- this._rayCastWrapper = new oimo.dynamics._World.RayCastWrapper();
- this._convexCastWrapper = new oimo.dynamics._World.ConvexCastWrapper();
- this._aabbTestWrapper = new oimo.dynamics._World.AabbTestWrapper();
- this._island = new oimo.dynamics.Island();
- this._solversInIslands = new Array(oimo.common.Setting.islandInitialConstraintArraySize);
- this._rigidBodyStack = new Array(oimo.common.Setting.islandInitialRigidBodyArraySize);
- this._timeStep = new oimo.dynamics.TimeStep();
- this._pool = new oimo.common.Pool();
- this._shapeIdCount = 0;
- }
- _updateContacts() {
- let st = Date.now() / 1000;
- this._contactManager._updateContacts();
- oimo.dynamics.common.Performance.broadPhaseCollisionTime = (Date.now() / 1000 - st) * 1000;
- let st1 = Date.now() / 1000;
- let c = this._contactManager._contactList;
- while(c != null) {
- let n = c._next;
- if(!c._shouldBeSkipped) {
- c._updateManifold();
- }
- c = n;
- }
- oimo.dynamics.common.Performance.narrowPhaseCollisionTime = (Date.now() / 1000 - st1) * 1000;
- }
- _solveIslands() {
- let st = Date.now() / 1000;
- if(oimo.common.Setting.disableSleeping) {
- let b = this._rigidBodyList;
- while(b != null) {
- b._sleeping = false;
- b._sleepTime = 0;
- b = b._next;
- }
- }
- if(this._rigidBodyStack.length < this._numRigidBodies) {
- let newStackSize = this._rigidBodyStack.length << 1;
- while(newStackSize < this._numRigidBodies) newStackSize <<= 1;
- this._rigidBodyStack = new Array(newStackSize);
- }
- this._numIslands = 0;
- let _this = this._island;
- let gravity = this._gravity;
- _this.gravityX = gravity.x;
- _this.gravityY = gravity.y;
- _this.gravityZ = gravity.z;
- let b = this._rigidBodyList;
- this._numSolversInIslands = 0;
- while(b != null) {
- let n = b._next;
- while(!(b._addedToIsland || b._sleeping || b._type == 1)) {
- if(b._numContactLinks == 0 && b._numJointLinks == 0) {
- this._island._stepSingleRigidBody(this._timeStep,b);
- this._numIslands++;
- break;
- }
- this.buildIsland(b);
- this._island._step(this._timeStep,this._numVelocityIterations,this._numPositionIterations);
- this._island._clear();
- this._numIslands++;
- break;
- }
- b = n;
- }
- this._contactManager._postSolve();
- b = this._rigidBodyList;
- while(b != null) {
- b._addedToIsland = false;
- b = b._next;
- }
- b = this._rigidBodyList;
- while(b != null) {
- b._forceX = 0;
- b._forceY = 0;
- b._forceZ = 0;
- b._torqueX = 0;
- b._torqueY = 0;
- b._torqueZ = 0;
- b = b._next;
- }
- while(this._numSolversInIslands > 0) {
- this._solversInIslands[--this._numSolversInIslands]._addedToIsland = false;
- this._solversInIslands[this._numSolversInIslands] = null;
- }
- oimo.dynamics.common.Performance.dynamicsTime = (Date.now() / 1000 - st) * 1000;
- }
- buildIsland(base) {
- let stackCount = 1;
- this._island._addRigidBody(base);
- this._rigidBodyStack[0] = base;
- while(stackCount > 0) {
- let rb = this._rigidBodyStack[--stackCount];
- this._rigidBodyStack[stackCount] = null;
- if(rb._type == 1) {
- continue;
- }
- let cl = rb._contactLinkList;
- while(cl != null) {
- let n = cl._next;
- let cc = cl._contact._contactConstraint;
- let ccs = cl._contact._contactConstraint._solver;
- if(cc.isTouching() && !ccs._addedToIsland) {
- if(this._solversInIslands.length == this._numSolversInIslands) {
- let newArray = new Array(this._numSolversInIslands << 1);
- let _g = 0;
- let _g1 = this._numSolversInIslands;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = this._solversInIslands[i];
- this._solversInIslands[i] = null;
- }
- this._solversInIslands = newArray;
- }
- this._solversInIslands[this._numSolversInIslands++] = ccs;
- this._island._addConstraintSolver(ccs,cc._positionCorrectionAlgorithm);
- let other = cl._other;
- if(!other._addedToIsland) {
- this._island._addRigidBody(other);
- this._rigidBodyStack[stackCount++] = other;
- }
- }
- cl = n;
- }
- let jl = rb._jointLinkList;
- while(jl != null) {
- let n = jl._next;
- let j = jl._joint;
- let js1 = j._solver;
- if(!js1._addedToIsland) {
- if(this._solversInIslands.length == this._numSolversInIslands) {
- let newArray = new Array(this._numSolversInIslands << 1);
- let _g = 0;
- let _g1 = this._numSolversInIslands;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = this._solversInIslands[i];
- this._solversInIslands[i] = null;
- }
- this._solversInIslands = newArray;
- }
- this._solversInIslands[this._numSolversInIslands++] = js1;
- this._island._addConstraintSolver(js1,j._positionCorrectionAlgorithm);
- let other = jl._other;
- if(!other._addedToIsland) {
- this._island._addRigidBody(other);
- this._rigidBodyStack[stackCount++] = other;
- }
- }
- jl = n;
- }
- }
- }
- _drawBvh(d,tree) {
- if(d.drawBvh) {
- this._drawBvhNode(d,tree._root,0,d.style.bvhNodeColor);
- }
- }
- _drawBvhNode(d,node,level,color) {
- if(node == null) {
- return;
- }
- if(level >= d.drawBvhMinLevel && level <= d.drawBvhMaxLevel) {
- let _this = this._pool;
- let min = _this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3];
- let _this1 = this._pool;
- let max = _this1.sizeVec3 == 0 ? new oimo.common.Vec3() : _this1.stackVec3[--_this1.sizeVec3];
- let v = min;
- v.x = node._aabbMinX;
- v.y = node._aabbMinY;
- v.z = node._aabbMinZ;
- let v1 = max;
- v1.x = node._aabbMaxX;
- v1.y = node._aabbMaxY;
- v1.z = node._aabbMaxZ;
- d.aabb(min,max,color);
- let _this2 = this._pool;
- if(min != null) {
- min.zero();
- if(_this2.sizeVec3 == _this2.stackVec3.length) {
- let newArray = new Array(_this2.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this2.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this2.stackVec3[i];
- _this2.stackVec3[i] = null;
- }
- _this2.stackVec3 = newArray;
- }
- _this2.stackVec3[_this2.sizeVec3++] = min;
- }
- let _this3 = this._pool;
- if(max != null) {
- max.zero();
- if(_this3.sizeVec3 == _this3.stackVec3.length) {
- let newArray = new Array(_this3.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this3.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this3.stackVec3[i];
- _this3.stackVec3[i] = null;
- }
- _this3.stackVec3 = newArray;
- }
- _this3.stackVec3[_this3.sizeVec3++] = max;
- }
- }
- this._drawBvhNode(d,node._children[0],level + 1,color);
- this._drawBvhNode(d,node._children[1],level + 1,color);
- }
- _drawRigidBodies(d) {
- let style = d.style;
- let r = this._rigidBodyList;
- while(r != null) {
- let n = r._next;
- if(d.drawBases) {
- let style = d.style;
- d.basis(r._transform,style.basisLength,style.basisColorX,style.basisColorY,style.basisColorZ);
- }
- let shapeColor = null;
- let isDynamic = r._type == 0;
- if(!isDynamic) {
- shapeColor = r._type == 2 ? style.kinematicShapeColor : style.staticShapeColor;
- }
- let s = r._shapeList;
- while(s != null) {
- let n = s._next;
- if(isDynamic) {
- if((s._id & 1) == 0) {
- shapeColor = r._sleeping ? style.sleepingShapeColor1 : r._sleepTime > oimo.common.Setting.sleepingTimeThreshold ? style.sleepyShapeColor1 : style.shapeColor1;
- } else {
- shapeColor = r._sleeping ? style.sleepingShapeColor2 : r._sleepTime > oimo.common.Setting.sleepingTimeThreshold ? style.sleepyShapeColor2 : style.shapeColor2;
- }
- }
- if(d.drawShapes) {
- let geom = s._geom;
- let tf = s._transform;
- switch(geom._type) {
- case 0:
- d.sphere(tf,geom._radius,shapeColor);
- break;
- case 1:
- let g = geom;
- let _this = this._pool;
- let hx = _this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3];
- let v = hx;
- v.x = g._halfExtentsX;
- v.y = g._halfExtentsY;
- v.z = g._halfExtentsZ;
- d.box(tf,hx,shapeColor);
- let _this1 = this._pool;
- if(hx != null) {
- hx.zero();
- if(_this1.sizeVec3 == _this1.stackVec3.length) {
- let newArray = new Array(_this1.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this1.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this1.stackVec3[i];
- _this1.stackVec3[i] = null;
- }
- _this1.stackVec3 = newArray;
- }
- _this1.stackVec3[_this1.sizeVec3++] = hx;
- }
- break;
- case 2:
- let g1 = geom;
- d.cylinder(tf,g1._radius,g1._halfHeight,shapeColor);
- break;
- case 3:
- let g2 = geom;
- d.cone(tf,g2._radius,g2._halfHeight,shapeColor);
- break;
- case 4:
- let g3 = geom;
- d.capsule(tf,g3._radius,g3._halfHeight,shapeColor);
- break;
- case 5:
- let g4 = geom;
- let n = g4._numVertices;
- let _this2 = this._pool;
- let v1 = _this2.sizeVec3 == 0 ? new oimo.common.Vec3() : _this2.stackVec3[--_this2.sizeVec3];
- let _this3 = this._pool;
- let v2 = _this3.sizeVec3 == 0 ? new oimo.common.Vec3() : _this3.stackVec3[--_this3.sizeVec3];
- let _this4 = this._pool;
- let v3 = _this4.sizeVec3 == 0 ? new oimo.common.Vec3() : _this4.stackVec3[--_this4.sizeVec3];
- let _this5 = this._pool;
- let v12 = _this5.sizeVec3 == 0 ? new oimo.common.Vec3() : _this5.stackVec3[--_this5.sizeVec3];
- let _this6 = this._pool;
- let v13 = _this6.sizeVec3 == 0 ? new oimo.common.Vec3() : _this6.stackVec3[--_this6.sizeVec3];
- let _this7 = this._pool;
- let normal = _this7.sizeVec3 == 0 ? new oimo.common.Vec3() : _this7.stackVec3[--_this7.sizeVec3];
- let _this8 = this._pool;
- let m = _this8.sizeMat3 == 0 ? new oimo.common.Mat3() : _this8.stackMat3[--_this8.sizeMat3];
- let _this9 = this._pool;
- let o = _this9.sizeVec3 == 0 ? new oimo.common.Vec3() : _this9.stackVec3[--_this9.sizeVec3];
- let m1 = m;
- m1.e00 = tf._rotation00;
- m1.e01 = tf._rotation01;
- m1.e02 = tf._rotation02;
- m1.e10 = tf._rotation10;
- m1.e11 = tf._rotation11;
- m1.e12 = tf._rotation12;
- m1.e20 = tf._rotation20;
- m1.e21 = tf._rotation21;
- m1.e22 = tf._rotation22;
- let v4 = o;
- v4.x = tf._positionX;
- v4.y = tf._positionY;
- v4.z = tf._positionZ;
- let _g = 0;
- while(_g < n) {
- let i = _g++;
- let _this = g4._tmpVertices[i];
- let v = g4._vertices[i];
- _this.x = v.x;
- _this.y = v.y;
- _this.z = v.z;
- let y = _this.x * m.e10 + _this.y * m.e11 + _this.z * m.e12;
- let z = _this.x * m.e20 + _this.y * m.e21 + _this.z * m.e22;
- _this.x = _this.x * m.e00 + _this.y * m.e01 + _this.z * m.e02;
- _this.y = y;
- _this.z = z;
- _this.x += o.x;
- _this.y += o.y;
- _this.z += o.z;
- }
- if(n > 30) {
- let _g = 0;
- while(_g < n) {
- let i = _g++;
- let v = g4._tmpVertices[i];
- v1.x = v.x;
- v1.y = v.y;
- v1.z = v.z;
- let v3 = g4._tmpVertices[(i + 1) % n];
- v2.x = v3.x;
- v2.y = v3.y;
- v2.z = v3.z;
- d.line(v1,v2,shapeColor);
- }
- } else if(this._debugDraw.wireframe || n > 10) {
- let _g = 0;
- while(_g < n) {
- let i = _g++;
- let v = g4._tmpVertices[i];
- v1.x = v.x;
- v1.y = v.y;
- v1.z = v.z;
- let _g1 = 0;
- while(_g1 < i) {
- let v = g4._tmpVertices[_g1++];
- v2.x = v.x;
- v2.y = v.y;
- v2.z = v.z;
- d.line(v1,v2,shapeColor);
- }
- }
- } else {
- let _g = 0;
- while(_g < n) {
- let i = _g++;
- let v = g4._tmpVertices[i];
- v1.x = v.x;
- v1.y = v.y;
- v1.z = v.z;
- let _g1 = 0;
- while(_g1 < i) {
- let j = _g1++;
- let v = g4._tmpVertices[j];
- v2.x = v.x;
- v2.y = v.y;
- v2.z = v.z;
- let _g = 0;
- while(_g < j) {
- let v = g4._tmpVertices[_g++];
- v3.x = v.x;
- v3.y = v.y;
- v3.z = v.z;
- v12.x = v2.x;
- v12.y = v2.y;
- v12.z = v2.z;
- let _this = v12;
- _this.x -= v1.x;
- _this.y -= v1.y;
- _this.z -= v1.z;
- v13.x = v3.x;
- v13.y = v3.y;
- v13.z = v3.z;
- let _this1 = v13;
- _this1.x -= v1.x;
- _this1.y -= v1.y;
- _this1.z -= v1.z;
- normal.x = v12.x;
- normal.y = v12.y;
- normal.z = v12.z;
- let _this2 = normal;
- let y = _this2.z * v13.x - _this2.x * v13.z;
- let z = _this2.x * v13.y - _this2.y * v13.x;
- _this2.x = _this2.y * v13.z - _this2.z * v13.y;
- _this2.y = y;
- _this2.z = z;
- let invLen = Math.sqrt(_this2.x * _this2.x + _this2.y * _this2.y + _this2.z * _this2.z);
- if(invLen > 0) {
- invLen = 1 / invLen;
- }
- _this2.x *= invLen;
- _this2.y *= invLen;
- _this2.z *= invLen;
- d.triangle(v1,v2,v3,normal,normal,normal,shapeColor);
- normal.x = -normal.x;
- normal.y = -normal.y;
- normal.z = -normal.z;
- d.triangle(v1,v3,v2,normal,normal,normal,shapeColor);
- }
- }
- }
- }
- let _this10 = this._pool;
- if(v1 != null) {
- v1.zero();
- if(_this10.sizeVec3 == _this10.stackVec3.length) {
- let newArray = new Array(_this10.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this10.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this10.stackVec3[i];
- _this10.stackVec3[i] = null;
- }
- _this10.stackVec3 = newArray;
- }
- _this10.stackVec3[_this10.sizeVec3++] = v1;
- }
- let _this11 = this._pool;
- if(v2 != null) {
- v2.zero();
- if(_this11.sizeVec3 == _this11.stackVec3.length) {
- let newArray = new Array(_this11.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this11.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this11.stackVec3[i];
- _this11.stackVec3[i] = null;
- }
- _this11.stackVec3 = newArray;
- }
- _this11.stackVec3[_this11.sizeVec3++] = v2;
- }
- let _this12 = this._pool;
- if(v3 != null) {
- v3.zero();
- if(_this12.sizeVec3 == _this12.stackVec3.length) {
- let newArray = new Array(_this12.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this12.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this12.stackVec3[i];
- _this12.stackVec3[i] = null;
- }
- _this12.stackVec3 = newArray;
- }
- _this12.stackVec3[_this12.sizeVec3++] = v3;
- }
- let _this13 = this._pool;
- if(v12 != null) {
- v12.zero();
- if(_this13.sizeVec3 == _this13.stackVec3.length) {
- let newArray = new Array(_this13.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this13.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this13.stackVec3[i];
- _this13.stackVec3[i] = null;
- }
- _this13.stackVec3 = newArray;
- }
- _this13.stackVec3[_this13.sizeVec3++] = v12;
- }
- let _this14 = this._pool;
- if(v13 != null) {
- v13.zero();
- if(_this14.sizeVec3 == _this14.stackVec3.length) {
- let newArray = new Array(_this14.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this14.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this14.stackVec3[i];
- _this14.stackVec3[i] = null;
- }
- _this14.stackVec3 = newArray;
- }
- _this14.stackVec3[_this14.sizeVec3++] = v13;
- }
- let _this15 = this._pool;
- if(normal != null) {
- normal.zero();
- if(_this15.sizeVec3 == _this15.stackVec3.length) {
- let newArray = new Array(_this15.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this15.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this15.stackVec3[i];
- _this15.stackVec3[i] = null;
- }
- _this15.stackVec3 = newArray;
- }
- _this15.stackVec3[_this15.sizeVec3++] = normal;
- }
- let _this16 = this._pool;
- if(m != null) {
- m.e00 = 1;
- m.e01 = 0;
- m.e02 = 0;
- m.e10 = 0;
- m.e11 = 1;
- m.e12 = 0;
- m.e20 = 0;
- m.e21 = 0;
- m.e22 = 1;
- if(_this16.sizeMat3 == _this16.stackMat3.length) {
- let newArray = new Array(_this16.sizeMat3 << 1);
- let _g = 0;
- let _g1 = _this16.sizeMat3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this16.stackMat3[i];
- _this16.stackMat3[i] = null;
- }
- _this16.stackMat3 = newArray;
- }
- _this16.stackMat3[_this16.sizeMat3++] = m;
- }
- let _this17 = this._pool;
- if(o != null) {
- o.zero();
- if(_this17.sizeVec3 == _this17.stackVec3.length) {
- let newArray = new Array(_this17.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this17.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this17.stackVec3[i];
- _this17.stackVec3[i] = null;
- }
- _this17.stackVec3 = newArray;
- }
- _this17.stackVec3[_this17.sizeVec3++] = o;
- }
- break;
- }
- }
- if(d.drawAabbs) {
- let aabb = s._aabb;
- let color = style.aabbColor;
- let _this = this._pool;
- let min = _this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3];
- let _this1 = this._pool;
- let max = _this1.sizeVec3 == 0 ? new oimo.common.Vec3() : _this1.stackVec3[--_this1.sizeVec3];
- let v = min;
- v.x = aabb._minX;
- v.y = aabb._minY;
- v.z = aabb._minZ;
- let v1 = max;
- v1.x = aabb._maxX;
- v1.y = aabb._maxY;
- v1.z = aabb._maxZ;
- d.aabb(min,max,color);
- let _this2 = this._pool;
- if(min != null) {
- min.zero();
- if(_this2.sizeVec3 == _this2.stackVec3.length) {
- let newArray = new Array(_this2.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this2.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this2.stackVec3[i];
- _this2.stackVec3[i] = null;
- }
- _this2.stackVec3 = newArray;
- }
- _this2.stackVec3[_this2.sizeVec3++] = min;
- }
- let _this3 = this._pool;
- if(max != null) {
- max.zero();
- if(_this3.sizeVec3 == _this3.stackVec3.length) {
- let newArray = new Array(_this3.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this3.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this3.stackVec3[i];
- _this3.stackVec3[i] = null;
- }
- _this3.stackVec3 = newArray;
- }
- _this3.stackVec3[_this3.sizeVec3++] = max;
- }
- }
- s = n;
- }
- r = n;
- }
- }
- _drawConstraints(d) {
- let style = d.style;
- if(d.drawPairs || d.drawContacts) {
- let c = this._contactManager._contactList;
- while(c != null) {
- let n = c._next;
- if(d.drawPairs) {
- let color = style.pairColor;
- let _this = this._pool;
- let v1 = _this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3];
- let _this1 = this._pool;
- let v2 = _this1.sizeVec3 == 0 ? new oimo.common.Vec3() : _this1.stackVec3[--_this1.sizeVec3];
- let v = v1;
- v.x = c._s1._transform._positionX;
- v.y = c._s1._transform._positionY;
- v.z = c._s1._transform._positionZ;
- let v3 = v2;
- v3.x = c._s2._transform._positionX;
- v3.y = c._s2._transform._positionY;
- v3.z = c._s2._transform._positionZ;
- d.line(v1,v2,color);
- let _this2 = this._pool;
- if(v1 != null) {
- v1.zero();
- if(_this2.sizeVec3 == _this2.stackVec3.length) {
- let newArray = new Array(_this2.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this2.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this2.stackVec3[i];
- _this2.stackVec3[i] = null;
- }
- _this2.stackVec3 = newArray;
- }
- _this2.stackVec3[_this2.sizeVec3++] = v1;
- }
- let _this3 = this._pool;
- if(v2 != null) {
- v2.zero();
- if(_this3.sizeVec3 == _this3.stackVec3.length) {
- let newArray = new Array(_this3.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this3.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this3.stackVec3[i];
- _this3.stackVec3[i] = null;
- }
- _this3.stackVec3 = newArray;
- }
- _this3.stackVec3[_this3.sizeVec3++] = v2;
- }
- }
- if(d.drawContacts) {
- let cc = c._contactConstraint;
- let ps = c._contactConstraint._manifold._points;
- let _g = 0;
- let _g1 = c._contactConstraint._manifold._numPoints;
- while(_g < _g1) {
- let p = ps[_g++];
- let style = d.style;
- let _this = this._pool;
- let pos1 = _this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3];
- let _this1 = this._pool;
- let pos2 = _this1.sizeVec3 == 0 ? new oimo.common.Vec3() : _this1.stackVec3[--_this1.sizeVec3];
- let _this2 = this._pool;
- let normal = _this2.sizeVec3 == 0 ? new oimo.common.Vec3() : _this2.stackVec3[--_this2.sizeVec3];
- let _this3 = this._pool;
- let tangent = _this3.sizeVec3 == 0 ? new oimo.common.Vec3() : _this3.stackVec3[--_this3.sizeVec3];
- let _this4 = this._pool;
- let binormal = _this4.sizeVec3 == 0 ? new oimo.common.Vec3() : _this4.stackVec3[--_this4.sizeVec3];
- let v = pos1;
- v.x = p._pos1X;
- v.y = p._pos1Y;
- v.z = p._pos1Z;
- let v1 = pos2;
- v1.x = p._pos2X;
- v1.y = p._pos2Y;
- v1.z = p._pos2Z;
- let v2 = normal;
- v2.x = cc._manifold._normalX;
- v2.y = cc._manifold._normalY;
- v2.z = cc._manifold._normalZ;
- let v3 = tangent;
- v3.x = cc._manifold._tangentX;
- v3.y = cc._manifold._tangentY;
- v3.z = cc._manifold._tangentZ;
- let v4 = binormal;
- v4.x = cc._manifold._binormalX;
- v4.y = cc._manifold._binormalY;
- v4.z = cc._manifold._binormalZ;
- if(p._disabled) {
- d.point(pos1,style.disabledContactColor);
- d.point(pos2,style.disabledContactColor);
- d.line(pos1,pos2,style.disabledContactColor);
- } else if(p._warmStarted) {
- let color;
- switch(p._id & 3) {
- case 0:
- color = style.contactColor;
- break;
- case 1:
- color = style.contactColor2;
- break;
- case 2:
- color = style.contactColor3;
- break;
- default:
- color = style.contactColor4;
- }
- d.point(pos1,color);
- d.point(pos2,color);
- d.line(pos1,pos2,style.contactColor);
- } else {
- d.point(pos1,style.newContactColor);
- d.point(pos2,style.newContactColor);
- d.line(pos1,pos2,style.newContactColor);
- }
- pos2.x = pos1.x;
- pos2.y = pos1.y;
- pos2.z = pos1.z;
- let _this5 = pos2;
- let s = style.contactNormalLength;
- _this5.x += normal.x * s;
- _this5.y += normal.y * s;
- _this5.z += normal.z * s;
- d.line(pos1,pos2,style.contactNormalColor);
- if(d.drawContactBases) {
- pos2.x = pos1.x;
- pos2.y = pos1.y;
- pos2.z = pos1.z;
- let _this = pos2;
- let s = style.contactTangentLength;
- _this.x += tangent.x * s;
- _this.y += tangent.y * s;
- _this.z += tangent.z * s;
- d.line(pos1,pos2,style.contactTangentColor);
- pos2.x = pos1.x;
- pos2.y = pos1.y;
- pos2.z = pos1.z;
- let _this1 = pos2;
- let s1 = style.contactBinormalLength;
- _this1.x += binormal.x * s1;
- _this1.y += binormal.y * s1;
- _this1.z += binormal.z * s1;
- d.line(pos1,pos2,style.contactBinormalColor);
- }
- let _this6 = this._pool;
- if(pos1 != null) {
- pos1.zero();
- if(_this6.sizeVec3 == _this6.stackVec3.length) {
- let newArray = new Array(_this6.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this6.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this6.stackVec3[i];
- _this6.stackVec3[i] = null;
- }
- _this6.stackVec3 = newArray;
- }
- _this6.stackVec3[_this6.sizeVec3++] = pos1;
- }
- let _this7 = this._pool;
- if(pos2 != null) {
- pos2.zero();
- if(_this7.sizeVec3 == _this7.stackVec3.length) {
- let newArray = new Array(_this7.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this7.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this7.stackVec3[i];
- _this7.stackVec3[i] = null;
- }
- _this7.stackVec3 = newArray;
- }
- _this7.stackVec3[_this7.sizeVec3++] = pos2;
- }
- let _this8 = this._pool;
- if(normal != null) {
- normal.zero();
- if(_this8.sizeVec3 == _this8.stackVec3.length) {
- let newArray = new Array(_this8.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this8.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this8.stackVec3[i];
- _this8.stackVec3[i] = null;
- }
- _this8.stackVec3 = newArray;
- }
- _this8.stackVec3[_this8.sizeVec3++] = normal;
- }
- let _this9 = this._pool;
- if(tangent != null) {
- tangent.zero();
- if(_this9.sizeVec3 == _this9.stackVec3.length) {
- let newArray = new Array(_this9.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this9.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this9.stackVec3[i];
- _this9.stackVec3[i] = null;
- }
- _this9.stackVec3 = newArray;
- }
- _this9.stackVec3[_this9.sizeVec3++] = tangent;
- }
- let _this10 = this._pool;
- if(binormal != null) {
- binormal.zero();
- if(_this10.sizeVec3 == _this10.stackVec3.length) {
- let newArray = new Array(_this10.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this10.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this10.stackVec3[i];
- _this10.stackVec3[i] = null;
- }
- _this10.stackVec3 = newArray;
- }
- _this10.stackVec3[_this10.sizeVec3++] = binormal;
- }
- }
- }
- c = n;
- }
- }
- if(d.drawJoints) {
- let j = this._jointList;
- while(j != null) {
- let n = j._next;
- let _this = this._pool;
- let p1 = _this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3];
- let _this1 = this._pool;
- let p2 = _this1.sizeVec3 == 0 ? new oimo.common.Vec3() : _this1.stackVec3[--_this1.sizeVec3];
- let v = p1;
- v.x = j._b1._transform._positionX;
- v.y = j._b1._transform._positionY;
- v.z = j._b1._transform._positionZ;
- let v1 = p2;
- v1.x = j._b2._transform._positionX;
- v1.y = j._b2._transform._positionY;
- v1.z = j._b2._transform._positionZ;
- let _this2 = this._pool;
- let anchor1 = _this2.sizeVec3 == 0 ? new oimo.common.Vec3() : _this2.stackVec3[--_this2.sizeVec3];
- let _this3 = this._pool;
- let anchor2 = _this3.sizeVec3 == 0 ? new oimo.common.Vec3() : _this3.stackVec3[--_this3.sizeVec3];
- let _this4 = this._pool;
- let basisX1 = _this4.sizeVec3 == 0 ? new oimo.common.Vec3() : _this4.stackVec3[--_this4.sizeVec3];
- let _this5 = this._pool;
- let basisY1 = _this5.sizeVec3 == 0 ? new oimo.common.Vec3() : _this5.stackVec3[--_this5.sizeVec3];
- let _this6 = this._pool;
- let basisZ1 = _this6.sizeVec3 == 0 ? new oimo.common.Vec3() : _this6.stackVec3[--_this6.sizeVec3];
- let _this7 = this._pool;
- let basisX2 = _this7.sizeVec3 == 0 ? new oimo.common.Vec3() : _this7.stackVec3[--_this7.sizeVec3];
- let _this8 = this._pool;
- let basisY2 = _this8.sizeVec3 == 0 ? new oimo.common.Vec3() : _this8.stackVec3[--_this8.sizeVec3];
- let _this9 = this._pool;
- let basisZ2 = _this9.sizeVec3 == 0 ? new oimo.common.Vec3() : _this9.stackVec3[--_this9.sizeVec3];
- let v2 = anchor1;
- v2.x = j._anchor1X;
- v2.y = j._anchor1Y;
- v2.z = j._anchor1Z;
- let v3 = anchor2;
- v3.x = j._anchor2X;
- v3.y = j._anchor2Y;
- v3.z = j._anchor2Z;
- let v4 = basisX1;
- v4.x = j._basisX1X;
- v4.y = j._basisX1Y;
- v4.z = j._basisX1Z;
- let v5 = basisY1;
- v5.x = j._basisY1X;
- v5.y = j._basisY1Y;
- v5.z = j._basisY1Z;
- let v6 = basisZ1;
- v6.x = j._basisZ1X;
- v6.y = j._basisZ1Y;
- v6.z = j._basisZ1Z;
- let v7 = basisX2;
- v7.x = j._basisX2X;
- v7.y = j._basisX2Y;
- v7.z = j._basisX2Z;
- let v8 = basisY2;
- v8.x = j._basisY2X;
- v8.y = j._basisY2Y;
- v8.z = j._basisY2Z;
- let v9 = basisZ2;
- v9.x = j._basisZ2X;
- v9.y = j._basisZ2Y;
- v9.z = j._basisZ2Z;
- d.line(p1,anchor1,d.style.jointLineColor);
- d.line(p2,anchor2,d.style.jointLineColor);
- if(d.drawJointLimits) {
- switch(j._type) {
- case 0:
- break;
- case 1:
- let lm = j._lm;
- this._drawRotationalLimit(d,anchor1,basisY1,basisZ1,basisY2,d.style.jointRotationalConstraintRadius,lm.lowerLimit,lm.upperLimit,d.style.jointLineColor);
- break;
- case 2:
- let j1 = j;
- let color = d.style.jointLineColor;
- let rlm = j1._rotLm;
- let tlm = j1._translLm;
- this._drawRotationalLimit(d,anchor2,basisY1,basisZ1,basisY2,d.style.jointRotationalConstraintRadius,rlm.lowerLimit,rlm.upperLimit,color);
- this._drawTranslationalLimit(d,anchor1,basisX1,tlm.lowerLimit,tlm.upperLimit,color);
- break;
- case 3:
- let lm1 = j._lm;
- this._drawTranslationalLimit(d,anchor1,basisX1,lm1.lowerLimit,lm1.upperLimit,d.style.jointLineColor);
- break;
- case 4:
- let j2 = j;
- let radius = d.style.jointRotationalConstraintRadius;
- let color1 = d.style.jointLineColor;
- let lm11 = j2._lm1;
- let lm2 = j2._lm2;
- this._drawRotationalLimit(d,anchor1,basisY1,basisZ1,basisY1,radius,j2._angleX - lm11.upperLimit,j2._angleX - lm11.lowerLimit,color1);
- this._drawRotationalLimit(d,anchor2,basisX2,basisY2,basisX2,radius,lm2.lowerLimit - j2._angleZ,lm2.upperLimit - j2._angleZ,color1);
- break;
- case 5:
- let j3 = j;
- let radius1 = d.style.jointRotationalConstraintRadius;
- let color2 = d.style.jointLineColor;
- let lm3 = j3._twistLm;
- this._drawRotationalLimit(d,anchor2,basisY2,basisZ2,basisY2,radius1,lm3.lowerLimit - j3._twistAngle,lm3.upperLimit - j3._twistAngle,color2);
- this._drawEllipseOnSphere(d,anchor1,basisX1,basisY1,basisZ1,j3._maxSwingAngle1,j3._maxSwingAngle2,radius1,color2);
- let _this10 = this._pool;
- let _this11 = _this10.sizeVec3 == 0 ? new oimo.common.Vec3() : _this10.stackVec3[--_this10.sizeVec3];
- _this11.x = anchor2.x;
- _this11.y = anchor2.y;
- _this11.z = anchor2.z;
- let _this12 = _this11;
- _this12.x += basisX2.x * radius1;
- _this12.y += basisX2.y * radius1;
- _this12.z += basisX2.z * radius1;
- d.line(anchor2,_this12,color2);
- let _this13 = this._pool;
- if(_this12 != null) {
- _this12.zero();
- if(_this13.sizeVec3 == _this13.stackVec3.length) {
- let newArray = new Array(_this13.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this13.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this13.stackVec3[i];
- _this13.stackVec3[i] = null;
- }
- _this13.stackVec3 = newArray;
- }
- _this13.stackVec3[_this13.sizeVec3++] = _this12;
- }
- break;
- case 6:
- let j4 = j;
- let radius2 = d.style.jointRotationalConstraintRadius;
- let color3 = d.style.jointLineColor;
- let rxlm = j4._rotLms[0];
- let rylm = j4._rotLms[1];
- let rzlm = j4._rotLms[2];
- this._drawTranslationalLimit3D(d,anchor1,basisX1,basisY1,basisZ1,j4._translLms[0],j4._translLms[1],j4._translLms[2],color3);
- let _this14 = this._pool;
- let rotYAxis = _this14.sizeVec3 == 0 ? new oimo.common.Vec3() : _this14.stackVec3[--_this14.sizeVec3];
- let v10 = rotYAxis;
- v10.x = j4._axisYX;
- v10.y = j4._axisYY;
- v10.z = j4._axisYZ;
- let _this15 = this._pool;
- let _this16 = _this15.sizeVec3 == 0 ? new oimo.common.Vec3() : _this15.stackVec3[--_this15.sizeVec3];
- _this16.x = basisX1.x;
- _this16.y = basisX1.y;
- _this16.z = basisX1.z;
- let rotYBasisX = _this16;
- let _this17 = this._pool;
- let _this18 = _this17.sizeVec3 == 0 ? new oimo.common.Vec3() : _this17.stackVec3[--_this17.sizeVec3];
- _this18.x = basisX1.x;
- _this18.y = basisX1.y;
- _this18.z = basisX1.z;
- let _this19 = _this18;
- let y = _this19.z * rotYAxis.x - _this19.x * rotYAxis.z;
- let z = _this19.x * rotYAxis.y - _this19.y * rotYAxis.x;
- _this19.x = _this19.y * rotYAxis.z - _this19.z * rotYAxis.y;
- _this19.y = y;
- _this19.z = z;
- this._drawRotationalLimit(d,anchor2,basisY1,basisZ1,basisY1,radius2,j4._angleX - rxlm.upperLimit,j4._angleX - rxlm.lowerLimit,color3);
- this._drawRotationalLimit(d,anchor2,rotYBasisX,_this19,rotYBasisX,radius2,rylm.lowerLimit - j4._angleY,rylm.upperLimit - j4._angleY,color3);
- this._drawRotationalLimit(d,anchor2,basisX2,basisY2,basisX2,radius2,rzlm.lowerLimit - j4._angleZ,rzlm.upperLimit - j4._angleZ,color3);
- break;
- }
- }
- d.line(anchor1,anchor2,d.style.jointErrorColor);
- let _this20 = this._pool;
- if(p1 != null) {
- p1.zero();
- if(_this20.sizeVec3 == _this20.stackVec3.length) {
- let newArray = new Array(_this20.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this20.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this20.stackVec3[i];
- _this20.stackVec3[i] = null;
- }
- _this20.stackVec3 = newArray;
- }
- _this20.stackVec3[_this20.sizeVec3++] = p1;
- }
- let _this21 = this._pool;
- if(p2 != null) {
- p2.zero();
- if(_this21.sizeVec3 == _this21.stackVec3.length) {
- let newArray = new Array(_this21.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this21.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this21.stackVec3[i];
- _this21.stackVec3[i] = null;
- }
- _this21.stackVec3 = newArray;
- }
- _this21.stackVec3[_this21.sizeVec3++] = p2;
- }
- let _this22 = this._pool;
- if(anchor1 != null) {
- anchor1.zero();
- if(_this22.sizeVec3 == _this22.stackVec3.length) {
- let newArray = new Array(_this22.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this22.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this22.stackVec3[i];
- _this22.stackVec3[i] = null;
- }
- _this22.stackVec3 = newArray;
- }
- _this22.stackVec3[_this22.sizeVec3++] = anchor1;
- }
- let _this23 = this._pool;
- if(anchor2 != null) {
- anchor2.zero();
- if(_this23.sizeVec3 == _this23.stackVec3.length) {
- let newArray = new Array(_this23.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this23.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this23.stackVec3[i];
- _this23.stackVec3[i] = null;
- }
- _this23.stackVec3 = newArray;
- }
- _this23.stackVec3[_this23.sizeVec3++] = anchor2;
- }
- let _this24 = this._pool;
- if(basisX1 != null) {
- basisX1.zero();
- if(_this24.sizeVec3 == _this24.stackVec3.length) {
- let newArray = new Array(_this24.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this24.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this24.stackVec3[i];
- _this24.stackVec3[i] = null;
- }
- _this24.stackVec3 = newArray;
- }
- _this24.stackVec3[_this24.sizeVec3++] = basisX1;
- }
- let _this25 = this._pool;
- if(basisY1 != null) {
- basisY1.zero();
- if(_this25.sizeVec3 == _this25.stackVec3.length) {
- let newArray = new Array(_this25.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this25.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this25.stackVec3[i];
- _this25.stackVec3[i] = null;
- }
- _this25.stackVec3 = newArray;
- }
- _this25.stackVec3[_this25.sizeVec3++] = basisY1;
- }
- let _this26 = this._pool;
- if(basisZ1 != null) {
- basisZ1.zero();
- if(_this26.sizeVec3 == _this26.stackVec3.length) {
- let newArray = new Array(_this26.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this26.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this26.stackVec3[i];
- _this26.stackVec3[i] = null;
- }
- _this26.stackVec3 = newArray;
- }
- _this26.stackVec3[_this26.sizeVec3++] = basisZ1;
- }
- let _this27 = this._pool;
- if(basisX2 != null) {
- basisX2.zero();
- if(_this27.sizeVec3 == _this27.stackVec3.length) {
- let newArray = new Array(_this27.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this27.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this27.stackVec3[i];
- _this27.stackVec3[i] = null;
- }
- _this27.stackVec3 = newArray;
- }
- _this27.stackVec3[_this27.sizeVec3++] = basisX2;
- }
- let _this28 = this._pool;
- if(basisY2 != null) {
- basisY2.zero();
- if(_this28.sizeVec3 == _this28.stackVec3.length) {
- let newArray = new Array(_this28.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this28.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this28.stackVec3[i];
- _this28.stackVec3[i] = null;
- }
- _this28.stackVec3 = newArray;
- }
- _this28.stackVec3[_this28.sizeVec3++] = basisY2;
- }
- let _this29 = this._pool;
- if(basisZ2 != null) {
- basisZ2.zero();
- if(_this29.sizeVec3 == _this29.stackVec3.length) {
- let newArray = new Array(_this29.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this29.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this29.stackVec3[i];
- _this29.stackVec3[i] = null;
- }
- _this29.stackVec3 = newArray;
- }
- _this29.stackVec3[_this29.sizeVec3++] = basisZ2;
- }
- j = n;
- }
- }
- }
- _drawRotationalLimit(d,center,ex,ey,needle,radius,min,max,color) {
- if(min != max) {
- let _this = this._pool;
- let _this1 = _this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3];
- _this1.x = center.x;
- _this1.y = center.y;
- _this1.z = center.z;
- let _this2 = _this1;
- _this2.x += needle.x * radius;
- _this2.y += needle.y * radius;
- _this2.z += needle.z * radius;
- d.line(center,_this2,color);
- let _this3 = this._pool;
- if(_this2 != null) {
- _this2.zero();
- if(_this3.sizeVec3 == _this3.stackVec3.length) {
- let newArray = new Array(_this3.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this3.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this3.stackVec3[i];
- _this3.stackVec3[i] = null;
- }
- _this3.stackVec3 = newArray;
- }
- _this3.stackVec3[_this3.sizeVec3++] = _this2;
- }
- if(min > max) {
- d.ellipse(center,ex,ey,radius,radius,color);
- } else {
- d.arc(center,ex,ey,radius,radius,min,max,true,color);
- }
- }
- }
- _drawTranslationalLimit(d,center,ex,min,max,color) {
- if(min < max) {
- let _this = this._pool;
- let _this1 = _this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3];
- _this1.x = center.x;
- _this1.y = center.y;
- _this1.z = center.z;
- let _this2 = _this1;
- _this2.x += ex.x * min;
- _this2.y += ex.y * min;
- _this2.z += ex.z * min;
- let _this3 = this._pool;
- let _this4 = _this3.sizeVec3 == 0 ? new oimo.common.Vec3() : _this3.stackVec3[--_this3.sizeVec3];
- _this4.x = center.x;
- _this4.y = center.y;
- _this4.z = center.z;
- let _this5 = _this4;
- _this5.x += ex.x * max;
- _this5.y += ex.y * max;
- _this5.z += ex.z * max;
- d.line(_this2,_this5,color);
- let _this6 = this._pool;
- if(_this2 != null) {
- _this2.zero();
- if(_this6.sizeVec3 == _this6.stackVec3.length) {
- let newArray = new Array(_this6.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this6.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this6.stackVec3[i];
- _this6.stackVec3[i] = null;
- }
- _this6.stackVec3 = newArray;
- }
- _this6.stackVec3[_this6.sizeVec3++] = _this2;
- }
- let _this7 = this._pool;
- if(_this5 != null) {
- _this5.zero();
- if(_this7.sizeVec3 == _this7.stackVec3.length) {
- let newArray = new Array(_this7.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this7.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this7.stackVec3[i];
- _this7.stackVec3[i] = null;
- }
- _this7.stackVec3 = newArray;
- }
- _this7.stackVec3[_this7.sizeVec3++] = _this5;
- }
- }
- }
- _drawTranslationalLimit3D(d,center,ex,ey,ez,xlm,ylm,zlm,color) {
- let minx = xlm.lowerLimit;
- let maxx = xlm.upperLimit;
- let miny = ylm.lowerLimit;
- let maxy = ylm.upperLimit;
- let minz = zlm.lowerLimit;
- let maxz = zlm.upperLimit;
- let _this = this._pool;
- if(_this.sizeVec3 == 0) {
- new oimo.common.Vec3();
- } else {
- --_this.sizeVec3;
- }
- let _this1 = this._pool;
- if(_this1.sizeVec3 == 0) {
- new oimo.common.Vec3();
- } else {
- --_this1.sizeVec3;
- }
- let _this2 = this._pool;
- let _this3 = _this2.sizeVec3 == 0 ? new oimo.common.Vec3() : _this2.stackVec3[--_this2.sizeVec3];
- _this3.x = center.x;
- _this3.y = center.y;
- _this3.z = center.z;
- let _this4 = _this3;
- _this4.x += ex.x * minx;
- _this4.y += ex.y * minx;
- _this4.z += ex.z * minx;
- _this4.x += ey.x * miny;
- _this4.y += ey.y * miny;
- _this4.z += ey.z * miny;
- _this4.x += ez.x * minz;
- _this4.y += ez.y * minz;
- _this4.z += ez.z * minz;
- let _this5 = this._pool;
- let _this6 = _this5.sizeVec3 == 0 ? new oimo.common.Vec3() : _this5.stackVec3[--_this5.sizeVec3];
- _this6.x = center.x;
- _this6.y = center.y;
- _this6.z = center.z;
- let _this7 = _this6;
- _this7.x += ex.x * minx;
- _this7.y += ex.y * minx;
- _this7.z += ex.z * minx;
- _this7.x += ey.x * miny;
- _this7.y += ey.y * miny;
- _this7.z += ey.z * miny;
- _this7.x += ez.x * maxz;
- _this7.y += ez.y * maxz;
- _this7.z += ez.z * maxz;
- let _this8 = this._pool;
- let _this9 = _this8.sizeVec3 == 0 ? new oimo.common.Vec3() : _this8.stackVec3[--_this8.sizeVec3];
- _this9.x = center.x;
- _this9.y = center.y;
- _this9.z = center.z;
- let _this10 = _this9;
- _this10.x += ex.x * minx;
- _this10.y += ex.y * minx;
- _this10.z += ex.z * minx;
- _this10.x += ey.x * maxy;
- _this10.y += ey.y * maxy;
- _this10.z += ey.z * maxy;
- _this10.x += ez.x * minz;
- _this10.y += ez.y * minz;
- _this10.z += ez.z * minz;
- let _this11 = this._pool;
- let _this12 = _this11.sizeVec3 == 0 ? new oimo.common.Vec3() : _this11.stackVec3[--_this11.sizeVec3];
- _this12.x = center.x;
- _this12.y = center.y;
- _this12.z = center.z;
- let _this13 = _this12;
- _this13.x += ex.x * minx;
- _this13.y += ex.y * minx;
- _this13.z += ex.z * minx;
- _this13.x += ey.x * maxy;
- _this13.y += ey.y * maxy;
- _this13.z += ey.z * maxy;
- _this13.x += ez.x * maxz;
- _this13.y += ez.y * maxz;
- _this13.z += ez.z * maxz;
- let _this14 = this._pool;
- let _this15 = _this14.sizeVec3 == 0 ? new oimo.common.Vec3() : _this14.stackVec3[--_this14.sizeVec3];
- _this15.x = center.x;
- _this15.y = center.y;
- _this15.z = center.z;
- let _this16 = _this15;
- _this16.x += ex.x * maxx;
- _this16.y += ex.y * maxx;
- _this16.z += ex.z * maxx;
- _this16.x += ey.x * miny;
- _this16.y += ey.y * miny;
- _this16.z += ey.z * miny;
- _this16.x += ez.x * minz;
- _this16.y += ez.y * minz;
- _this16.z += ez.z * minz;
- let _this17 = this._pool;
- let _this18 = _this17.sizeVec3 == 0 ? new oimo.common.Vec3() : _this17.stackVec3[--_this17.sizeVec3];
- _this18.x = center.x;
- _this18.y = center.y;
- _this18.z = center.z;
- let _this19 = _this18;
- _this19.x += ex.x * maxx;
- _this19.y += ex.y * maxx;
- _this19.z += ex.z * maxx;
- _this19.x += ey.x * miny;
- _this19.y += ey.y * miny;
- _this19.z += ey.z * miny;
- _this19.x += ez.x * maxz;
- _this19.y += ez.y * maxz;
- _this19.z += ez.z * maxz;
- let _this20 = this._pool;
- let _this21 = _this20.sizeVec3 == 0 ? new oimo.common.Vec3() : _this20.stackVec3[--_this20.sizeVec3];
- _this21.x = center.x;
- _this21.y = center.y;
- _this21.z = center.z;
- let _this22 = _this21;
- _this22.x += ex.x * maxx;
- _this22.y += ex.y * maxx;
- _this22.z += ex.z * maxx;
- _this22.x += ey.x * maxy;
- _this22.y += ey.y * maxy;
- _this22.z += ey.z * maxy;
- _this22.x += ez.x * minz;
- _this22.y += ez.y * minz;
- _this22.z += ez.z * minz;
- let _this23 = this._pool;
- let _this24 = _this23.sizeVec3 == 0 ? new oimo.common.Vec3() : _this23.stackVec3[--_this23.sizeVec3];
- _this24.x = center.x;
- _this24.y = center.y;
- _this24.z = center.z;
- let _this25 = _this24;
- _this25.x += ex.x * maxx;
- _this25.y += ex.y * maxx;
- _this25.z += ex.z * maxx;
- _this25.x += ey.x * maxy;
- _this25.y += ey.y * maxy;
- _this25.z += ey.z * maxy;
- _this25.x += ez.x * maxz;
- _this25.y += ez.y * maxz;
- _this25.z += ez.z * maxz;
- d.line(_this4,_this16,color);
- d.line(_this10,_this22,color);
- d.line(_this7,_this19,color);
- d.line(_this13,_this25,color);
- d.line(_this4,_this10,color);
- d.line(_this16,_this22,color);
- d.line(_this7,_this13,color);
- d.line(_this19,_this25,color);
- d.line(_this4,_this7,color);
- d.line(_this16,_this19,color);
- d.line(_this10,_this13,color);
- d.line(_this22,_this25,color);
- let _this26 = this._pool;
- if(_this4 != null) {
- _this4.zero();
- if(_this26.sizeVec3 == _this26.stackVec3.length) {
- let newArray = new Array(_this26.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this26.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this26.stackVec3[i];
- _this26.stackVec3[i] = null;
- }
- _this26.stackVec3 = newArray;
- }
- _this26.stackVec3[_this26.sizeVec3++] = _this4;
- }
- let _this27 = this._pool;
- if(_this7 != null) {
- _this7.zero();
- if(_this27.sizeVec3 == _this27.stackVec3.length) {
- let newArray = new Array(_this27.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this27.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this27.stackVec3[i];
- _this27.stackVec3[i] = null;
- }
- _this27.stackVec3 = newArray;
- }
- _this27.stackVec3[_this27.sizeVec3++] = _this7;
- }
- let _this28 = this._pool;
- if(_this10 != null) {
- _this10.zero();
- if(_this28.sizeVec3 == _this28.stackVec3.length) {
- let newArray = new Array(_this28.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this28.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this28.stackVec3[i];
- _this28.stackVec3[i] = null;
- }
- _this28.stackVec3 = newArray;
- }
- _this28.stackVec3[_this28.sizeVec3++] = _this10;
- }
- let _this29 = this._pool;
- if(_this13 != null) {
- _this13.zero();
- if(_this29.sizeVec3 == _this29.stackVec3.length) {
- let newArray = new Array(_this29.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this29.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this29.stackVec3[i];
- _this29.stackVec3[i] = null;
- }
- _this29.stackVec3 = newArray;
- }
- _this29.stackVec3[_this29.sizeVec3++] = _this13;
- }
- let _this30 = this._pool;
- if(_this16 != null) {
- _this16.zero();
- if(_this30.sizeVec3 == _this30.stackVec3.length) {
- let newArray = new Array(_this30.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this30.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this30.stackVec3[i];
- _this30.stackVec3[i] = null;
- }
- _this30.stackVec3 = newArray;
- }
- _this30.stackVec3[_this30.sizeVec3++] = _this16;
- }
- let _this31 = this._pool;
- if(_this19 != null) {
- _this19.zero();
- if(_this31.sizeVec3 == _this31.stackVec3.length) {
- let newArray = new Array(_this31.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this31.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this31.stackVec3[i];
- _this31.stackVec3[i] = null;
- }
- _this31.stackVec3 = newArray;
- }
- _this31.stackVec3[_this31.sizeVec3++] = _this19;
- }
- let _this32 = this._pool;
- if(_this22 != null) {
- _this22.zero();
- if(_this32.sizeVec3 == _this32.stackVec3.length) {
- let newArray = new Array(_this32.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this32.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this32.stackVec3[i];
- _this32.stackVec3[i] = null;
- }
- _this32.stackVec3 = newArray;
- }
- _this32.stackVec3[_this32.sizeVec3++] = _this22;
- }
- let _this33 = this._pool;
- if(_this25 != null) {
- _this25.zero();
- if(_this33.sizeVec3 == _this33.stackVec3.length) {
- let newArray = new Array(_this33.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this33.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this33.stackVec3[i];
- _this33.stackVec3[i] = null;
- }
- _this33.stackVec3 = newArray;
- }
- _this33.stackVec3[_this33.sizeVec3++] = _this25;
- }
- }
- _drawEllipseOnSphere(d,center,normal,x,y,radiansX,radiansY,radius,color) {
- let theta = 0;
- let _this = this._pool;
- let rotVec = _this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3];
- let _this1 = this._pool;
- let rotQ = _this1.sizeQuat == 0 ? new oimo.common.Quat() : _this1.stackQuat[--_this1.sizeQuat];
- let _this2 = this._pool;
- let rotM = _this2.sizeMat3 == 0 ? new oimo.common.Mat3() : _this2.stackMat3[--_this2.sizeMat3];
- let _this3 = this._pool;
- let prevV = _this3.sizeVec3 == 0 ? new oimo.common.Vec3() : _this3.stackVec3[--_this3.sizeVec3];
- let _g = 0;
- while(_g < 17) {
- let i = _g++;
- let rx = Math.cos(theta) * radiansX;
- let ry = Math.sin(theta) * radiansY;
- let halfRotAng = Math.sqrt(rx * rx + ry * ry);
- let rotSin = Math.sin(halfRotAng * 0.5);
- let rotCos = Math.cos(halfRotAng * 0.5);
- let _this = rotVec.zero();
- _this.x += x.x * rx;
- _this.y += x.y * rx;
- _this.z += x.z * rx;
- _this.x += y.x * ry;
- _this.y += y.y * ry;
- _this.z += y.z * ry;
- let s = 1 / halfRotAng * rotSin;
- rotVec.x *= s;
- rotVec.y *= s;
- rotVec.z *= s;
- rotQ.x = rotVec.x;
- rotQ.y = rotVec.y;
- rotQ.z = rotVec.z;
- rotQ.w = rotCos;
- let x1 = rotQ.x;
- let y1 = rotQ.y;
- let z = rotQ.z;
- let w = rotQ.w;
- let x2 = 2 * x1;
- let y2 = 2 * y1;
- let z2 = 2 * z;
- let xx = x1 * x2;
- let yy = y1 * y2;
- let zz = z * z2;
- let xy = x1 * y2;
- let yz = y1 * z2;
- let xz = x1 * z2;
- let wx = w * x2;
- let wy = w * y2;
- let wz = w * z2;
- rotM.e00 = 1 - yy - zz;
- rotM.e01 = xy - wz;
- rotM.e02 = xz + wy;
- rotM.e10 = xy + wz;
- rotM.e11 = 1 - xx - zz;
- rotM.e12 = yz - wx;
- rotM.e20 = xz - wy;
- rotM.e21 = yz + wx;
- rotM.e22 = 1 - xx - yy;
- let _this1 = this._pool;
- let _this2 = _this1.sizeVec3 == 0 ? new oimo.common.Vec3() : _this1.stackVec3[--_this1.sizeVec3];
- _this2.x += normal.x * radius;
- _this2.y += normal.y * radius;
- _this2.z += normal.z * radius;
- let v = _this2;
- let y3 = v.x * rotM.e10 + v.y * rotM.e11 + v.z * rotM.e12;
- let z1 = v.x * rotM.e20 + v.y * rotM.e21 + v.z * rotM.e22;
- v.x = v.x * rotM.e00 + v.y * rotM.e01 + v.z * rotM.e02;
- v.y = y3;
- v.z = z1;
- v.x += center.x;
- v.y += center.y;
- v.z += center.z;
- if(i >= 1) {
- d.line(prevV,v,color);
- }
- let _this3 = this._pool;
- if(prevV != null) {
- prevV.zero();
- if(_this3.sizeVec3 == _this3.stackVec3.length) {
- let newArray = new Array(_this3.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this3.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this3.stackVec3[i];
- _this3.stackVec3[i] = null;
- }
- _this3.stackVec3 = newArray;
- }
- _this3.stackVec3[_this3.sizeVec3++] = prevV;
- }
- prevV = v;
- theta += 0.39269908169872375;
- }
- let _this4 = this._pool;
- if(rotVec != null) {
- rotVec.zero();
- if(_this4.sizeVec3 == _this4.stackVec3.length) {
- let newArray = new Array(_this4.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this4.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this4.stackVec3[i];
- _this4.stackVec3[i] = null;
- }
- _this4.stackVec3 = newArray;
- }
- _this4.stackVec3[_this4.sizeVec3++] = rotVec;
- }
- let _this5 = this._pool;
- if(rotQ != null) {
- rotQ.x = 0;
- rotQ.y = 0;
- rotQ.z = 0;
- rotQ.w = 1;
- if(_this5.sizeQuat == _this5.stackQuat.length) {
- let newArray = new Array(_this5.sizeQuat << 1);
- let _g = 0;
- let _g1 = _this5.sizeQuat;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this5.stackQuat[i];
- _this5.stackQuat[i] = null;
- }
- _this5.stackQuat = newArray;
- }
- _this5.stackQuat[_this5.sizeQuat++] = rotQ;
- }
- let _this6 = this._pool;
- if(rotM != null) {
- rotM.e00 = 1;
- rotM.e01 = 0;
- rotM.e02 = 0;
- rotM.e10 = 0;
- rotM.e11 = 1;
- rotM.e12 = 0;
- rotM.e20 = 0;
- rotM.e21 = 0;
- rotM.e22 = 1;
- if(_this6.sizeMat3 == _this6.stackMat3.length) {
- let newArray = new Array(_this6.sizeMat3 << 1);
- let _g = 0;
- let _g1 = _this6.sizeMat3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this6.stackMat3[i];
- _this6.stackMat3[i] = null;
- }
- _this6.stackMat3 = newArray;
- }
- _this6.stackMat3[_this6.sizeMat3++] = rotM;
- }
- let _this7 = this._pool;
- if(prevV != null) {
- prevV.zero();
- if(_this7.sizeVec3 == _this7.stackVec3.length) {
- let newArray = new Array(_this7.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this7.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this7.stackVec3[i];
- _this7.stackVec3[i] = null;
- }
- _this7.stackVec3 = newArray;
- }
- _this7.stackVec3[_this7.sizeVec3++] = prevV;
- }
- }
- step(timeStep) {
- if(this._timeStep.dt > 0) {
- this._timeStep.dtRatio = timeStep / this._timeStep.dt;
- }
- this._timeStep.dt = timeStep;
- this._timeStep.invDt = 1 / timeStep;
- let st = Date.now() / 1000;
- this._updateContacts();
- this._solveIslands();
- oimo.dynamics.common.Performance.totalTime = (Date.now() / 1000 - st) * 1000;
- }
- addRigidBody(rigidBody) {
- if(rigidBody._world != null) {
- throw new Error("A rigid body cannot belong to multiple worlds.");
- }
- if(this._rigidBodyList == null) {
- this._rigidBodyList = rigidBody;
- this._rigidBodyListLast = rigidBody;
- } else {
- this._rigidBodyListLast._next = rigidBody;
- rigidBody._prev = this._rigidBodyListLast;
- this._rigidBodyListLast = rigidBody;
- }
- rigidBody._world = this;
- let s = rigidBody._shapeList;
- while(s != null) {
- let n = s._next;
- s._proxy = this._broadPhase.createProxy(s,s._aabb);
- s._id = this._shapeIdCount++;
- this._numShapes++;
- s = n;
- }
- this._numRigidBodies++;
- }
- removeRigidBody(rigidBody) {
- if(rigidBody._world != this) {
- throw new Error("The rigid body doesn't belong to the world.");
- }
- let prev = rigidBody._prev;
- let next = rigidBody._next;
- if(prev != null) {
- prev._next = next;
- }
- if(next != null) {
- next._prev = prev;
- }
- if(rigidBody == this._rigidBodyList) {
- this._rigidBodyList = this._rigidBodyList._next;
- }
- if(rigidBody == this._rigidBodyListLast) {
- this._rigidBodyListLast = this._rigidBodyListLast._prev;
- }
- rigidBody._next = null;
- rigidBody._prev = null;
- rigidBody._world = null;
- let s = rigidBody._shapeList;
- while(s != null) {
- let n = s._next;
- this._broadPhase.destroyProxy(s._proxy);
- s._proxy = null;
- s._id = -1;
- let cl = s._rigidBody._contactLinkList;
- while(cl != null) {
- let n = cl._next;
- let c = cl._contact;
- if(c._s1 == s || c._s2 == s) {
- let _this = cl._other;
- _this._sleeping = false;
- _this._sleepTime = 0;
- let _this1 = this._contactManager;
- let prev = c._prev;
- let next = c._next;
- if(prev != null) {
- prev._next = next;
- }
- if(next != null) {
- next._prev = prev;
- }
- if(c == _this1._contactList) {
- _this1._contactList = _this1._contactList._next;
- }
- if(c == _this1._contactListLast) {
- _this1._contactListLast = _this1._contactListLast._prev;
- }
- c._next = null;
- c._prev = null;
- if(c._touching) {
- let cc1 = c._s1._contactCallback;
- let cc2 = c._s2._contactCallback;
- if(cc1 == cc2) {
- cc2 = null;
- }
- if(cc1 != null) {
- cc1.endContact(c);
- }
- if(cc2 != null) {
- cc2.endContact(c);
- }
- }
- let prev1 = c._link1._prev;
- let next1 = c._link1._next;
- if(prev1 != null) {
- prev1._next = next1;
- }
- if(next1 != null) {
- next1._prev = prev1;
- }
- if(c._link1 == c._b1._contactLinkList) {
- c._b1._contactLinkList = c._b1._contactLinkList._next;
- }
- if(c._link1 == c._b1._contactLinkListLast) {
- c._b1._contactLinkListLast = c._b1._contactLinkListLast._prev;
- }
- c._link1._next = null;
- c._link1._prev = null;
- let prev2 = c._link2._prev;
- let next2 = c._link2._next;
- if(prev2 != null) {
- prev2._next = next2;
- }
- if(next2 != null) {
- next2._prev = prev2;
- }
- if(c._link2 == c._b2._contactLinkList) {
- c._b2._contactLinkList = c._b2._contactLinkList._next;
- }
- if(c._link2 == c._b2._contactLinkListLast) {
- c._b2._contactLinkListLast = c._b2._contactLinkListLast._prev;
- }
- c._link2._next = null;
- c._link2._prev = null;
- c._b1._numContactLinks--;
- c._b2._numContactLinks--;
- c._link1._other = null;
- c._link2._other = null;
- c._link1._contact = null;
- c._link2._contact = null;
- c._s1 = null;
- c._s2 = null;
- c._b1 = null;
- c._b2 = null;
- c._touching = false;
- c._cachedDetectorData._clear();
- c._manifold._clear();
- c._detector = null;
- let _this2 = c._contactConstraint;
- _this2._s1 = null;
- _this2._s2 = null;
- _this2._b1 = null;
- _this2._b2 = null;
- _this2._tf1 = null;
- _this2._tf2 = null;
- c._next = _this1._contactPool;
- _this1._contactPool = c;
- _this1._numContacts--;
- }
- cl = n;
- }
- this._numShapes--;
- s = n;
- }
- this._numRigidBodies--;
- }
- addJoint(joint) {
- if(joint._world != null) {
- throw new Error("A joint cannot belong to multiple worlds.");
- }
- if(this._jointList == null) {
- this._jointList = joint;
- this._jointListLast = joint;
- } else {
- this._jointListLast._next = joint;
- joint._prev = this._jointListLast;
- this._jointListLast = joint;
- }
- joint._world = this;
- joint._link1._other = joint._b2;
- joint._link2._other = joint._b1;
- if(joint._b1._jointLinkList == null) {
- joint._b1._jointLinkList = joint._link1;
- joint._b1._jointLinkListLast = joint._link1;
- } else {
- joint._b1._jointLinkListLast._next = joint._link1;
- joint._link1._prev = joint._b1._jointLinkListLast;
- joint._b1._jointLinkListLast = joint._link1;
- }
- if(joint._b2._jointLinkList == null) {
- joint._b2._jointLinkList = joint._link2;
- joint._b2._jointLinkListLast = joint._link2;
- } else {
- joint._b2._jointLinkListLast._next = joint._link2;
- joint._link2._prev = joint._b2._jointLinkListLast;
- joint._b2._jointLinkListLast = joint._link2;
- }
- joint._b1._numJointLinks++;
- joint._b2._numJointLinks++;
- let _this = joint._b1;
- _this._sleeping = false;
- _this._sleepTime = 0;
- let _this1 = joint._b2;
- _this1._sleeping = false;
- _this1._sleepTime = 0;
- joint._syncAnchors();
- this._numJoints++;
- }
- removeJoint(joint) {
- if(joint._world != this) {
- throw new Error("The joint doesn't belong to the world.");
- }
- let prev = joint._prev;
- let next = joint._next;
- if(prev != null) {
- prev._next = next;
- }
- if(next != null) {
- next._prev = prev;
- }
- if(joint == this._jointList) {
- this._jointList = this._jointList._next;
- }
- if(joint == this._jointListLast) {
- this._jointListLast = this._jointListLast._prev;
- }
- joint._next = null;
- joint._prev = null;
- joint._world = null;
- let prev1 = joint._link1._prev;
- let next1 = joint._link1._next;
- if(prev1 != null) {
- prev1._next = next1;
- }
- if(next1 != null) {
- next1._prev = prev1;
- }
- if(joint._link1 == joint._b1._jointLinkList) {
- joint._b1._jointLinkList = joint._b1._jointLinkList._next;
- }
- if(joint._link1 == joint._b1._jointLinkListLast) {
- joint._b1._jointLinkListLast = joint._b1._jointLinkListLast._prev;
- }
- joint._link1._next = null;
- joint._link1._prev = null;
- let prev2 = joint._link2._prev;
- let next2 = joint._link2._next;
- if(prev2 != null) {
- prev2._next = next2;
- }
- if(next2 != null) {
- next2._prev = prev2;
- }
- if(joint._link2 == joint._b2._jointLinkList) {
- joint._b2._jointLinkList = joint._b2._jointLinkList._next;
- }
- if(joint._link2 == joint._b2._jointLinkListLast) {
- joint._b2._jointLinkListLast = joint._b2._jointLinkListLast._prev;
- }
- joint._link2._next = null;
- joint._link2._prev = null;
- joint._link1._other = null;
- joint._link2._other = null;
- joint._b1._numJointLinks--;
- joint._b2._numJointLinks--;
- let _this = joint._b1;
- _this._sleeping = false;
- _this._sleepTime = 0;
- let _this1 = joint._b2;
- _this1._sleeping = false;
- _this1._sleepTime = 0;
- this._numJoints--;
- }
- setDebugDraw(debugDraw) {
- this._debugDraw = debugDraw;
- }
- getDebugDraw() {
- return this._debugDraw;
- }
- debugDraw() {
- if(this._debugDraw != null) {
- if(this._broadPhase._type == 2) {
- this._drawBvh(this._debugDraw,this._broadPhase._tree);
- }
- this._drawRigidBodies(this._debugDraw);
- this._drawConstraints(this._debugDraw);
- }
- }
- rayCast(begin,end,callback) {
- let _this = this._rayCastWrapper.begin;
- _this.x = begin.x;
- _this.y = begin.y;
- _this.z = begin.z;
- let _this1 = this._rayCastWrapper.end;
- _this1.x = end.x;
- _this1.y = end.y;
- _this1.z = end.z;
- this._rayCastWrapper.callback = callback;
- this._broadPhase.rayCast(begin,end,this._rayCastWrapper);
- }
- convexCast(convex,begin,translation,callback) {
- this._convexCastWrapper.convex = convex;
- let _this = this._convexCastWrapper.begin;
- _this._positionX = begin._positionX;
- _this._positionY = begin._positionY;
- _this._positionZ = begin._positionZ;
- _this._rotation00 = begin._rotation00;
- _this._rotation01 = begin._rotation01;
- _this._rotation02 = begin._rotation02;
- _this._rotation10 = begin._rotation10;
- _this._rotation11 = begin._rotation11;
- _this._rotation12 = begin._rotation12;
- _this._rotation20 = begin._rotation20;
- _this._rotation21 = begin._rotation21;
- _this._rotation22 = begin._rotation22;
- let _this1 = this._convexCastWrapper.translation;
- _this1.x = translation.x;
- _this1.y = translation.y;
- _this1.z = translation.z;
- this._convexCastWrapper.callback = callback;
- this._broadPhase.convexCast(convex,begin,translation,this._convexCastWrapper);
- }
- aabbTest(aabb,callback) {
- this._aabbTestWrapper._aabb.copyFrom(aabb);
- this._aabbTestWrapper._callback = callback;
- this._broadPhase.aabbTest(aabb,this._aabbTestWrapper);
- }
- getRigidBodyList() {
- return this._rigidBodyList;
- }
- getJointList() {
- return this._jointList;
- }
- getBroadPhase() {
- return this._broadPhase;
- }
- getContactManager() {
- return this._contactManager;
- }
- getNumRigidBodies() {
- return this._numRigidBodies;
- }
- getNumJoints() {
- return this._numJoints;
- }
- getNumShapes() {
- return this._numShapes;
- }
- getNumIslands() {
- return this._numIslands;
- }
- getNumVelocityIterations() {
- return this._numVelocityIterations;
- }
- setNumVelocityIterations(numVelocityIterations) {
- this._numVelocityIterations = numVelocityIterations;
- }
- getNumPositionIterations() {
- return this._numPositionIterations;
- }
- setNumPositionIterations(numPositionIterations) {
- this._numPositionIterations = numPositionIterations;
- }
- getGravity() {
- return this._gravity;
- }
- setGravity(gravity) {
- let _this = this._gravity;
- _this.x = gravity.x;
- _this.y = gravity.y;
- _this.z = gravity.z;
- }
- }
- if(!oimo.dynamics._World) oimo.dynamics._World = {};
- oimo.dynamics._World.RayCastWrapper = class oimo_dynamics__$World_RayCastWrapper extends oimo.collision.broadphase.BroadPhaseProxyCallback {
- constructor() {
- super();
- this.rayCastHit = new oimo.collision.geometry.RayCastHit();
- this.begin = new oimo.common.Vec3();
- this.end = new oimo.common.Vec3();
- this.callback = null;
- }
- process(proxy) {
- let shape = proxy.userData;
- if(shape._geom.rayCast(this.begin,this.end,shape._transform,this.rayCastHit)) {
- this.callback.process(shape,this.rayCastHit);
- }
- }
- }
- oimo.dynamics._World.ConvexCastWrapper = class oimo_dynamics__$World_ConvexCastWrapper extends oimo.collision.broadphase.BroadPhaseProxyCallback {
- constructor() {
- super();
- this.rayCastHit = new oimo.collision.geometry.RayCastHit();
- this.begin = new oimo.common.Transform();
- this.translation = new oimo.common.Vec3();
- this.zero = new oimo.common.Vec3();
- this.callback = null;
- this.convex = null;
- }
- process(proxy) {
- let shape = proxy.userData;
- let type = shape._geom._type;
- if(type < 0 || type > 5) {
- return;
- }
- if(oimo.collision.narrowphase.detector.gjkepa.GjkEpa.instance.convexCast(this.convex,shape._geom,this.begin,shape._transform,this.translation,this.zero,this.rayCastHit)) {
- this.callback.process(shape,this.rayCastHit);
- }
- }
- }
- oimo.dynamics._World.AabbTestWrapper = class oimo_dynamics__$World_AabbTestWrapper extends oimo.collision.broadphase.BroadPhaseProxyCallback {
- constructor() {
- super();
- this._aabb = new oimo.collision.geometry.Aabb();
- this._callback = null;
- }
- process(proxy) {
- let shape = proxy.userData;
- let shapeAabb = shape._aabb;
- if(shapeAabb._minX < this._aabb._maxX && shapeAabb._maxX > this._aabb._minX && shapeAabb._minY < this._aabb._maxY && shapeAabb._maxY > this._aabb._minY && shapeAabb._minZ < this._aabb._maxZ && shapeAabb._maxZ > this._aabb._minZ) {
- this._callback.process(shape);
- }
- }
- }
- if(!oimo.dynamics.callback) oimo.dynamics.callback = {};
- oimo.dynamics.callback.AabbTestCallback = class oimo_dynamics_callback_AabbTestCallback {
- constructor() {
- }
- process(shape) {
- }
- }
- oimo.dynamics.callback.ContactCallback = class oimo_dynamics_callback_ContactCallback {
- constructor() {
- }
- beginContact(c) {
- }
- preSolve(c) {
- }
- postSolve(c) {
- }
- endContact(c) {
- }
- }
- oimo.dynamics.callback.RayCastCallback = class oimo_dynamics_callback_RayCastCallback {
- constructor() {
- }
- process(shape,hit) {
- }
- }
- oimo.dynamics.callback.RayCastClosest = class oimo_dynamics_callback_RayCastClosest extends oimo.dynamics.callback.RayCastCallback {
- constructor() {
- super();
- this.position = new oimo.common.Vec3();
- this.normal = new oimo.common.Vec3();
- this.shape = null;
- this.fraction = 1;
- this.position.zero();
- this.normal.zero();
- this.hit = false;
- }
- clear() {
- this.shape = null;
- this.fraction = 1;
- this.position.zero();
- this.normal.zero();
- this.hit = false;
- }
- process(shape,hit) {
- if(hit.fraction < this.fraction) {
- this.shape = shape;
- this.hit = true;
- this.fraction = hit.fraction;
- let _this = this.position;
- let v = hit.position;
- _this.x = v.x;
- _this.y = v.y;
- _this.z = v.z;
- let _this1 = this.normal;
- let v1 = hit.normal;
- _this1.x = v1.x;
- _this1.y = v1.y;
- _this1.z = v1.z;
- }
- }
- }
- if(!oimo.dynamics.common) oimo.dynamics.common = {};
- oimo.dynamics.common.DebugDraw = class oimo_dynamics_common_DebugDraw {
- constructor() {
- this.p = new oimo.common.Pool();
- this.wireframe = false;
- this.drawShapes = true;
- this.drawBvh = false;
- this.drawBvhMinLevel = 0;
- this.drawBvhMaxLevel = 65536;
- this.drawAabbs = false;
- this.drawBases = false;
- this.drawPairs = false;
- this.drawContacts = false;
- this.drawJoints = true;
- this.drawJointLimits = false;
- this.sphereCoords = new Array(5);
- this.tmpSphereVerts = new Array(5);
- this.tmpSphereNorms = new Array(5);
- let _g = 0;
- while(_g < 5) {
- let i = _g++;
- let num = i == 0 || i == 4 ? 1 : 8;
- this.sphereCoords[i] = new Array(num);
- this.tmpSphereVerts[i] = new Array(num);
- this.tmpSphereNorms[i] = new Array(num);
- let _g1 = 0;
- while(_g1 < 8) {
- let j = _g1++;
- let theta = i * 0.7853981633974475;
- let phi = j * 0.7853981633974475;
- this.sphereCoords[i][j] = new oimo.common.Vec3(Math.sin(theta) * Math.cos(phi),Math.cos(theta),-Math.sin(theta) * Math.sin(phi));
- this.tmpSphereVerts[i][j] = new oimo.common.Vec3();
- this.tmpSphereNorms[i][j] = new oimo.common.Vec3();
- }
- }
- this.circleCoords = new Array(8);
- this.circleCoordsShift = new Array(8);
- this.tmpCircleVerts1 = new Array(8);
- this.tmpCircleVerts2 = new Array(8);
- this.tmpCircleNorms = new Array(8);
- let _g1 = 0;
- while(_g1 < 8) {
- let i = _g1++;
- this.circleCoords[i] = new oimo.common.Vec3(Math.cos(i * 0.7853981633974475),0,-Math.sin(i * 0.7853981633974475));
- this.circleCoordsShift[i] = new oimo.common.Vec3(Math.cos((i + 0.5) * 0.7853981633974475),0,-Math.sin((i + 0.5) * 0.7853981633974475));
- this.tmpCircleVerts1[i] = new oimo.common.Vec3();
- this.tmpCircleVerts2[i] = new oimo.common.Vec3();
- this.tmpCircleNorms[i] = new oimo.common.Vec3();
- }
- this.style = new oimo.dynamics.common.DebugDrawStyle();
- }
- aabb(min,max,color) {
- let _this = this.p;
- let v1 = (_this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3]).init(min.x,min.y,min.z);
- let _this1 = this.p;
- let v2 = (_this1.sizeVec3 == 0 ? new oimo.common.Vec3() : _this1.stackVec3[--_this1.sizeVec3]).init(min.x,min.y,max.z);
- let _this2 = this.p;
- let v3 = (_this2.sizeVec3 == 0 ? new oimo.common.Vec3() : _this2.stackVec3[--_this2.sizeVec3]).init(min.x,max.y,min.z);
- let _this3 = this.p;
- let v4 = (_this3.sizeVec3 == 0 ? new oimo.common.Vec3() : _this3.stackVec3[--_this3.sizeVec3]).init(min.x,max.y,max.z);
- let _this4 = this.p;
- let v5 = (_this4.sizeVec3 == 0 ? new oimo.common.Vec3() : _this4.stackVec3[--_this4.sizeVec3]).init(max.x,min.y,min.z);
- let _this5 = this.p;
- let v6 = (_this5.sizeVec3 == 0 ? new oimo.common.Vec3() : _this5.stackVec3[--_this5.sizeVec3]).init(max.x,min.y,max.z);
- let _this6 = this.p;
- let v7 = (_this6.sizeVec3 == 0 ? new oimo.common.Vec3() : _this6.stackVec3[--_this6.sizeVec3]).init(max.x,max.y,min.z);
- let _this7 = this.p;
- let v8 = (_this7.sizeVec3 == 0 ? new oimo.common.Vec3() : _this7.stackVec3[--_this7.sizeVec3]).init(max.x,max.y,max.z);
- this.line(v1,v2,color);
- this.line(v3,v4,color);
- this.line(v5,v6,color);
- this.line(v7,v8,color);
- this.line(v1,v3,color);
- this.line(v2,v4,color);
- this.line(v5,v7,color);
- this.line(v6,v8,color);
- this.line(v1,v5,color);
- this.line(v2,v6,color);
- this.line(v3,v7,color);
- this.line(v4,v8,color);
- let _this8 = this.p;
- if(v1 != null) {
- v1.zero();
- if(_this8.sizeVec3 == _this8.stackVec3.length) {
- let newArray = new Array(_this8.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this8.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this8.stackVec3[i];
- _this8.stackVec3[i] = null;
- }
- _this8.stackVec3 = newArray;
- }
- _this8.stackVec3[_this8.sizeVec3++] = v1;
- }
- let _this9 = this.p;
- if(v2 != null) {
- v2.zero();
- if(_this9.sizeVec3 == _this9.stackVec3.length) {
- let newArray = new Array(_this9.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this9.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this9.stackVec3[i];
- _this9.stackVec3[i] = null;
- }
- _this9.stackVec3 = newArray;
- }
- _this9.stackVec3[_this9.sizeVec3++] = v2;
- }
- let _this10 = this.p;
- if(v3 != null) {
- v3.zero();
- if(_this10.sizeVec3 == _this10.stackVec3.length) {
- let newArray = new Array(_this10.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this10.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this10.stackVec3[i];
- _this10.stackVec3[i] = null;
- }
- _this10.stackVec3 = newArray;
- }
- _this10.stackVec3[_this10.sizeVec3++] = v3;
- }
- let _this11 = this.p;
- if(v4 != null) {
- v4.zero();
- if(_this11.sizeVec3 == _this11.stackVec3.length) {
- let newArray = new Array(_this11.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this11.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this11.stackVec3[i];
- _this11.stackVec3[i] = null;
- }
- _this11.stackVec3 = newArray;
- }
- _this11.stackVec3[_this11.sizeVec3++] = v4;
- }
- let _this12 = this.p;
- if(v5 != null) {
- v5.zero();
- if(_this12.sizeVec3 == _this12.stackVec3.length) {
- let newArray = new Array(_this12.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this12.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this12.stackVec3[i];
- _this12.stackVec3[i] = null;
- }
- _this12.stackVec3 = newArray;
- }
- _this12.stackVec3[_this12.sizeVec3++] = v5;
- }
- let _this13 = this.p;
- if(v6 != null) {
- v6.zero();
- if(_this13.sizeVec3 == _this13.stackVec3.length) {
- let newArray = new Array(_this13.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this13.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this13.stackVec3[i];
- _this13.stackVec3[i] = null;
- }
- _this13.stackVec3 = newArray;
- }
- _this13.stackVec3[_this13.sizeVec3++] = v6;
- }
- let _this14 = this.p;
- if(v7 != null) {
- v7.zero();
- if(_this14.sizeVec3 == _this14.stackVec3.length) {
- let newArray = new Array(_this14.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this14.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this14.stackVec3[i];
- _this14.stackVec3[i] = null;
- }
- _this14.stackVec3 = newArray;
- }
- _this14.stackVec3[_this14.sizeVec3++] = v7;
- }
- let _this15 = this.p;
- if(v8 != null) {
- v8.zero();
- if(_this15.sizeVec3 == _this15.stackVec3.length) {
- let newArray = new Array(_this15.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this15.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this15.stackVec3[i];
- _this15.stackVec3[i] = null;
- }
- _this15.stackVec3 = newArray;
- }
- _this15.stackVec3[_this15.sizeVec3++] = v8;
- }
- }
- basis(transform,length,colorX,colorY,colorZ) {
- let _this = this.p;
- let pos = _this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3];
- let _this1 = this.p;
- let rot = _this1.sizeMat3 == 0 ? new oimo.common.Mat3() : _this1.stackMat3[--_this1.sizeMat3];
- let _this2 = this.p;
- let ex = _this2.sizeVec3 == 0 ? new oimo.common.Vec3() : _this2.stackVec3[--_this2.sizeVec3];
- let _this3 = this.p;
- let ey = _this3.sizeVec3 == 0 ? new oimo.common.Vec3() : _this3.stackVec3[--_this3.sizeVec3];
- let _this4 = this.p;
- let ez = _this4.sizeVec3 == 0 ? new oimo.common.Vec3() : _this4.stackVec3[--_this4.sizeVec3];
- let v = pos;
- v.x = transform._positionX;
- v.y = transform._positionY;
- v.z = transform._positionZ;
- let m = rot;
- m.e00 = transform._rotation00;
- m.e01 = transform._rotation01;
- m.e02 = transform._rotation02;
- m.e10 = transform._rotation10;
- m.e11 = transform._rotation11;
- m.e12 = transform._rotation12;
- m.e20 = transform._rotation20;
- m.e21 = transform._rotation21;
- m.e22 = transform._rotation22;
- ex.init(rot.e00,rot.e10,rot.e20);
- ey.init(rot.e01,rot.e11,rot.e21);
- ez.init(rot.e02,rot.e12,rot.e22);
- ex.x *= length;
- ex.y *= length;
- ex.z *= length;
- let _this5 = ex;
- _this5.x += pos.x;
- _this5.y += pos.y;
- _this5.z += pos.z;
- ey.x *= length;
- ey.y *= length;
- ey.z *= length;
- let _this6 = ey;
- _this6.x += pos.x;
- _this6.y += pos.y;
- _this6.z += pos.z;
- ez.x *= length;
- ez.y *= length;
- ez.z *= length;
- let _this7 = ez;
- _this7.x += pos.x;
- _this7.y += pos.y;
- _this7.z += pos.z;
- this.line(pos,ex,colorX);
- this.line(pos,ey,colorY);
- this.line(pos,ez,colorZ);
- let _this8 = this.p;
- if(pos != null) {
- pos.zero();
- if(_this8.sizeVec3 == _this8.stackVec3.length) {
- let newArray = new Array(_this8.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this8.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this8.stackVec3[i];
- _this8.stackVec3[i] = null;
- }
- _this8.stackVec3 = newArray;
- }
- _this8.stackVec3[_this8.sizeVec3++] = pos;
- }
- let _this9 = this.p;
- if(rot != null) {
- rot.e00 = 1;
- rot.e01 = 0;
- rot.e02 = 0;
- rot.e10 = 0;
- rot.e11 = 1;
- rot.e12 = 0;
- rot.e20 = 0;
- rot.e21 = 0;
- rot.e22 = 1;
- if(_this9.sizeMat3 == _this9.stackMat3.length) {
- let newArray = new Array(_this9.sizeMat3 << 1);
- let _g = 0;
- let _g1 = _this9.sizeMat3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this9.stackMat3[i];
- _this9.stackMat3[i] = null;
- }
- _this9.stackMat3 = newArray;
- }
- _this9.stackMat3[_this9.sizeMat3++] = rot;
- }
- let _this10 = this.p;
- if(ex != null) {
- ex.zero();
- if(_this10.sizeVec3 == _this10.stackVec3.length) {
- let newArray = new Array(_this10.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this10.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this10.stackVec3[i];
- _this10.stackVec3[i] = null;
- }
- _this10.stackVec3 = newArray;
- }
- _this10.stackVec3[_this10.sizeVec3++] = ex;
- }
- let _this11 = this.p;
- if(ey != null) {
- ey.zero();
- if(_this11.sizeVec3 == _this11.stackVec3.length) {
- let newArray = new Array(_this11.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this11.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this11.stackVec3[i];
- _this11.stackVec3[i] = null;
- }
- _this11.stackVec3 = newArray;
- }
- _this11.stackVec3[_this11.sizeVec3++] = ey;
- }
- let _this12 = this.p;
- if(ez != null) {
- ez.zero();
- if(_this12.sizeVec3 == _this12.stackVec3.length) {
- let newArray = new Array(_this12.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this12.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this12.stackVec3[i];
- _this12.stackVec3[i] = null;
- }
- _this12.stackVec3 = newArray;
- }
- _this12.stackVec3[_this12.sizeVec3++] = ez;
- }
- }
- ellipse(center,ex,ey,radiusX,radiusY,color) {
- this.arc(center,ex,ey,radiusX,radiusY,0,6.28318530717958,false,color);
- }
- arc(center,ex,ey,radiusX,radiusY,startAngle,endAngle,drawSector,color) {
- let _this = this.p;
- let _this1 = _this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3];
- _this1.x = ex.x;
- _this1.y = ex.y;
- _this1.z = ex.z;
- let _this2 = _this1;
- _this2.x *= radiusX;
- _this2.y *= radiusX;
- _this2.z *= radiusX;
- let _this3 = this.p;
- let _this4 = _this3.sizeVec3 == 0 ? new oimo.common.Vec3() : _this3.stackVec3[--_this3.sizeVec3];
- _this4.x = ey.x;
- _this4.y = ey.y;
- _this4.z = ey.z;
- let _this5 = _this4;
- _this5.x *= radiusY;
- _this5.y *= radiusY;
- _this5.z *= radiusY;
- let angDiff = endAngle - startAngle;
- if(angDiff < 0) {
- angDiff = -angDiff;
- }
- let n = angDiff / 0.52359877559829837 + 0.5 | 0;
- if(n == 0) {
- n = 1;
- }
- let theta = startAngle;
- let dt = (endAngle - startAngle) / n;
- let _this6 = this.p;
- let _this7 = _this6.sizeVec3 == 0 ? new oimo.common.Vec3() : _this6.stackVec3[--_this6.sizeVec3];
- _this7.x = center.x;
- _this7.y = center.y;
- _this7.z = center.z;
- let _this8 = _this7;
- let s = Math.cos(startAngle);
- _this8.x += _this2.x * s;
- _this8.y += _this2.y * s;
- _this8.z += _this2.z * s;
- let s1 = Math.sin(startAngle);
- _this8.x += _this5.x * s1;
- _this8.y += _this5.y * s1;
- _this8.z += _this5.z * s1;
- let prevV = _this8;
- if(drawSector) {
- this.line(center,_this8,color);
- }
- let _g = 0;
- let _g1 = n;
- while(_g < _g1) {
- ++_g;
- theta += dt;
- let _this = this.p;
- let _this1 = _this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3];
- _this1.x = center.x;
- _this1.y = center.y;
- _this1.z = center.z;
- let _this3 = _this1;
- let s = Math.cos(theta);
- _this3.x += _this2.x * s;
- _this3.y += _this2.y * s;
- _this3.z += _this2.z * s;
- let s1 = Math.sin(theta);
- _this3.x += _this5.x * s1;
- _this3.y += _this5.y * s1;
- _this3.z += _this5.z * s1;
- this.line(prevV,_this3,color);
- let _this4 = this.p;
- if(prevV != null) {
- prevV.zero();
- if(_this4.sizeVec3 == _this4.stackVec3.length) {
- let newArray = new Array(_this4.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this4.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this4.stackVec3[i];
- _this4.stackVec3[i] = null;
- }
- _this4.stackVec3 = newArray;
- }
- _this4.stackVec3[_this4.sizeVec3++] = prevV;
- }
- prevV = _this3;
- }
- if(drawSector) {
- this.line(center,prevV,color);
- }
- let _this9 = this.p;
- if(prevV != null) {
- prevV.zero();
- if(_this9.sizeVec3 == _this9.stackVec3.length) {
- let newArray = new Array(_this9.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this9.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this9.stackVec3[i];
- _this9.stackVec3[i] = null;
- }
- _this9.stackVec3 = newArray;
- }
- _this9.stackVec3[_this9.sizeVec3++] = prevV;
- }
- let _this10 = this.p;
- if(_this2 != null) {
- _this2.zero();
- if(_this10.sizeVec3 == _this10.stackVec3.length) {
- let newArray = new Array(_this10.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this10.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this10.stackVec3[i];
- _this10.stackVec3[i] = null;
- }
- _this10.stackVec3 = newArray;
- }
- _this10.stackVec3[_this10.sizeVec3++] = _this2;
- }
- let _this11 = this.p;
- if(_this5 != null) {
- _this5.zero();
- if(_this11.sizeVec3 == _this11.stackVec3.length) {
- let newArray = new Array(_this11.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this11.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this11.stackVec3[i];
- _this11.stackVec3[i] = null;
- }
- _this11.stackVec3 = newArray;
- }
- _this11.stackVec3[_this11.sizeVec3++] = _this5;
- }
- }
- cone(tf,radius,halfHeight,color) {
- let _this = this.p;
- let ex = _this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3];
- let _this1 = this.p;
- let ey = _this1.sizeVec3 == 0 ? new oimo.common.Vec3() : _this1.stackVec3[--_this1.sizeVec3];
- let _this2 = this.p;
- let ez = _this2.sizeVec3 == 0 ? new oimo.common.Vec3() : _this2.stackVec3[--_this2.sizeVec3];
- let _this3 = this.p;
- let o = _this3.sizeVec3 == 0 ? new oimo.common.Vec3() : _this3.stackVec3[--_this3.sizeVec3];
- let _this4 = this.p;
- let m = _this4.sizeMat3 == 0 ? new oimo.common.Mat3() : _this4.stackMat3[--_this4.sizeMat3];
- let v = o;
- v.x = tf._positionX;
- v.y = tf._positionY;
- v.z = tf._positionZ;
- let m1 = m;
- m1.e00 = tf._rotation00;
- m1.e01 = tf._rotation01;
- m1.e02 = tf._rotation02;
- m1.e10 = tf._rotation10;
- m1.e11 = tf._rotation11;
- m1.e12 = tf._rotation12;
- m1.e20 = tf._rotation20;
- m1.e21 = tf._rotation21;
- m1.e22 = tf._rotation22;
- ex.init(m.e00,m.e10,m.e20);
- ey.init(m.e01,m.e11,m.e21);
- ez.init(m.e02,m.e12,m.e22);
- let _this5 = this.p;
- let _this6 = _this5.sizeVec3 == 0 ? new oimo.common.Vec3() : _this5.stackVec3[--_this5.sizeVec3];
- _this6.x = o.x;
- _this6.y = o.y;
- _this6.z = o.z;
- let _this7 = _this6;
- _this7.x += ey.x * halfHeight;
- _this7.y += ey.y * halfHeight;
- _this7.z += ey.z * halfHeight;
- let _this8 = this.p;
- let _this9 = _this8.sizeVec3 == 0 ? new oimo.common.Vec3() : _this8.stackVec3[--_this8.sizeVec3];
- _this9.x = o.x;
- _this9.y = o.y;
- _this9.z = o.z;
- let _this10 = _this9;
- let s = -halfHeight;
- _this10.x += ey.x * s;
- _this10.y += ey.y * s;
- _this10.z += ey.z * s;
- if(this.wireframe) {
- let _this = this.p;
- let _this1 = _this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3];
- _this1.x = _this10.x;
- _this1.y = _this10.y;
- _this1.z = _this10.z;
- let _this2 = _this1;
- let s = -radius;
- _this2.x += ex.x * s;
- _this2.y += ex.y * s;
- _this2.z += ex.z * s;
- _this2.x += ez.x * 0;
- _this2.y += ez.y * 0;
- _this2.z += ez.z * 0;
- let _this3 = this.p;
- let _this4 = _this3.sizeVec3 == 0 ? new oimo.common.Vec3() : _this3.stackVec3[--_this3.sizeVec3];
- _this4.x = _this10.x;
- _this4.y = _this10.y;
- _this4.z = _this10.z;
- let _this5 = _this4;
- _this5.x += ex.x * radius;
- _this5.y += ex.y * radius;
- _this5.z += ex.z * radius;
- _this5.x += ez.x * 0;
- _this5.y += ez.y * 0;
- _this5.z += ez.z * 0;
- let _this6 = this.p;
- let _this8 = _this6.sizeVec3 == 0 ? new oimo.common.Vec3() : _this6.stackVec3[--_this6.sizeVec3];
- _this8.x = _this10.x;
- _this8.y = _this10.y;
- _this8.z = _this10.z;
- let _this9 = _this8;
- _this9.x += ex.x * 0;
- _this9.y += ex.y * 0;
- _this9.z += ex.z * 0;
- let s1 = -radius;
- _this9.x += ez.x * s1;
- _this9.y += ez.y * s1;
- _this9.z += ez.z * s1;
- let _this11 = this.p;
- let _this12 = _this11.sizeVec3 == 0 ? new oimo.common.Vec3() : _this11.stackVec3[--_this11.sizeVec3];
- _this12.x = _this10.x;
- _this12.y = _this10.y;
- _this12.z = _this10.z;
- let _this13 = _this12;
- _this13.x += ex.x * 0;
- _this13.y += ex.y * 0;
- _this13.z += ex.z * 0;
- _this13.x += ez.x * radius;
- _this13.y += ez.y * radius;
- _this13.z += ez.z * radius;
- this.ellipse(_this10,ex,ez,radius,radius,color);
- this.line(_this7,_this2,color);
- this.line(_this7,_this5,color);
- this.line(_this7,_this9,color);
- this.line(_this7,_this13,color);
- let _this14 = this.p;
- if(_this2 != null) {
- _this2.zero();
- if(_this14.sizeVec3 == _this14.stackVec3.length) {
- let newArray = new Array(_this14.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this14.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this14.stackVec3[i];
- _this14.stackVec3[i] = null;
- }
- _this14.stackVec3 = newArray;
- }
- _this14.stackVec3[_this14.sizeVec3++] = _this2;
- }
- let _this15 = this.p;
- if(_this5 != null) {
- _this5.zero();
- if(_this15.sizeVec3 == _this15.stackVec3.length) {
- let newArray = new Array(_this15.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this15.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this15.stackVec3[i];
- _this15.stackVec3[i] = null;
- }
- _this15.stackVec3 = newArray;
- }
- _this15.stackVec3[_this15.sizeVec3++] = _this5;
- }
- let _this16 = this.p;
- if(_this9 != null) {
- _this9.zero();
- if(_this16.sizeVec3 == _this16.stackVec3.length) {
- let newArray = new Array(_this16.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this16.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this16.stackVec3[i];
- _this16.stackVec3[i] = null;
- }
- _this16.stackVec3 = newArray;
- }
- _this16.stackVec3[_this16.sizeVec3++] = _this9;
- }
- let _this17 = this.p;
- if(_this13 != null) {
- _this13.zero();
- if(_this17.sizeVec3 == _this17.stackVec3.length) {
- let newArray = new Array(_this17.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this17.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this17.stackVec3[i];
- _this17.stackVec3[i] = null;
- }
- _this17.stackVec3 = newArray;
- }
- _this17.stackVec3[_this17.sizeVec3++] = _this13;
- }
- } else {
- let invDenom = 1 / Math.sqrt(radius * radius + 4 * halfHeight * halfHeight);
- let cos = 2 * halfHeight * invDenom;
- let sin = radius * invDenom;
- let _g = 0;
- while(_g < 8) {
- let i = _g++;
- let _this = this.tmpCircleNorms[i];
- let v = this.circleCoords[i];
- _this.x = v.x;
- _this.y = v.y;
- _this.z = v.z;
- _this.x *= cos;
- _this.y *= cos;
- _this.z *= cos;
- _this.y += sin;
- let _this1 = this.tmpCircleNorms[i];
- let y = _this1.x * m.e10 + _this1.y * m.e11 + _this1.z * m.e12;
- let z = _this1.x * m.e20 + _this1.y * m.e21 + _this1.z * m.e22;
- _this1.x = _this1.x * m.e00 + _this1.y * m.e01 + _this1.z * m.e02;
- _this1.y = y;
- _this1.z = z;
- let _this2 = this.tmpCircleVerts1[i];
- let v1 = this.circleCoordsShift[i];
- _this2.x = v1.x;
- _this2.y = v1.y;
- _this2.z = v1.z;
- _this2.x *= cos;
- _this2.y *= cos;
- _this2.z *= cos;
- _this2.y += sin;
- let _this3 = this.tmpCircleVerts1[i];
- let y1 = _this3.x * m.e10 + _this3.y * m.e11 + _this3.z * m.e12;
- let z1 = _this3.x * m.e20 + _this3.y * m.e21 + _this3.z * m.e22;
- _this3.x = _this3.x * m.e00 + _this3.y * m.e01 + _this3.z * m.e02;
- _this3.y = y1;
- _this3.z = z1;
- let _this4 = this.tmpCircleVerts2[i];
- let v2 = this.circleCoords[i];
- _this4.x = v2.x;
- _this4.y = v2.y;
- _this4.z = v2.z;
- let y2 = _this4.x * m.e10 + _this4.y * m.e11 + _this4.z * m.e12;
- let z2 = _this4.x * m.e20 + _this4.y * m.e21 + _this4.z * m.e22;
- _this4.x = _this4.x * m.e00 + _this4.y * m.e01 + _this4.z * m.e02;
- _this4.y = y2;
- _this4.z = z2;
- _this4.x *= radius;
- _this4.y *= radius;
- _this4.z *= radius;
- _this4.x += o.x;
- _this4.y += o.y;
- _this4.z += o.z;
- let _this5 = this.tmpCircleVerts2[i];
- let s = -halfHeight;
- _this5.x += ey.x * s;
- _this5.y += ey.y * s;
- _this5.z += ey.z * s;
- }
- let _g1 = 0;
- while(_g1 < 8) {
- let i = _g1++;
- let v2 = this.tmpCircleVerts2[i];
- let v3 = this.tmpCircleVerts2[(i + 1) % 8];
- let n1 = this.tmpCircleVerts1[i];
- this.triangle(_this7,v2,v3,n1,this.tmpCircleNorms[i],this.tmpCircleNorms[(i + 1) % 8],color);
- v2 = this.tmpCircleVerts2[(i + 1) % 8];
- v3 = this.tmpCircleVerts2[i];
- let _this = this.p;
- let _this1 = _this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3];
- _this1.x = ey.x;
- _this1.y = ey.y;
- _this1.z = ey.z;
- let _this2 = _this1;
- _this2.x = -_this2.x;
- _this2.y = -_this2.y;
- _this2.z = -_this2.z;
- this.triangle(_this10,v2,v3,_this2,_this2,_this2,color);
- let _this3 = this.p;
- if(_this2 != null) {
- _this2.zero();
- if(_this3.sizeVec3 == _this3.stackVec3.length) {
- let newArray = new Array(_this3.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this3.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this3.stackVec3[i];
- _this3.stackVec3[i] = null;
- }
- _this3.stackVec3 = newArray;
- }
- _this3.stackVec3[_this3.sizeVec3++] = _this2;
- }
- }
- }
- let _this11 = this.p;
- if(_this7 != null) {
- _this7.zero();
- if(_this11.sizeVec3 == _this11.stackVec3.length) {
- let newArray = new Array(_this11.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this11.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this11.stackVec3[i];
- _this11.stackVec3[i] = null;
- }
- _this11.stackVec3 = newArray;
- }
- _this11.stackVec3[_this11.sizeVec3++] = _this7;
- }
- let _this12 = this.p;
- if(_this10 != null) {
- _this10.zero();
- if(_this12.sizeVec3 == _this12.stackVec3.length) {
- let newArray = new Array(_this12.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this12.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this12.stackVec3[i];
- _this12.stackVec3[i] = null;
- }
- _this12.stackVec3 = newArray;
- }
- _this12.stackVec3[_this12.sizeVec3++] = _this10;
- }
- let _this13 = this.p;
- if(o != null) {
- o.zero();
- if(_this13.sizeVec3 == _this13.stackVec3.length) {
- let newArray = new Array(_this13.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this13.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this13.stackVec3[i];
- _this13.stackVec3[i] = null;
- }
- _this13.stackVec3 = newArray;
- }
- _this13.stackVec3[_this13.sizeVec3++] = o;
- }
- let _this14 = this.p;
- if(m != null) {
- m.e00 = 1;
- m.e01 = 0;
- m.e02 = 0;
- m.e10 = 0;
- m.e11 = 1;
- m.e12 = 0;
- m.e20 = 0;
- m.e21 = 0;
- m.e22 = 1;
- if(_this14.sizeMat3 == _this14.stackMat3.length) {
- let newArray = new Array(_this14.sizeMat3 << 1);
- let _g = 0;
- let _g1 = _this14.sizeMat3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this14.stackMat3[i];
- _this14.stackMat3[i] = null;
- }
- _this14.stackMat3 = newArray;
- }
- _this14.stackMat3[_this14.sizeMat3++] = m;
- }
- let _this15 = this.p;
- if(ex != null) {
- ex.zero();
- if(_this15.sizeVec3 == _this15.stackVec3.length) {
- let newArray = new Array(_this15.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this15.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this15.stackVec3[i];
- _this15.stackVec3[i] = null;
- }
- _this15.stackVec3 = newArray;
- }
- _this15.stackVec3[_this15.sizeVec3++] = ex;
- }
- let _this16 = this.p;
- if(ey != null) {
- ey.zero();
- if(_this16.sizeVec3 == _this16.stackVec3.length) {
- let newArray = new Array(_this16.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this16.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this16.stackVec3[i];
- _this16.stackVec3[i] = null;
- }
- _this16.stackVec3 = newArray;
- }
- _this16.stackVec3[_this16.sizeVec3++] = ey;
- }
- let _this17 = this.p;
- if(ez != null) {
- ez.zero();
- if(_this17.sizeVec3 == _this17.stackVec3.length) {
- let newArray = new Array(_this17.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this17.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this17.stackVec3[i];
- _this17.stackVec3[i] = null;
- }
- _this17.stackVec3 = newArray;
- }
- _this17.stackVec3[_this17.sizeVec3++] = ez;
- }
- }
- cylinder(tf,radius,halfHeight,color) {
- let _this = this.p;
- let ex = _this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3];
- let _this1 = this.p;
- let ey = _this1.sizeVec3 == 0 ? new oimo.common.Vec3() : _this1.stackVec3[--_this1.sizeVec3];
- let _this2 = this.p;
- let ez = _this2.sizeVec3 == 0 ? new oimo.common.Vec3() : _this2.stackVec3[--_this2.sizeVec3];
- let _this3 = this.p;
- let o = _this3.sizeVec3 == 0 ? new oimo.common.Vec3() : _this3.stackVec3[--_this3.sizeVec3];
- let _this4 = this.p;
- let m = _this4.sizeMat3 == 0 ? new oimo.common.Mat3() : _this4.stackMat3[--_this4.sizeMat3];
- let v = o;
- v.x = tf._positionX;
- v.y = tf._positionY;
- v.z = tf._positionZ;
- let m1 = m;
- m1.e00 = tf._rotation00;
- m1.e01 = tf._rotation01;
- m1.e02 = tf._rotation02;
- m1.e10 = tf._rotation10;
- m1.e11 = tf._rotation11;
- m1.e12 = tf._rotation12;
- m1.e20 = tf._rotation20;
- m1.e21 = tf._rotation21;
- m1.e22 = tf._rotation22;
- ex.init(m.e00,m.e10,m.e20);
- ey.init(m.e01,m.e11,m.e21);
- ez.init(m.e02,m.e12,m.e22);
- let _this5 = this.p;
- let _this6 = _this5.sizeVec3 == 0 ? new oimo.common.Vec3() : _this5.stackVec3[--_this5.sizeVec3];
- _this6.x = o.x;
- _this6.y = o.y;
- _this6.z = o.z;
- let _this7 = _this6;
- _this7.x += ey.x * halfHeight;
- _this7.y += ey.y * halfHeight;
- _this7.z += ey.z * halfHeight;
- let _this8 = this.p;
- let _this9 = _this8.sizeVec3 == 0 ? new oimo.common.Vec3() : _this8.stackVec3[--_this8.sizeVec3];
- _this9.x = o.x;
- _this9.y = o.y;
- _this9.z = o.z;
- let _this10 = _this9;
- let s = -halfHeight;
- _this10.x += ey.x * s;
- _this10.y += ey.y * s;
- _this10.z += ey.z * s;
- if(this.wireframe) {
- let _this = this.p;
- let _this1 = _this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3];
- _this1.x = _this7.x;
- _this1.y = _this7.y;
- _this1.z = _this7.z;
- let _this2 = _this1;
- let s = -radius;
- _this2.x += ex.x * s;
- _this2.y += ex.y * s;
- _this2.z += ex.z * s;
- _this2.x += ez.x * 0;
- _this2.y += ez.y * 0;
- _this2.z += ez.z * 0;
- let _this3 = this.p;
- let _this4 = _this3.sizeVec3 == 0 ? new oimo.common.Vec3() : _this3.stackVec3[--_this3.sizeVec3];
- _this4.x = _this7.x;
- _this4.y = _this7.y;
- _this4.z = _this7.z;
- let _this5 = _this4;
- _this5.x += ex.x * radius;
- _this5.y += ex.y * radius;
- _this5.z += ex.z * radius;
- _this5.x += ez.x * 0;
- _this5.y += ez.y * 0;
- _this5.z += ez.z * 0;
- let _this6 = this.p;
- let _this8 = _this6.sizeVec3 == 0 ? new oimo.common.Vec3() : _this6.stackVec3[--_this6.sizeVec3];
- _this8.x = _this7.x;
- _this8.y = _this7.y;
- _this8.z = _this7.z;
- let _this9 = _this8;
- _this9.x += ex.x * 0;
- _this9.y += ex.y * 0;
- _this9.z += ex.z * 0;
- let s1 = -radius;
- _this9.x += ez.x * s1;
- _this9.y += ez.y * s1;
- _this9.z += ez.z * s1;
- let _this11 = this.p;
- let _this12 = _this11.sizeVec3 == 0 ? new oimo.common.Vec3() : _this11.stackVec3[--_this11.sizeVec3];
- _this12.x = _this7.x;
- _this12.y = _this7.y;
- _this12.z = _this7.z;
- let _this13 = _this12;
- _this13.x += ex.x * 0;
- _this13.y += ex.y * 0;
- _this13.z += ex.z * 0;
- _this13.x += ez.x * radius;
- _this13.y += ez.y * radius;
- _this13.z += ez.z * radius;
- let _this14 = this.p;
- let _this15 = _this14.sizeVec3 == 0 ? new oimo.common.Vec3() : _this14.stackVec3[--_this14.sizeVec3];
- _this15.x = _this10.x;
- _this15.y = _this10.y;
- _this15.z = _this10.z;
- let _this16 = _this15;
- let s2 = -radius;
- _this16.x += ex.x * s2;
- _this16.y += ex.y * s2;
- _this16.z += ex.z * s2;
- _this16.x += ez.x * 0;
- _this16.y += ez.y * 0;
- _this16.z += ez.z * 0;
- let _this17 = this.p;
- let _this18 = _this17.sizeVec3 == 0 ? new oimo.common.Vec3() : _this17.stackVec3[--_this17.sizeVec3];
- _this18.x = _this10.x;
- _this18.y = _this10.y;
- _this18.z = _this10.z;
- let _this19 = _this18;
- _this19.x += ex.x * radius;
- _this19.y += ex.y * radius;
- _this19.z += ex.z * radius;
- _this19.x += ez.x * 0;
- _this19.y += ez.y * 0;
- _this19.z += ez.z * 0;
- let _this20 = this.p;
- let _this21 = _this20.sizeVec3 == 0 ? new oimo.common.Vec3() : _this20.stackVec3[--_this20.sizeVec3];
- _this21.x = _this10.x;
- _this21.y = _this10.y;
- _this21.z = _this10.z;
- let _this22 = _this21;
- _this22.x += ex.x * 0;
- _this22.y += ex.y * 0;
- _this22.z += ex.z * 0;
- let s3 = -radius;
- _this22.x += ez.x * s3;
- _this22.y += ez.y * s3;
- _this22.z += ez.z * s3;
- let _this23 = this.p;
- let _this24 = _this23.sizeVec3 == 0 ? new oimo.common.Vec3() : _this23.stackVec3[--_this23.sizeVec3];
- _this24.x = _this10.x;
- _this24.y = _this10.y;
- _this24.z = _this10.z;
- let _this25 = _this24;
- _this25.x += ex.x * 0;
- _this25.y += ex.y * 0;
- _this25.z += ex.z * 0;
- _this25.x += ez.x * radius;
- _this25.y += ez.y * radius;
- _this25.z += ez.z * radius;
- this.ellipse(_this7,ex,ez,radius,radius,color);
- this.ellipse(_this10,ex,ez,radius,radius,color);
- this.line(_this2,_this16,color);
- this.line(_this5,_this19,color);
- this.line(_this9,_this22,color);
- this.line(_this13,_this25,color);
- let _this26 = this.p;
- if(_this2 != null) {
- _this2.zero();
- if(_this26.sizeVec3 == _this26.stackVec3.length) {
- let newArray = new Array(_this26.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this26.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this26.stackVec3[i];
- _this26.stackVec3[i] = null;
- }
- _this26.stackVec3 = newArray;
- }
- _this26.stackVec3[_this26.sizeVec3++] = _this2;
- }
- let _this27 = this.p;
- if(_this5 != null) {
- _this5.zero();
- if(_this27.sizeVec3 == _this27.stackVec3.length) {
- let newArray = new Array(_this27.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this27.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this27.stackVec3[i];
- _this27.stackVec3[i] = null;
- }
- _this27.stackVec3 = newArray;
- }
- _this27.stackVec3[_this27.sizeVec3++] = _this5;
- }
- let _this28 = this.p;
- if(_this9 != null) {
- _this9.zero();
- if(_this28.sizeVec3 == _this28.stackVec3.length) {
- let newArray = new Array(_this28.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this28.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this28.stackVec3[i];
- _this28.stackVec3[i] = null;
- }
- _this28.stackVec3 = newArray;
- }
- _this28.stackVec3[_this28.sizeVec3++] = _this9;
- }
- let _this29 = this.p;
- if(_this13 != null) {
- _this13.zero();
- if(_this29.sizeVec3 == _this29.stackVec3.length) {
- let newArray = new Array(_this29.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this29.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this29.stackVec3[i];
- _this29.stackVec3[i] = null;
- }
- _this29.stackVec3 = newArray;
- }
- _this29.stackVec3[_this29.sizeVec3++] = _this13;
- }
- let _this30 = this.p;
- if(_this16 != null) {
- _this16.zero();
- if(_this30.sizeVec3 == _this30.stackVec3.length) {
- let newArray = new Array(_this30.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this30.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this30.stackVec3[i];
- _this30.stackVec3[i] = null;
- }
- _this30.stackVec3 = newArray;
- }
- _this30.stackVec3[_this30.sizeVec3++] = _this16;
- }
- let _this31 = this.p;
- if(_this19 != null) {
- _this19.zero();
- if(_this31.sizeVec3 == _this31.stackVec3.length) {
- let newArray = new Array(_this31.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this31.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this31.stackVec3[i];
- _this31.stackVec3[i] = null;
- }
- _this31.stackVec3 = newArray;
- }
- _this31.stackVec3[_this31.sizeVec3++] = _this19;
- }
- let _this32 = this.p;
- if(_this22 != null) {
- _this22.zero();
- if(_this32.sizeVec3 == _this32.stackVec3.length) {
- let newArray = new Array(_this32.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this32.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this32.stackVec3[i];
- _this32.stackVec3[i] = null;
- }
- _this32.stackVec3 = newArray;
- }
- _this32.stackVec3[_this32.sizeVec3++] = _this22;
- }
- let _this33 = this.p;
- if(_this25 != null) {
- _this25.zero();
- if(_this33.sizeVec3 == _this33.stackVec3.length) {
- let newArray = new Array(_this33.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this33.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this33.stackVec3[i];
- _this33.stackVec3[i] = null;
- }
- _this33.stackVec3 = newArray;
- }
- _this33.stackVec3[_this33.sizeVec3++] = _this25;
- }
- } else {
- let _g = 0;
- while(_g < 8) {
- let i = _g++;
- let _this = this.tmpCircleNorms[i];
- let v = this.circleCoords[i];
- _this.x = v.x;
- _this.y = v.y;
- _this.z = v.z;
- let y = _this.x * m.e10 + _this.y * m.e11 + _this.z * m.e12;
- let z = _this.x * m.e20 + _this.y * m.e21 + _this.z * m.e22;
- _this.x = _this.x * m.e00 + _this.y * m.e01 + _this.z * m.e02;
- _this.y = y;
- _this.z = z;
- let _this1 = this.tmpCircleVerts1[i];
- let v1 = this.tmpCircleNorms[i];
- _this1.x = v1.x;
- _this1.y = v1.y;
- _this1.z = v1.z;
- _this1.x *= radius;
- _this1.y *= radius;
- _this1.z *= radius;
- _this1.x += o.x;
- _this1.y += o.y;
- _this1.z += o.z;
- let _this2 = this.tmpCircleVerts2[i];
- let v2 = this.tmpCircleVerts1[i];
- _this2.x = v2.x;
- _this2.y = v2.y;
- _this2.z = v2.z;
- let _this3 = this.tmpCircleVerts1[i];
- _this3.x += ey.x * halfHeight;
- _this3.y += ey.y * halfHeight;
- _this3.z += ey.z * halfHeight;
- let _this4 = this.tmpCircleVerts2[i];
- let s = -halfHeight;
- _this4.x += ey.x * s;
- _this4.y += ey.y * s;
- _this4.z += ey.z * s;
- }
- let _g1 = 0;
- while(_g1 < 8) {
- let i = _g1++;
- let v1;
- let v2 = this.tmpCircleVerts1[i];
- let v3 = this.tmpCircleVerts1[(i + 1) % 8];
- let n1 = ey;
- this.triangle(_this7,v2,v3,n1,n1,n1,color);
- v2 = this.tmpCircleVerts2[(i + 1) % 8];
- v3 = this.tmpCircleVerts2[i];
- let _this = this.p;
- let _this1 = _this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3];
- _this1.x = ey.x;
- _this1.y = ey.y;
- _this1.z = ey.z;
- let _this2 = _this1;
- _this2.x = -_this2.x;
- _this2.y = -_this2.y;
- _this2.z = -_this2.z;
- this.triangle(_this10,v2,v3,_this2,_this2,_this2,color);
- let _this3 = this.p;
- if(_this2 != null) {
- _this2.zero();
- if(_this3.sizeVec3 == _this3.stackVec3.length) {
- let newArray = new Array(_this3.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this3.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this3.stackVec3[i];
- _this3.stackVec3[i] = null;
- }
- _this3.stackVec3 = newArray;
- }
- _this3.stackVec3[_this3.sizeVec3++] = _this2;
- }
- v1 = this.tmpCircleVerts1[i];
- v2 = this.tmpCircleVerts2[i];
- v3 = this.tmpCircleVerts2[(i + 1) % 8];
- n1 = this.tmpCircleNorms[i];
- let n2 = this.tmpCircleNorms[(i + 1) % 8];
- this.rect(v1,v2,v3,this.tmpCircleVerts1[(i + 1) % 8],n1,n1,n2,n2,color);
- }
- }
- let _this11 = this.p;
- if(_this7 != null) {
- _this7.zero();
- if(_this11.sizeVec3 == _this11.stackVec3.length) {
- let newArray = new Array(_this11.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this11.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this11.stackVec3[i];
- _this11.stackVec3[i] = null;
- }
- _this11.stackVec3 = newArray;
- }
- _this11.stackVec3[_this11.sizeVec3++] = _this7;
- }
- let _this12 = this.p;
- if(_this10 != null) {
- _this10.zero();
- if(_this12.sizeVec3 == _this12.stackVec3.length) {
- let newArray = new Array(_this12.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this12.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this12.stackVec3[i];
- _this12.stackVec3[i] = null;
- }
- _this12.stackVec3 = newArray;
- }
- _this12.stackVec3[_this12.sizeVec3++] = _this10;
- }
- let _this13 = this.p;
- if(o != null) {
- o.zero();
- if(_this13.sizeVec3 == _this13.stackVec3.length) {
- let newArray = new Array(_this13.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this13.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this13.stackVec3[i];
- _this13.stackVec3[i] = null;
- }
- _this13.stackVec3 = newArray;
- }
- _this13.stackVec3[_this13.sizeVec3++] = o;
- }
- let _this14 = this.p;
- if(m != null) {
- m.e00 = 1;
- m.e01 = 0;
- m.e02 = 0;
- m.e10 = 0;
- m.e11 = 1;
- m.e12 = 0;
- m.e20 = 0;
- m.e21 = 0;
- m.e22 = 1;
- if(_this14.sizeMat3 == _this14.stackMat3.length) {
- let newArray = new Array(_this14.sizeMat3 << 1);
- let _g = 0;
- let _g1 = _this14.sizeMat3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this14.stackMat3[i];
- _this14.stackMat3[i] = null;
- }
- _this14.stackMat3 = newArray;
- }
- _this14.stackMat3[_this14.sizeMat3++] = m;
- }
- let _this15 = this.p;
- if(ex != null) {
- ex.zero();
- if(_this15.sizeVec3 == _this15.stackVec3.length) {
- let newArray = new Array(_this15.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this15.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this15.stackVec3[i];
- _this15.stackVec3[i] = null;
- }
- _this15.stackVec3 = newArray;
- }
- _this15.stackVec3[_this15.sizeVec3++] = ex;
- }
- let _this16 = this.p;
- if(ey != null) {
- ey.zero();
- if(_this16.sizeVec3 == _this16.stackVec3.length) {
- let newArray = new Array(_this16.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this16.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this16.stackVec3[i];
- _this16.stackVec3[i] = null;
- }
- _this16.stackVec3 = newArray;
- }
- _this16.stackVec3[_this16.sizeVec3++] = ey;
- }
- let _this17 = this.p;
- if(ez != null) {
- ez.zero();
- if(_this17.sizeVec3 == _this17.stackVec3.length) {
- let newArray = new Array(_this17.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this17.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this17.stackVec3[i];
- _this17.stackVec3[i] = null;
- }
- _this17.stackVec3 = newArray;
- }
- _this17.stackVec3[_this17.sizeVec3++] = ez;
- }
- }
- capsule(tf,radius,halfHeight,color) {
- let _this = this.p;
- let ex = _this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3];
- let _this1 = this.p;
- let ey = _this1.sizeVec3 == 0 ? new oimo.common.Vec3() : _this1.stackVec3[--_this1.sizeVec3];
- let _this2 = this.p;
- let ez = _this2.sizeVec3 == 0 ? new oimo.common.Vec3() : _this2.stackVec3[--_this2.sizeVec3];
- let _this3 = this.p;
- let o = _this3.sizeVec3 == 0 ? new oimo.common.Vec3() : _this3.stackVec3[--_this3.sizeVec3];
- let _this4 = this.p;
- let m = _this4.sizeMat3 == 0 ? new oimo.common.Mat3() : _this4.stackMat3[--_this4.sizeMat3];
- let v = o;
- v.x = tf._positionX;
- v.y = tf._positionY;
- v.z = tf._positionZ;
- let m1 = m;
- m1.e00 = tf._rotation00;
- m1.e01 = tf._rotation01;
- m1.e02 = tf._rotation02;
- m1.e10 = tf._rotation10;
- m1.e11 = tf._rotation11;
- m1.e12 = tf._rotation12;
- m1.e20 = tf._rotation20;
- m1.e21 = tf._rotation21;
- m1.e22 = tf._rotation22;
- ex.init(m.e00,m.e10,m.e20);
- ey.init(m.e01,m.e11,m.e21);
- ez.init(m.e02,m.e12,m.e22);
- let vs = this.tmpSphereVerts;
- let ns = this.tmpSphereNorms;
- let _g = 0;
- while(_g < 5) {
- let i2 = _g++;
- let n = this.tmpSphereVerts[i2].length;
- let _g1 = 0;
- while(_g1 < n) {
- let j2 = _g1++;
- let _this = ns[i2][j2];
- let v = this.sphereCoords[i2][j2];
- _this.x = v.x;
- _this.y = v.y;
- _this.z = v.z;
- let y = _this.x * m.e10 + _this.y * m.e11 + _this.z * m.e12;
- let z = _this.x * m.e20 + _this.y * m.e21 + _this.z * m.e22;
- _this.x = _this.x * m.e00 + _this.y * m.e01 + _this.z * m.e02;
- _this.y = y;
- _this.z = z;
- }
- }
- let _g1 = 0;
- while(_g1 < 4) {
- let i = _g1++;
- if(i == 0) {
- let _g = 0;
- while(_g < 3) {
- let i2 = _g++;
- let n = this.tmpSphereVerts[i2].length;
- let _g1 = 0;
- while(_g1 < n) {
- let j2 = _g1++;
- let _this = vs[i2][j2];
- let v = ns[i2][j2];
- _this.x = v.x;
- _this.y = v.y;
- _this.z = v.z;
- _this.x *= radius;
- _this.y *= radius;
- _this.z *= radius;
- _this.x += o.x;
- _this.y += o.y;
- _this.z += o.z;
- _this.x += ey.x * halfHeight;
- _this.y += ey.y * halfHeight;
- _this.z += ey.z * halfHeight;
- }
- }
- }
- if(i == 2) {
- let _g = 2;
- while(_g < 5) {
- let i2 = _g++;
- let n = this.tmpSphereVerts[i2].length;
- let _g1 = 0;
- while(_g1 < n) {
- let j2 = _g1++;
- let _this = vs[i2][j2];
- let v = ns[i2][j2];
- _this.x = v.x;
- _this.y = v.y;
- _this.z = v.z;
- _this.x *= radius;
- _this.y *= radius;
- _this.z *= radius;
- _this.x += o.x;
- _this.y += o.y;
- _this.z += o.z;
- let s = -halfHeight;
- _this.x += ey.x * s;
- _this.y += ey.y * s;
- _this.z += ey.z * s;
- }
- }
- }
- let _g = 0;
- while(_g < 8) {
- let j = _g++;
- let v1;
- let v2;
- let v3;
- let v4;
- let n1;
- let n2;
- let n3;
- let n4;
- if(i == 0) {
- if(this.wireframe) {
- v1 = vs[0][0];
- v2 = vs[1][j];
- this.line(v1,v2,color);
- } else {
- v1 = vs[0][0];
- v2 = vs[1][j];
- v3 = vs[1][(j + 1) % 8];
- n1 = ns[0][0];
- n2 = ns[1][j];
- n3 = ns[1][(j + 1) % 8];
- this.triangle(v1,v2,v3,n1,n2,n3,color);
- }
- } else if(i == 3) {
- if(this.wireframe) {
- v1 = vs[4][0];
- v2 = vs[i][(j + 1) % 8];
- v3 = vs[i][j];
- this.line(v1,v2,color);
- this.line(v2,v3,color);
- } else {
- v1 = vs[4][0];
- v2 = vs[i][(j + 1) % 8];
- v3 = vs[i][j];
- n1 = ns[4][0];
- n2 = ns[i][(j + 1) % 8];
- n3 = ns[i][j];
- this.triangle(v1,v2,v3,n1,n2,n3,color);
- }
- } else if(this.wireframe) {
- v1 = vs[i][j];
- v2 = vs[i][(j + 1) % 8];
- v3 = vs[i + 1][j];
- this.line(v1,v2,color);
- this.line(v1,v3,color);
- } else {
- v1 = vs[i][j];
- v2 = vs[i][(j + 1) % 8];
- v3 = vs[i + 1][j];
- v4 = vs[i + 1][(j + 1) % 8];
- n1 = ns[i][j];
- n2 = ns[i][(j + 1) % 8];
- n3 = ns[i + 1][j];
- n4 = ns[i + 1][(j + 1) % 8];
- this.rect(v1,v3,v4,v2,n1,n3,n4,n2,color);
- }
- }
- }
- let _this5 = this.p;
- let _this6 = _this5.sizeVec3 == 0 ? new oimo.common.Vec3() : _this5.stackVec3[--_this5.sizeVec3];
- _this6.x = o.x;
- _this6.y = o.y;
- _this6.z = o.z;
- let _this7 = _this6;
- _this7.x += ey.x * halfHeight;
- _this7.y += ey.y * halfHeight;
- _this7.z += ey.z * halfHeight;
- let _this8 = this.p;
- let _this9 = _this8.sizeVec3 == 0 ? new oimo.common.Vec3() : _this8.stackVec3[--_this8.sizeVec3];
- _this9.x = o.x;
- _this9.y = o.y;
- _this9.z = o.z;
- let _this10 = _this9;
- let s = -halfHeight;
- _this10.x += ey.x * s;
- _this10.y += ey.y * s;
- _this10.z += ey.z * s;
- if(this.wireframe) {
- let _this = this.p;
- let _this1 = _this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3];
- _this1.x = _this7.x;
- _this1.y = _this7.y;
- _this1.z = _this7.z;
- let _this2 = _this1;
- let s = -radius;
- _this2.x += ex.x * s;
- _this2.y += ex.y * s;
- _this2.z += ex.z * s;
- _this2.x += ez.x * 0;
- _this2.y += ez.y * 0;
- _this2.z += ez.z * 0;
- let _this3 = this.p;
- let _this4 = _this3.sizeVec3 == 0 ? new oimo.common.Vec3() : _this3.stackVec3[--_this3.sizeVec3];
- _this4.x = _this7.x;
- _this4.y = _this7.y;
- _this4.z = _this7.z;
- let _this5 = _this4;
- _this5.x += ex.x * radius;
- _this5.y += ex.y * radius;
- _this5.z += ex.z * radius;
- _this5.x += ez.x * 0;
- _this5.y += ez.y * 0;
- _this5.z += ez.z * 0;
- let _this6 = this.p;
- let _this8 = _this6.sizeVec3 == 0 ? new oimo.common.Vec3() : _this6.stackVec3[--_this6.sizeVec3];
- _this8.x = _this7.x;
- _this8.y = _this7.y;
- _this8.z = _this7.z;
- let _this9 = _this8;
- _this9.x += ex.x * 0;
- _this9.y += ex.y * 0;
- _this9.z += ex.z * 0;
- let s1 = -radius;
- _this9.x += ez.x * s1;
- _this9.y += ez.y * s1;
- _this9.z += ez.z * s1;
- let _this11 = this.p;
- let _this12 = _this11.sizeVec3 == 0 ? new oimo.common.Vec3() : _this11.stackVec3[--_this11.sizeVec3];
- _this12.x = _this7.x;
- _this12.y = _this7.y;
- _this12.z = _this7.z;
- let _this13 = _this12;
- _this13.x += ex.x * 0;
- _this13.y += ex.y * 0;
- _this13.z += ex.z * 0;
- _this13.x += ez.x * radius;
- _this13.y += ez.y * radius;
- _this13.z += ez.z * radius;
- let _this14 = this.p;
- let _this15 = _this14.sizeVec3 == 0 ? new oimo.common.Vec3() : _this14.stackVec3[--_this14.sizeVec3];
- _this15.x = _this10.x;
- _this15.y = _this10.y;
- _this15.z = _this10.z;
- let _this16 = _this15;
- let s2 = -radius;
- _this16.x += ex.x * s2;
- _this16.y += ex.y * s2;
- _this16.z += ex.z * s2;
- _this16.x += ez.x * 0;
- _this16.y += ez.y * 0;
- _this16.z += ez.z * 0;
- let _this17 = this.p;
- let _this18 = _this17.sizeVec3 == 0 ? new oimo.common.Vec3() : _this17.stackVec3[--_this17.sizeVec3];
- _this18.x = _this10.x;
- _this18.y = _this10.y;
- _this18.z = _this10.z;
- let _this19 = _this18;
- _this19.x += ex.x * radius;
- _this19.y += ex.y * radius;
- _this19.z += ex.z * radius;
- _this19.x += ez.x * 0;
- _this19.y += ez.y * 0;
- _this19.z += ez.z * 0;
- let _this20 = this.p;
- let _this21 = _this20.sizeVec3 == 0 ? new oimo.common.Vec3() : _this20.stackVec3[--_this20.sizeVec3];
- _this21.x = _this10.x;
- _this21.y = _this10.y;
- _this21.z = _this10.z;
- let _this22 = _this21;
- _this22.x += ex.x * 0;
- _this22.y += ex.y * 0;
- _this22.z += ex.z * 0;
- let s3 = -radius;
- _this22.x += ez.x * s3;
- _this22.y += ez.y * s3;
- _this22.z += ez.z * s3;
- let _this23 = this.p;
- let _this24 = _this23.sizeVec3 == 0 ? new oimo.common.Vec3() : _this23.stackVec3[--_this23.sizeVec3];
- _this24.x = _this10.x;
- _this24.y = _this10.y;
- _this24.z = _this10.z;
- let _this25 = _this24;
- _this25.x += ex.x * 0;
- _this25.y += ex.y * 0;
- _this25.z += ex.z * 0;
- _this25.x += ez.x * radius;
- _this25.y += ez.y * radius;
- _this25.z += ez.z * radius;
- this.ellipse(_this7,ex,ez,radius,radius,color);
- this.ellipse(_this10,ex,ez,radius,radius,color);
- this.line(_this2,_this16,color);
- this.line(_this5,_this19,color);
- this.line(_this9,_this22,color);
- this.line(_this13,_this25,color);
- let _this26 = this.p;
- if(_this2 != null) {
- _this2.zero();
- if(_this26.sizeVec3 == _this26.stackVec3.length) {
- let newArray = new Array(_this26.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this26.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this26.stackVec3[i];
- _this26.stackVec3[i] = null;
- }
- _this26.stackVec3 = newArray;
- }
- _this26.stackVec3[_this26.sizeVec3++] = _this2;
- }
- let _this27 = this.p;
- if(_this5 != null) {
- _this5.zero();
- if(_this27.sizeVec3 == _this27.stackVec3.length) {
- let newArray = new Array(_this27.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this27.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this27.stackVec3[i];
- _this27.stackVec3[i] = null;
- }
- _this27.stackVec3 = newArray;
- }
- _this27.stackVec3[_this27.sizeVec3++] = _this5;
- }
- let _this28 = this.p;
- if(_this9 != null) {
- _this9.zero();
- if(_this28.sizeVec3 == _this28.stackVec3.length) {
- let newArray = new Array(_this28.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this28.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this28.stackVec3[i];
- _this28.stackVec3[i] = null;
- }
- _this28.stackVec3 = newArray;
- }
- _this28.stackVec3[_this28.sizeVec3++] = _this9;
- }
- let _this29 = this.p;
- if(_this13 != null) {
- _this13.zero();
- if(_this29.sizeVec3 == _this29.stackVec3.length) {
- let newArray = new Array(_this29.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this29.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this29.stackVec3[i];
- _this29.stackVec3[i] = null;
- }
- _this29.stackVec3 = newArray;
- }
- _this29.stackVec3[_this29.sizeVec3++] = _this13;
- }
- let _this30 = this.p;
- if(_this16 != null) {
- _this16.zero();
- if(_this30.sizeVec3 == _this30.stackVec3.length) {
- let newArray = new Array(_this30.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this30.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this30.stackVec3[i];
- _this30.stackVec3[i] = null;
- }
- _this30.stackVec3 = newArray;
- }
- _this30.stackVec3[_this30.sizeVec3++] = _this16;
- }
- let _this31 = this.p;
- if(_this19 != null) {
- _this19.zero();
- if(_this31.sizeVec3 == _this31.stackVec3.length) {
- let newArray = new Array(_this31.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this31.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this31.stackVec3[i];
- _this31.stackVec3[i] = null;
- }
- _this31.stackVec3 = newArray;
- }
- _this31.stackVec3[_this31.sizeVec3++] = _this19;
- }
- let _this32 = this.p;
- if(_this22 != null) {
- _this22.zero();
- if(_this32.sizeVec3 == _this32.stackVec3.length) {
- let newArray = new Array(_this32.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this32.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this32.stackVec3[i];
- _this32.stackVec3[i] = null;
- }
- _this32.stackVec3 = newArray;
- }
- _this32.stackVec3[_this32.sizeVec3++] = _this22;
- }
- let _this33 = this.p;
- if(_this25 != null) {
- _this25.zero();
- if(_this33.sizeVec3 == _this33.stackVec3.length) {
- let newArray = new Array(_this33.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this33.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this33.stackVec3[i];
- _this33.stackVec3[i] = null;
- }
- _this33.stackVec3 = newArray;
- }
- _this33.stackVec3[_this33.sizeVec3++] = _this25;
- }
- } else {
- let _g = 0;
- while(_g < 8) {
- let i = _g++;
- let _this = this.tmpCircleNorms[i];
- let v = this.circleCoords[i];
- _this.x = v.x;
- _this.y = v.y;
- _this.z = v.z;
- let y = _this.x * m.e10 + _this.y * m.e11 + _this.z * m.e12;
- let z = _this.x * m.e20 + _this.y * m.e21 + _this.z * m.e22;
- _this.x = _this.x * m.e00 + _this.y * m.e01 + _this.z * m.e02;
- _this.y = y;
- _this.z = z;
- let _this1 = this.tmpCircleVerts1[i];
- let v1 = this.tmpCircleNorms[i];
- _this1.x = v1.x;
- _this1.y = v1.y;
- _this1.z = v1.z;
- _this1.x *= radius;
- _this1.y *= radius;
- _this1.z *= radius;
- _this1.x += o.x;
- _this1.y += o.y;
- _this1.z += o.z;
- let _this2 = this.tmpCircleVerts2[i];
- let v2 = this.tmpCircleVerts1[i];
- _this2.x = v2.x;
- _this2.y = v2.y;
- _this2.z = v2.z;
- let _this3 = this.tmpCircleVerts1[i];
- _this3.x += ey.x * halfHeight;
- _this3.y += ey.y * halfHeight;
- _this3.z += ey.z * halfHeight;
- let _this4 = this.tmpCircleVerts2[i];
- let s = -halfHeight;
- _this4.x += ey.x * s;
- _this4.y += ey.y * s;
- _this4.z += ey.z * s;
- }
- let _g1 = 0;
- while(_g1 < 8) {
- let i = _g1++;
- let n1 = this.tmpCircleNorms[i];
- let n2 = this.tmpCircleNorms[(i + 1) % 8];
- this.rect(this.tmpCircleVerts1[i],this.tmpCircleVerts2[i],this.tmpCircleVerts2[(i + 1) % 8],this.tmpCircleVerts1[(i + 1) % 8],n1,n1,n2,n2,color);
- }
- }
- let _this11 = this.p;
- if(_this7 != null) {
- _this7.zero();
- if(_this11.sizeVec3 == _this11.stackVec3.length) {
- let newArray = new Array(_this11.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this11.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this11.stackVec3[i];
- _this11.stackVec3[i] = null;
- }
- _this11.stackVec3 = newArray;
- }
- _this11.stackVec3[_this11.sizeVec3++] = _this7;
- }
- let _this12 = this.p;
- if(_this10 != null) {
- _this10.zero();
- if(_this12.sizeVec3 == _this12.stackVec3.length) {
- let newArray = new Array(_this12.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this12.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this12.stackVec3[i];
- _this12.stackVec3[i] = null;
- }
- _this12.stackVec3 = newArray;
- }
- _this12.stackVec3[_this12.sizeVec3++] = _this10;
- }
- let _this13 = this.p;
- if(o != null) {
- o.zero();
- if(_this13.sizeVec3 == _this13.stackVec3.length) {
- let newArray = new Array(_this13.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this13.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this13.stackVec3[i];
- _this13.stackVec3[i] = null;
- }
- _this13.stackVec3 = newArray;
- }
- _this13.stackVec3[_this13.sizeVec3++] = o;
- }
- let _this14 = this.p;
- if(m != null) {
- m.e00 = 1;
- m.e01 = 0;
- m.e02 = 0;
- m.e10 = 0;
- m.e11 = 1;
- m.e12 = 0;
- m.e20 = 0;
- m.e21 = 0;
- m.e22 = 1;
- if(_this14.sizeMat3 == _this14.stackMat3.length) {
- let newArray = new Array(_this14.sizeMat3 << 1);
- let _g = 0;
- let _g1 = _this14.sizeMat3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this14.stackMat3[i];
- _this14.stackMat3[i] = null;
- }
- _this14.stackMat3 = newArray;
- }
- _this14.stackMat3[_this14.sizeMat3++] = m;
- }
- let _this15 = this.p;
- if(ex != null) {
- ex.zero();
- if(_this15.sizeVec3 == _this15.stackVec3.length) {
- let newArray = new Array(_this15.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this15.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this15.stackVec3[i];
- _this15.stackVec3[i] = null;
- }
- _this15.stackVec3 = newArray;
- }
- _this15.stackVec3[_this15.sizeVec3++] = ex;
- }
- let _this16 = this.p;
- if(ey != null) {
- ey.zero();
- if(_this16.sizeVec3 == _this16.stackVec3.length) {
- let newArray = new Array(_this16.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this16.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this16.stackVec3[i];
- _this16.stackVec3[i] = null;
- }
- _this16.stackVec3 = newArray;
- }
- _this16.stackVec3[_this16.sizeVec3++] = ey;
- }
- let _this17 = this.p;
- if(ez != null) {
- ez.zero();
- if(_this17.sizeVec3 == _this17.stackVec3.length) {
- let newArray = new Array(_this17.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this17.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this17.stackVec3[i];
- _this17.stackVec3[i] = null;
- }
- _this17.stackVec3 = newArray;
- }
- _this17.stackVec3[_this17.sizeVec3++] = ez;
- }
- }
- sphere(tf,radius,color) {
- let _this = this.p;
- let o = _this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3];
- let _this1 = this.p;
- let m = _this1.sizeMat3 == 0 ? new oimo.common.Mat3() : _this1.stackMat3[--_this1.sizeMat3];
- let v = o;
- v.x = tf._positionX;
- v.y = tf._positionY;
- v.z = tf._positionZ;
- let m1 = m;
- m1.e00 = tf._rotation00;
- m1.e01 = tf._rotation01;
- m1.e02 = tf._rotation02;
- m1.e10 = tf._rotation10;
- m1.e11 = tf._rotation11;
- m1.e12 = tf._rotation12;
- m1.e20 = tf._rotation20;
- m1.e21 = tf._rotation21;
- m1.e22 = tf._rotation22;
- let vs = this.tmpSphereVerts;
- let ns = this.tmpSphereNorms;
- let _g = 0;
- while(_g < 5) {
- let i = _g++;
- let n = this.tmpSphereVerts[i].length;
- let _g1 = 0;
- while(_g1 < n) {
- let j = _g1++;
- let _this = ns[i][j];
- let v = this.sphereCoords[i][j];
- _this.x = v.x;
- _this.y = v.y;
- _this.z = v.z;
- let y = _this.x * m.e10 + _this.y * m.e11 + _this.z * m.e12;
- let z = _this.x * m.e20 + _this.y * m.e21 + _this.z * m.e22;
- _this.x = _this.x * m.e00 + _this.y * m.e01 + _this.z * m.e02;
- _this.y = y;
- _this.z = z;
- let _this1 = vs[i][j];
- let v1 = ns[i][j];
- _this1.x = v1.x;
- _this1.y = v1.y;
- _this1.z = v1.z;
- _this1.x *= radius;
- _this1.y *= radius;
- _this1.z *= radius;
- _this1.x += o.x;
- _this1.y += o.y;
- _this1.z += o.z;
- }
- }
- let _g1 = 0;
- while(_g1 < 4) {
- let i = _g1++;
- let _g = 0;
- while(_g < 8) {
- let j = _g++;
- let v1;
- let v2;
- let v3;
- let v4;
- let n1;
- let n2;
- let n3;
- let n4;
- if(i == 0) {
- if(this.wireframe) {
- v1 = vs[0][0];
- v2 = vs[1][j];
- this.line(v1,v2,color);
- } else {
- v1 = vs[0][0];
- v2 = vs[1][j];
- v3 = vs[1][(j + 1) % 8];
- n1 = ns[0][0];
- n2 = ns[1][j];
- n3 = ns[1][(j + 1) % 8];
- this.triangle(v1,v2,v3,n1,n2,n3,color);
- }
- } else if(i == 3) {
- if(this.wireframe) {
- v1 = vs[4][0];
- v2 = vs[i][(j + 1) % 8];
- v3 = vs[i][j];
- this.line(v1,v2,color);
- this.line(v2,v3,color);
- } else {
- v1 = vs[4][0];
- v2 = vs[i][(j + 1) % 8];
- v3 = vs[i][j];
- n1 = ns[4][0];
- n2 = ns[i][(j + 1) % 8];
- n3 = ns[i][j];
- this.triangle(v1,v2,v3,n1,n2,n3,color);
- }
- } else if(this.wireframe) {
- v1 = vs[i][j];
- v2 = vs[i][(j + 1) % 8];
- v3 = vs[i + 1][j];
- this.line(v1,v2,color);
- this.line(v1,v3,color);
- } else {
- v1 = vs[i][j];
- v2 = vs[i][(j + 1) % 8];
- v3 = vs[i + 1][j];
- v4 = vs[i + 1][(j + 1) % 8];
- n1 = ns[i][j];
- n2 = ns[i][(j + 1) % 8];
- n3 = ns[i + 1][j];
- n4 = ns[i + 1][(j + 1) % 8];
- this.rect(v1,v3,v4,v2,n1,n3,n4,n2,color);
- }
- }
- }
- let _this2 = this.p;
- if(o != null) {
- o.zero();
- if(_this2.sizeVec3 == _this2.stackVec3.length) {
- let newArray = new Array(_this2.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this2.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this2.stackVec3[i];
- _this2.stackVec3[i] = null;
- }
- _this2.stackVec3 = newArray;
- }
- _this2.stackVec3[_this2.sizeVec3++] = o;
- }
- let _this3 = this.p;
- if(m != null) {
- m.e00 = 1;
- m.e01 = 0;
- m.e02 = 0;
- m.e10 = 0;
- m.e11 = 1;
- m.e12 = 0;
- m.e20 = 0;
- m.e21 = 0;
- m.e22 = 1;
- if(_this3.sizeMat3 == _this3.stackMat3.length) {
- let newArray = new Array(_this3.sizeMat3 << 1);
- let _g = 0;
- let _g1 = _this3.sizeMat3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this3.stackMat3[i];
- _this3.stackMat3[i] = null;
- }
- _this3.stackMat3 = newArray;
- }
- _this3.stackMat3[_this3.sizeMat3++] = m;
- }
- }
- box(tf,halfExtents,color) {
- let _this = this.p;
- let ex = _this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3];
- let _this1 = this.p;
- let ey = _this1.sizeVec3 == 0 ? new oimo.common.Vec3() : _this1.stackVec3[--_this1.sizeVec3];
- let _this2 = this.p;
- let ez = _this2.sizeVec3 == 0 ? new oimo.common.Vec3() : _this2.stackVec3[--_this2.sizeVec3];
- let _this3 = this.p;
- let o = _this3.sizeVec3 == 0 ? new oimo.common.Vec3() : _this3.stackVec3[--_this3.sizeVec3];
- let _this4 = this.p;
- let m = _this4.sizeMat3 == 0 ? new oimo.common.Mat3() : _this4.stackMat3[--_this4.sizeMat3];
- let v = o;
- v.x = tf._positionX;
- v.y = tf._positionY;
- v.z = tf._positionZ;
- let m1 = m;
- m1.e00 = tf._rotation00;
- m1.e01 = tf._rotation01;
- m1.e02 = tf._rotation02;
- m1.e10 = tf._rotation10;
- m1.e11 = tf._rotation11;
- m1.e12 = tf._rotation12;
- m1.e20 = tf._rotation20;
- m1.e21 = tf._rotation21;
- m1.e22 = tf._rotation22;
- ex.init(m.e00,m.e10,m.e20);
- ey.init(m.e01,m.e11,m.e21);
- ez.init(m.e02,m.e12,m.e22);
- let hx = halfExtents.x;
- let hy = halfExtents.y;
- let hz = halfExtents.z;
- let _this5 = this.p;
- let _this6 = _this5.sizeVec3 == 0 ? new oimo.common.Vec3() : _this5.stackVec3[--_this5.sizeVec3];
- _this6.x = o.x;
- _this6.y = o.y;
- _this6.z = o.z;
- let _this7 = _this6;
- let s = -hx;
- _this7.x += ex.x * s;
- _this7.y += ex.y * s;
- _this7.z += ex.z * s;
- let s1 = -hy;
- _this7.x += ey.x * s1;
- _this7.y += ey.y * s1;
- _this7.z += ey.z * s1;
- let s2 = -hz;
- _this7.x += ez.x * s2;
- _this7.y += ez.y * s2;
- _this7.z += ez.z * s2;
- let _this8 = this.p;
- let _this9 = _this8.sizeVec3 == 0 ? new oimo.common.Vec3() : _this8.stackVec3[--_this8.sizeVec3];
- _this9.x = o.x;
- _this9.y = o.y;
- _this9.z = o.z;
- let _this10 = _this9;
- let s3 = -hx;
- _this10.x += ex.x * s3;
- _this10.y += ex.y * s3;
- _this10.z += ex.z * s3;
- let s4 = -hy;
- _this10.x += ey.x * s4;
- _this10.y += ey.y * s4;
- _this10.z += ey.z * s4;
- _this10.x += ez.x * hz;
- _this10.y += ez.y * hz;
- _this10.z += ez.z * hz;
- let _this11 = this.p;
- let _this12 = _this11.sizeVec3 == 0 ? new oimo.common.Vec3() : _this11.stackVec3[--_this11.sizeVec3];
- _this12.x = o.x;
- _this12.y = o.y;
- _this12.z = o.z;
- let _this13 = _this12;
- let s5 = -hx;
- _this13.x += ex.x * s5;
- _this13.y += ex.y * s5;
- _this13.z += ex.z * s5;
- _this13.x += ey.x * hy;
- _this13.y += ey.y * hy;
- _this13.z += ey.z * hy;
- let s6 = -hz;
- _this13.x += ez.x * s6;
- _this13.y += ez.y * s6;
- _this13.z += ez.z * s6;
- let _this14 = this.p;
- let _this15 = _this14.sizeVec3 == 0 ? new oimo.common.Vec3() : _this14.stackVec3[--_this14.sizeVec3];
- _this15.x = o.x;
- _this15.y = o.y;
- _this15.z = o.z;
- let _this16 = _this15;
- let s7 = -hx;
- _this16.x += ex.x * s7;
- _this16.y += ex.y * s7;
- _this16.z += ex.z * s7;
- _this16.x += ey.x * hy;
- _this16.y += ey.y * hy;
- _this16.z += ey.z * hy;
- _this16.x += ez.x * hz;
- _this16.y += ez.y * hz;
- _this16.z += ez.z * hz;
- let _this17 = this.p;
- let _this18 = _this17.sizeVec3 == 0 ? new oimo.common.Vec3() : _this17.stackVec3[--_this17.sizeVec3];
- _this18.x = o.x;
- _this18.y = o.y;
- _this18.z = o.z;
- let _this19 = _this18;
- _this19.x += ex.x * hx;
- _this19.y += ex.y * hx;
- _this19.z += ex.z * hx;
- let s8 = -hy;
- _this19.x += ey.x * s8;
- _this19.y += ey.y * s8;
- _this19.z += ey.z * s8;
- let s9 = -hz;
- _this19.x += ez.x * s9;
- _this19.y += ez.y * s9;
- _this19.z += ez.z * s9;
- let _this20 = this.p;
- let _this21 = _this20.sizeVec3 == 0 ? new oimo.common.Vec3() : _this20.stackVec3[--_this20.sizeVec3];
- _this21.x = o.x;
- _this21.y = o.y;
- _this21.z = o.z;
- let _this22 = _this21;
- _this22.x += ex.x * hx;
- _this22.y += ex.y * hx;
- _this22.z += ex.z * hx;
- let s10 = -hy;
- _this22.x += ey.x * s10;
- _this22.y += ey.y * s10;
- _this22.z += ey.z * s10;
- _this22.x += ez.x * hz;
- _this22.y += ez.y * hz;
- _this22.z += ez.z * hz;
- let _this23 = this.p;
- let _this24 = _this23.sizeVec3 == 0 ? new oimo.common.Vec3() : _this23.stackVec3[--_this23.sizeVec3];
- _this24.x = o.x;
- _this24.y = o.y;
- _this24.z = o.z;
- let _this25 = _this24;
- _this25.x += ex.x * hx;
- _this25.y += ex.y * hx;
- _this25.z += ex.z * hx;
- _this25.x += ey.x * hy;
- _this25.y += ey.y * hy;
- _this25.z += ey.z * hy;
- let s11 = -hz;
- _this25.x += ez.x * s11;
- _this25.y += ez.y * s11;
- _this25.z += ez.z * s11;
- let _this26 = this.p;
- let _this27 = _this26.sizeVec3 == 0 ? new oimo.common.Vec3() : _this26.stackVec3[--_this26.sizeVec3];
- _this27.x = o.x;
- _this27.y = o.y;
- _this27.z = o.z;
- let _this28 = _this27;
- _this28.x += ex.x * hx;
- _this28.y += ex.y * hx;
- _this28.z += ex.z * hx;
- _this28.x += ey.x * hy;
- _this28.y += ey.y * hy;
- _this28.z += ey.z * hy;
- _this28.x += ez.x * hz;
- _this28.y += ez.y * hz;
- _this28.z += ez.z * hz;
- if(this.wireframe) {
- this.line(_this7,_this10,color);
- this.line(_this13,_this16,color);
- this.line(_this19,_this22,color);
- this.line(_this25,_this28,color);
- this.line(_this7,_this13,color);
- this.line(_this10,_this16,color);
- this.line(_this19,_this25,color);
- this.line(_this22,_this28,color);
- this.line(_this7,_this19,color);
- this.line(_this10,_this22,color);
- this.line(_this13,_this25,color);
- this.line(_this16,_this28,color);
- } else {
- let _this = this.p;
- let _this1 = _this.sizeVec3 == 0 ? new oimo.common.Vec3() : _this.stackVec3[--_this.sizeVec3];
- _this1.x = ex.x;
- _this1.y = ex.y;
- _this1.z = ex.z;
- let _this2 = _this1;
- _this2.x = -_this2.x;
- _this2.y = -_this2.y;
- _this2.z = -_this2.z;
- let _this3 = this.p;
- let _this4 = _this3.sizeVec3 == 0 ? new oimo.common.Vec3() : _this3.stackVec3[--_this3.sizeVec3];
- _this4.x = ey.x;
- _this4.y = ey.y;
- _this4.z = ey.z;
- let _this5 = _this4;
- _this5.x = -_this5.x;
- _this5.y = -_this5.y;
- _this5.z = -_this5.z;
- let _this6 = this.p;
- let _this8 = _this6.sizeVec3 == 0 ? new oimo.common.Vec3() : _this6.stackVec3[--_this6.sizeVec3];
- _this8.x = ez.x;
- _this8.y = ez.y;
- _this8.z = ez.z;
- let _this9 = _this8;
- _this9.x = -_this9.x;
- _this9.y = -_this9.y;
- _this9.z = -_this9.z;
- this.rect(_this7,_this10,_this16,_this13,_this2,_this2,_this2,_this2,color);
- this.rect(_this19,_this25,_this28,_this22,ex,ex,ex,ex,color);
- this.rect(_this7,_this19,_this22,_this10,_this5,_this5,_this5,_this5,color);
- this.rect(_this13,_this16,_this28,_this25,ey,ey,ey,ey,color);
- this.rect(_this7,_this13,_this25,_this19,_this9,_this9,_this9,_this9,color);
- this.rect(_this10,_this22,_this28,_this16,ez,ez,ez,ez,color);
- let _this11 = this.p;
- if(_this2 != null) {
- _this2.zero();
- if(_this11.sizeVec3 == _this11.stackVec3.length) {
- let newArray = new Array(_this11.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this11.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this11.stackVec3[i];
- _this11.stackVec3[i] = null;
- }
- _this11.stackVec3 = newArray;
- }
- _this11.stackVec3[_this11.sizeVec3++] = _this2;
- }
- let _this12 = this.p;
- if(_this5 != null) {
- _this5.zero();
- if(_this12.sizeVec3 == _this12.stackVec3.length) {
- let newArray = new Array(_this12.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this12.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this12.stackVec3[i];
- _this12.stackVec3[i] = null;
- }
- _this12.stackVec3 = newArray;
- }
- _this12.stackVec3[_this12.sizeVec3++] = _this5;
- }
- let _this14 = this.p;
- if(_this9 != null) {
- _this9.zero();
- if(_this14.sizeVec3 == _this14.stackVec3.length) {
- let newArray = new Array(_this14.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this14.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this14.stackVec3[i];
- _this14.stackVec3[i] = null;
- }
- _this14.stackVec3 = newArray;
- }
- _this14.stackVec3[_this14.sizeVec3++] = _this9;
- }
- }
- let _this29 = this.p;
- if(_this7 != null) {
- _this7.zero();
- if(_this29.sizeVec3 == _this29.stackVec3.length) {
- let newArray = new Array(_this29.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this29.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this29.stackVec3[i];
- _this29.stackVec3[i] = null;
- }
- _this29.stackVec3 = newArray;
- }
- _this29.stackVec3[_this29.sizeVec3++] = _this7;
- }
- let _this30 = this.p;
- if(_this10 != null) {
- _this10.zero();
- if(_this30.sizeVec3 == _this30.stackVec3.length) {
- let newArray = new Array(_this30.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this30.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this30.stackVec3[i];
- _this30.stackVec3[i] = null;
- }
- _this30.stackVec3 = newArray;
- }
- _this30.stackVec3[_this30.sizeVec3++] = _this10;
- }
- let _this31 = this.p;
- if(_this13 != null) {
- _this13.zero();
- if(_this31.sizeVec3 == _this31.stackVec3.length) {
- let newArray = new Array(_this31.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this31.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this31.stackVec3[i];
- _this31.stackVec3[i] = null;
- }
- _this31.stackVec3 = newArray;
- }
- _this31.stackVec3[_this31.sizeVec3++] = _this13;
- }
- let _this32 = this.p;
- if(_this16 != null) {
- _this16.zero();
- if(_this32.sizeVec3 == _this32.stackVec3.length) {
- let newArray = new Array(_this32.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this32.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this32.stackVec3[i];
- _this32.stackVec3[i] = null;
- }
- _this32.stackVec3 = newArray;
- }
- _this32.stackVec3[_this32.sizeVec3++] = _this16;
- }
- let _this33 = this.p;
- if(_this19 != null) {
- _this19.zero();
- if(_this33.sizeVec3 == _this33.stackVec3.length) {
- let newArray = new Array(_this33.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this33.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this33.stackVec3[i];
- _this33.stackVec3[i] = null;
- }
- _this33.stackVec3 = newArray;
- }
- _this33.stackVec3[_this33.sizeVec3++] = _this19;
- }
- let _this34 = this.p;
- if(_this22 != null) {
- _this22.zero();
- if(_this34.sizeVec3 == _this34.stackVec3.length) {
- let newArray = new Array(_this34.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this34.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this34.stackVec3[i];
- _this34.stackVec3[i] = null;
- }
- _this34.stackVec3 = newArray;
- }
- _this34.stackVec3[_this34.sizeVec3++] = _this22;
- }
- let _this35 = this.p;
- if(_this25 != null) {
- _this25.zero();
- if(_this35.sizeVec3 == _this35.stackVec3.length) {
- let newArray = new Array(_this35.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this35.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this35.stackVec3[i];
- _this35.stackVec3[i] = null;
- }
- _this35.stackVec3 = newArray;
- }
- _this35.stackVec3[_this35.sizeVec3++] = _this25;
- }
- let _this36 = this.p;
- if(_this28 != null) {
- _this28.zero();
- if(_this36.sizeVec3 == _this36.stackVec3.length) {
- let newArray = new Array(_this36.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this36.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this36.stackVec3[i];
- _this36.stackVec3[i] = null;
- }
- _this36.stackVec3 = newArray;
- }
- _this36.stackVec3[_this36.sizeVec3++] = _this28;
- }
- let _this37 = this.p;
- if(o != null) {
- o.zero();
- if(_this37.sizeVec3 == _this37.stackVec3.length) {
- let newArray = new Array(_this37.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this37.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this37.stackVec3[i];
- _this37.stackVec3[i] = null;
- }
- _this37.stackVec3 = newArray;
- }
- _this37.stackVec3[_this37.sizeVec3++] = o;
- }
- let _this38 = this.p;
- if(m != null) {
- m.e00 = 1;
- m.e01 = 0;
- m.e02 = 0;
- m.e10 = 0;
- m.e11 = 1;
- m.e12 = 0;
- m.e20 = 0;
- m.e21 = 0;
- m.e22 = 1;
- if(_this38.sizeMat3 == _this38.stackMat3.length) {
- let newArray = new Array(_this38.sizeMat3 << 1);
- let _g = 0;
- let _g1 = _this38.sizeMat3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this38.stackMat3[i];
- _this38.stackMat3[i] = null;
- }
- _this38.stackMat3 = newArray;
- }
- _this38.stackMat3[_this38.sizeMat3++] = m;
- }
- let _this39 = this.p;
- if(ex != null) {
- ex.zero();
- if(_this39.sizeVec3 == _this39.stackVec3.length) {
- let newArray = new Array(_this39.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this39.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this39.stackVec3[i];
- _this39.stackVec3[i] = null;
- }
- _this39.stackVec3 = newArray;
- }
- _this39.stackVec3[_this39.sizeVec3++] = ex;
- }
- let _this40 = this.p;
- if(ey != null) {
- ey.zero();
- if(_this40.sizeVec3 == _this40.stackVec3.length) {
- let newArray = new Array(_this40.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this40.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this40.stackVec3[i];
- _this40.stackVec3[i] = null;
- }
- _this40.stackVec3 = newArray;
- }
- _this40.stackVec3[_this40.sizeVec3++] = ey;
- }
- let _this41 = this.p;
- if(ez != null) {
- ez.zero();
- if(_this41.sizeVec3 == _this41.stackVec3.length) {
- let newArray = new Array(_this41.sizeVec3 << 1);
- let _g = 0;
- let _g1 = _this41.sizeVec3;
- while(_g < _g1) {
- let i = _g++;
- newArray[i] = _this41.stackVec3[i];
- _this41.stackVec3[i] = null;
- }
- _this41.stackVec3 = newArray;
- }
- _this41.stackVec3[_this41.sizeVec3++] = ez;
- }
- }
- rect(v1,v2,v3,v4,n1,n2,n3,n4,color) {
- this.triangle(v1,v2,v3,n1,n2,n3,color);
- this.triangle(v1,v3,v4,n1,n3,n4,color);
- }
- point(v,color) {
- }
- triangle(v1,v2,v3,n1,n2,n3,color) {
- }
- line(v1,v2,color) {
- }
- }
- oimo.dynamics.common.DebugDrawStyle = class oimo_dynamics_common_DebugDrawStyle {
- constructor() {
- this.basisColorZ = new oimo.common.Vec3(0.0,0.0,1.0);
- this.basisColorY = new oimo.common.Vec3(0.0,1.0,0.0);
- this.basisColorX = new oimo.common.Vec3(1.0,0.0,0.0);
- this.basisLength = 0.5;
- this.jointRotationalConstraintRadius = 0.3;
- this.jointErrorColor = new oimo.common.Vec3(1.0,0.1,0.1);
- this.jointLineColor = new oimo.common.Vec3(0.8,0.8,0.8);
- this.contactBinormalLength = 0.5;
- this.contactTangentLength = 0.5;
- this.contactNormalLength = 0.5;
- this.contactBinormalColor = new oimo.common.Vec3(0.2,0.2,1.0);
- this.contactTangentColor = new oimo.common.Vec3(0.1,0.8,0.1);
- this.contactNormalColor = new oimo.common.Vec3(1.0,0.1,0.1);
- this.disabledContactColor = new oimo.common.Vec3(0.5,0.1,0.1);
- this.newContactColor = new oimo.common.Vec3(1.0,1.0,0.1);
- this.contactColor4 = new oimo.common.Vec3(0.8,0.1,1.0);
- this.contactColor3 = new oimo.common.Vec3(0.1,0.8,0.6);
- this.contactColor2 = new oimo.common.Vec3(1.0,0.6,0.1);
- this.contactColor = new oimo.common.Vec3(1.0,0.1,0.1);
- this.pairColor = new oimo.common.Vec3(1.0,1.0,0.1);
- this.bvhNodeColor = new oimo.common.Vec3(0.4,0.4,0.4);
- this.aabbColor = new oimo.common.Vec3(1.0,0.1,0.1);
- this.kinematicShapeColor = new oimo.common.Vec3(1.0,0.5,0.1);
- this.staticShapeColor = new oimo.common.Vec3(0.7,0.7,0.7);
- this.sleepingShapeColor2 = new oimo.common.Vec3(0.2,0.8,0.5);
- this.sleepingShapeColor1 = new oimo.common.Vec3(0.3,0.3,0.8);
- this.sleepyShapeColor2 = new oimo.common.Vec3(0.6,0.8,0.3);
- this.sleepyShapeColor1 = new oimo.common.Vec3(0.5,0.25,0.6);
- this.shapeColor2 = new oimo.common.Vec3(1.0,0.8,0.1);
- this.shapeColor1 = new oimo.common.Vec3(0.7,0.2,0.4);
- }
- }
- oimo.dynamics.common.Performance = class oimo_dynamics_common_Performance {
- }
- if(!oimo.dynamics.constraint) oimo.dynamics.constraint = {};
- oimo.dynamics.constraint.ConstraintSolver = class oimo_dynamics_constraint_ConstraintSolver {
- constructor() {
- this._b1 = null;
- this._b2 = null;
- this._addedToIsland = false;
- }
- preSolveVelocity(timeStep) {
- }
- warmStart(timeStep) {
- }
- solveVelocity() {
- }
- postSolveVelocity(timeStep) {
- }
- preSolvePosition(timeStep) {
- }
- solvePositionSplitImpulse() {
- }
- solvePositionNgs(timeStep) {
- }
- postSolve() {
- }
- }
- oimo.dynamics.constraint.PositionCorrectionAlgorithm = class oimo_dynamics_constraint_PositionCorrectionAlgorithm {
- }
- if(!oimo.dynamics.constraint.contact) oimo.dynamics.constraint.contact = {};
- oimo.dynamics.constraint.contact.ContactConstraint = class oimo_dynamics_constraint_contact_ContactConstraint {
- constructor(manifold) {
- this._solver = new oimo.dynamics.constraint.solver.pgs.PgsContactConstraintSolver(this);
- this._manifold = manifold;
- }
- _getVelocitySolverInfo(timeStep,info) {
- info.b1 = this._b1;
- info.b2 = this._b2;
- let normalX;
- let normalY;
- let normalZ;
- let tangentX;
- let tangentY;
- let tangentZ;
- let binormalX;
- let binormalY;
- let binormalZ;
- normalX = this._manifold._normalX;
- normalY = this._manifold._normalY;
- normalZ = this._manifold._normalZ;
- tangentX = this._manifold._tangentX;
- tangentY = this._manifold._tangentY;
- tangentZ = this._manifold._tangentZ;
- binormalX = this._manifold._binormalX;
- binormalY = this._manifold._binormalY;
- binormalZ = this._manifold._binormalZ;
- let friction = Math.sqrt(this._s1._friction * this._s2._friction);
- let restitution = Math.sqrt(this._s1._restitution * this._s2._restitution);
- let num = this._manifold._numPoints;
- info.numRows = 0;
- let _g = 0;
- while(_g < num) {
- let p = this._manifold._points[_g++];
- if(p._depth < 0) {
- p._disabled = true;
- let _this = p._impulse;
- _this.impulseN = 0;
- _this.impulseT = 0;
- _this.impulseB = 0;
- _this.impulseP = 0;
- _this.impulseLX = 0;
- _this.impulseLY = 0;
- _this.impulseLZ = 0;
- continue;
- } else {
- p._disabled = false;
- }
- let row = info.rows[info.numRows++];
- row.friction = friction;
- row.cfm = 0;
- let j = row.jacobianN;
- j.lin1X = normalX;
- j.lin1Y = normalY;
- j.lin1Z = normalZ;
- j.lin2X = normalX;
- j.lin2Y = normalY;
- j.lin2Z = normalZ;
- j.ang1X = p._relPos1Y * normalZ - p._relPos1Z * normalY;
- j.ang1Y = p._relPos1Z * normalX - p._relPos1X * normalZ;
- j.ang1Z = p._relPos1X * normalY - p._relPos1Y * normalX;
- j.ang2X = p._relPos2Y * normalZ - p._relPos2Z * normalY;
- j.ang2Y = p._relPos2Z * normalX - p._relPos2X * normalZ;
- j.ang2Z = p._relPos2X * normalY - p._relPos2Y * normalX;
- j = row.jacobianT;
- j.lin1X = tangentX;
- j.lin1Y = tangentY;
- j.lin1Z = tangentZ;
- j.lin2X = tangentX;
- j.lin2Y = tangentY;
- j.lin2Z = tangentZ;
- j.ang1X = p._relPos1Y * tangentZ - p._relPos1Z * tangentY;
- j.ang1Y = p._relPos1Z * tangentX - p._relPos1X * tangentZ;
- j.ang1Z = p._relPos1X * tangentY - p._relPos1Y * tangentX;
- j.ang2X = p._relPos2Y * tangentZ - p._relPos2Z * tangentY;
- j.ang2Y = p._relPos2Z * tangentX - p._relPos2X * tangentZ;
- j.ang2Z = p._relPos2X * tangentY - p._relPos2Y * tangentX;
- j = row.jacobianB;
- j.lin1X = binormalX;
- j.lin1Y = binormalY;
- j.lin1Z = binormalZ;
- j.lin2X = binormalX;
- j.lin2Y = binormalY;
- j.lin2Z = binormalZ;
- j.ang1X = p._relPos1Y * binormalZ - p._relPos1Z * binormalY;
- j.ang1Y = p._relPos1Z * binormalX - p._relPos1X * binormalZ;
- j.ang1Z = p._relPos1X * binormalY - p._relPos1Y * binormalX;
- j.ang2X = p._relPos2Y * binormalZ - p._relPos2Z * binormalY;
- j.ang2Y = p._relPos2Z * binormalX - p._relPos2X * binormalZ;
- j.ang2Z = p._relPos2X * binormalY - p._relPos2Y * binormalX;
- j = row.jacobianN;
- let rvn = j.lin1X * this._b1._velX + j.lin1Y * this._b1._velY + j.lin1Z * this._b1._velZ + (j.ang1X * this._b1._angVelX + j.ang1Y * this._b1._angVelY + j.ang1Z * this._b1._angVelZ) - (j.lin2X * this._b2._velX + j.lin2Y * this._b2._velY + j.lin2Z * this._b2._velZ + (j.ang2X * this._b2._angVelX + j.ang2Y * this._b2._angVelY + j.ang2Z * this._b2._angVelZ));
- if(rvn < -oimo.common.Setting.contactEnableBounceThreshold && !p._warmStarted) {
- row.rhs = -rvn * restitution;
- } else {
- row.rhs = 0;
- }
- if(this._positionCorrectionAlgorithm == oimo.dynamics.constraint.PositionCorrectionAlgorithm.BAUMGARTE) {
- if(p._depth > oimo.common.Setting.linearSlop) {
- let minRhs = (p._depth - oimo.common.Setting.linearSlop) * oimo.common.Setting.velocityBaumgarte * timeStep.invDt;
- if(row.rhs < minRhs) {
- row.rhs = minRhs;
- }
- }
- }
- if(!p._warmStarted) {
- let _this = p._impulse;
- _this.impulseN = 0;
- _this.impulseT = 0;
- _this.impulseB = 0;
- _this.impulseP = 0;
- _this.impulseLX = 0;
- _this.impulseLY = 0;
- _this.impulseLZ = 0;
- }
- row.impulse = p._impulse;
- }
- }
- _getPositionSolverInfo(info) {
- info.b1 = this._b1;
- info.b2 = this._b2;
- let normalX;
- let normalY;
- let normalZ;
- normalX = this._manifold._normalX;
- normalY = this._manifold._normalY;
- normalZ = this._manifold._normalZ;
- let num = this._manifold._numPoints;
- info.numRows = 0;
- let _g = 0;
- while(_g < num) {
- let p = this._manifold._points[_g++];
- if(p._disabled) {
- continue;
- }
- let row = info.rows[info.numRows++];
- let j = row.jacobianN;
- j.lin1X = normalX;
- j.lin1Y = normalY;
- j.lin1Z = normalZ;
- j.lin2X = normalX;
- j.lin2Y = normalY;
- j.lin2Z = normalZ;
- j.ang1X = p._relPos1Y * normalZ - p._relPos1Z * normalY;
- j.ang1Y = p._relPos1Z * normalX - p._relPos1X * normalZ;
- j.ang1Z = p._relPos1X * normalY - p._relPos1Y * normalX;
- j.ang2X = p._relPos2Y * normalZ - p._relPos2Z * normalY;
- j.ang2Y = p._relPos2Z * normalX - p._relPos2X * normalZ;
- j.ang2Z = p._relPos2X * normalY - p._relPos2Y * normalX;
- row.rhs = p._depth - oimo.common.Setting.linearSlop;
- if(row.rhs < 0) {
- row.rhs = 0;
- }
- row.impulse = p._impulse;
- }
- }
- _syncManifold() {
- this._manifold._updateDepthsAndPositions(this._tf1,this._tf2);
- }
- getShape1() {
- return this._s1;
- }
- getShape2() {
- return this._s2;
- }
- getManifold() {
- return this._manifold;
- }
- isTouching() {
- let _g = 0;
- let _g1 = this._manifold._numPoints;
- while(_g < _g1) if(this._manifold._points[_g++]._depth >= 0) {
- return true;
- }
- return false;
- }
- }
- oimo.dynamics.constraint.contact.ContactImpulse = class oimo_dynamics_constraint_contact_ContactImpulse {
- constructor() {
- this.impulseN = 0;
- this.impulseT = 0;
- this.impulseB = 0;
- this.impulseP = 0;
- this.impulseLX = 0;
- this.impulseLY = 0;
- this.impulseLZ = 0;
- }
- copyFrom(imp) {
- this.impulseN = imp.impulseN;
- this.impulseT = imp.impulseT;
- this.impulseB = imp.impulseB;
- this.impulseLX = imp.impulseLX;
- this.impulseLY = imp.impulseLY;
- this.impulseLZ = imp.impulseLZ;
- }
- }
- oimo.dynamics.constraint.contact.Manifold = class oimo_dynamics_constraint_contact_Manifold {
- constructor() {
- this._normalX = 0;
- this._normalY = 0;
- this._normalZ = 0;
- this._tangentX = 0;
- this._tangentY = 0;
- this._tangentZ = 0;
- this._binormalX = 0;
- this._binormalY = 0;
- this._binormalZ = 0;
- this._numPoints = 0;
- this._points = new Array(oimo.common.Setting.maxManifoldPoints);
- let _g = 0;
- let _g1 = oimo.common.Setting.maxManifoldPoints;
- while(_g < _g1) this._points[_g++] = new oimo.dynamics.constraint.contact.ManifoldPoint();
- }
- _clear() {
- let _g = 0;
- let _g1 = this._numPoints;
- while(_g < _g1) {
- let _this = this._points[_g++];
- _this._localPos1X = 0;
- _this._localPos1Y = 0;
- _this._localPos1Z = 0;
- _this._localPos2X = 0;
- _this._localPos2Y = 0;
- _this._localPos2Z = 0;
- _this._relPos1X = 0;
- _this._relPos1Y = 0;
- _this._relPos1Z = 0;
- _this._relPos2X = 0;
- _this._relPos2Y = 0;
- _this._relPos2Z = 0;
- _this._pos1X = 0;
- _this._pos1Y = 0;
- _this._pos1Z = 0;
- _this._pos2X = 0;
- _this._pos2Y = 0;
- _this._pos2Z = 0;
- _this._depth = 0;
- let _this1 = _this._impulse;
- _this1.impulseN = 0;
- _this1.impulseT = 0;
- _this1.impulseB = 0;
- _this1.impulseP = 0;
- _this1.impulseLX = 0;
- _this1.impulseLY = 0;
- _this1.impulseLZ = 0;
- _this._warmStarted = false;
- _this._disabled = false;
- _this._id = -1;
- }
- this._numPoints = 0;
- }
- _buildBasis(normal) {
- this._normalX = normal.x;
- this._normalY = normal.y;
- this._normalZ = normal.z;
- let nx = normal.x;
- let ny = normal.y;
- let nz = normal.z;
- let nx2 = nx * nx;
- let ny2 = ny * ny;
- let nz2 = nz * nz;
- let tx;
- let ty;
- let tz;
- let bx;
- let by;
- let bz;
- if(nx2 < ny2) {
- if(nx2 < nz2) {
- let invL = 1 / Math.sqrt(ny2 + nz2);
- tx = 0;
- ty = -nz * invL;
- tz = ny * invL;
- bx = ny * tz - nz * ty;
- by = -nx * tz;
- bz = nx * ty;
- } else {
- let invL = 1 / Math.sqrt(nx2 + ny2);
- tx = -ny * invL;
- ty = nx * invL;
- tz = 0;
- bx = -nz * ty;
- by = nz * tx;
- bz = nx * ty - ny * tx;
- }
- } else if(ny2 < nz2) {
- let invL = 1 / Math.sqrt(nx2 + nz2);
- tx = nz * invL;
- ty = 0;
- tz = -nx * invL;
- bx = ny * tz;
- by = nz * tx - nx * tz;
- bz = -ny * tx;
- } else {
- let invL = 1 / Math.sqrt(nx2 + ny2);
- tx = -ny * invL;
- ty = nx * invL;
- tz = 0;
- bx = -nz * ty;
- by = nz * tx;
- bz = nx * ty - ny * tx;
- }
- this._tangentX = tx;
- this._tangentY = ty;
- this._tangentZ = tz;
- this._binormalX = bx;
- this._binormalY = by;
- this._binormalZ = bz;
- }
- _updateDepthsAndPositions(tf1,tf2) {
- let _g = 0;
- let _g1 = this._numPoints;
- while(_g < _g1) {
- let p = this._points[_g++];
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = tf1._rotation00 * p._localPos1X + tf1._rotation01 * p._localPos1Y + tf1._rotation02 * p._localPos1Z;
- __tmp__Y = tf1._rotation10 * p._localPos1X + tf1._rotation11 * p._localPos1Y + tf1._rotation12 * p._localPos1Z;
- __tmp__Z = tf1._rotation20 * p._localPos1X + tf1._rotation21 * p._localPos1Y + tf1._rotation22 * p._localPos1Z;
- p._relPos1X = __tmp__X;
- p._relPos1Y = __tmp__Y;
- p._relPos1Z = __tmp__Z;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = tf2._rotation00 * p._localPos2X + tf2._rotation01 * p._localPos2Y + tf2._rotation02 * p._localPos2Z;
- __tmp__Y1 = tf2._rotation10 * p._localPos2X + tf2._rotation11 * p._localPos2Y + tf2._rotation12 * p._localPos2Z;
- __tmp__Z1 = tf2._rotation20 * p._localPos2X + tf2._rotation21 * p._localPos2Y + tf2._rotation22 * p._localPos2Z;
- p._relPos2X = __tmp__X1;
- p._relPos2Y = __tmp__Y1;
- p._relPos2Z = __tmp__Z1;
- p._pos1X = p._relPos1X + tf1._positionX;
- p._pos1Y = p._relPos1Y + tf1._positionY;
- p._pos1Z = p._relPos1Z + tf1._positionZ;
- p._pos2X = p._relPos2X + tf2._positionX;
- p._pos2Y = p._relPos2Y + tf2._positionY;
- p._pos2Z = p._relPos2Z + tf2._positionZ;
- let diffX;
- let diffY;
- let diffZ;
- diffX = p._pos1X - p._pos2X;
- diffY = p._pos1Y - p._pos2Y;
- diffZ = p._pos1Z - p._pos2Z;
- p._depth = -(diffX * this._normalX + diffY * this._normalY + diffZ * this._normalZ);
- }
- }
- getNormal() {
- let v = new oimo.common.Vec3();
- v.x = this._normalX;
- v.y = this._normalY;
- v.z = this._normalZ;
- return v;
- }
- getNormalTo(normal) {
- normal.x = this._normalX;
- normal.y = this._normalY;
- normal.z = this._normalZ;
- }
- getTangent() {
- let v = new oimo.common.Vec3();
- v.x = this._tangentX;
- v.y = this._tangentY;
- v.z = this._tangentZ;
- return v;
- }
- getTangentTo(tangent) {
- tangent.x = this._tangentX;
- tangent.y = this._tangentY;
- tangent.z = this._tangentZ;
- }
- getBinormal() {
- let v = new oimo.common.Vec3();
- v.x = this._binormalX;
- v.y = this._binormalY;
- v.z = this._binormalZ;
- return v;
- }
- getBinormalTo(binormal) {
- binormal.x = this._binormalX;
- binormal.y = this._binormalY;
- binormal.z = this._binormalZ;
- }
- getPoints() {
- return this._points;
- }
- getNumPoints() {
- return this._numPoints;
- }
- }
- oimo.dynamics.constraint.contact.ManifoldPoint = class oimo_dynamics_constraint_contact_ManifoldPoint {
- constructor() {
- this._localPos1X = 0;
- this._localPos1Y = 0;
- this._localPos1Z = 0;
- this._localPos2X = 0;
- this._localPos2Y = 0;
- this._localPos2Z = 0;
- this._relPos1X = 0;
- this._relPos1Y = 0;
- this._relPos1Z = 0;
- this._relPos2X = 0;
- this._relPos2Y = 0;
- this._relPos2Z = 0;
- this._pos1X = 0;
- this._pos1Y = 0;
- this._pos1Z = 0;
- this._pos2X = 0;
- this._pos2Y = 0;
- this._pos2Z = 0;
- this._depth = 0;
- this._impulse = new oimo.dynamics.constraint.contact.ContactImpulse();
- this._warmStarted = false;
- this._disabled = false;
- this._id = -1;
- }
- getPosition1() {
- let v = new oimo.common.Vec3();
- v.x = this._pos1X;
- v.y = this._pos1Y;
- v.z = this._pos1Z;
- return v;
- }
- getPosition1To(position) {
- position.x = this._pos1X;
- position.y = this._pos1Y;
- position.z = this._pos1Z;
- }
- getPosition2() {
- let v = new oimo.common.Vec3();
- v.x = this._pos2X;
- v.y = this._pos2Y;
- v.z = this._pos2Z;
- return v;
- }
- getPosition2To(position) {
- position.x = this._pos2X;
- position.y = this._pos2Y;
- position.z = this._pos2Z;
- }
- getDepth() {
- return this._depth;
- }
- isWarmStarted() {
- return this._warmStarted;
- }
- getNormalImpulse() {
- return this._impulse.impulseN;
- }
- getTangentImpulse() {
- return this._impulse.impulseT;
- }
- getBinormalImpulse() {
- return this._impulse.impulseB;
- }
- isEnabled() {
- return !this._disabled;
- }
- }
- oimo.dynamics.constraint.contact.ManifoldUpdater = class oimo_dynamics_constraint_contact_ManifoldUpdater {
- constructor(manifold) {
- this._manifold = manifold;
- this.numOldPoints = 0;
- this.oldPoints = new Array(oimo.common.Setting.maxManifoldPoints);
- let _g = 0;
- let _g1 = oimo.common.Setting.maxManifoldPoints;
- while(_g < _g1) this.oldPoints[_g++] = new oimo.dynamics.constraint.contact.ManifoldPoint();
- }
- removeOutdatedPoints() {
- let index = this._manifold._numPoints;
- while(--index >= 0) {
- let p = this._manifold._points[index];
- let diffX;
- let diffY;
- let diffZ;
- diffX = p._pos1X - p._pos2X;
- diffY = p._pos1Y - p._pos2Y;
- diffZ = p._pos1Z - p._pos2Z;
- let dotN = this._manifold._normalX * diffX + this._manifold._normalY * diffY + this._manifold._normalZ * diffZ;
- if(dotN > oimo.common.Setting.contactPersistenceThreshold) {
- this.removeManifoldPoint(index);
- continue;
- }
- diffX += this._manifold._normalX * -dotN;
- diffY += this._manifold._normalY * -dotN;
- diffZ += this._manifold._normalZ * -dotN;
- if(diffX * diffX + diffY * diffY + diffZ * diffZ > oimo.common.Setting.contactPersistenceThreshold * oimo.common.Setting.contactPersistenceThreshold) {
- this.removeManifoldPoint(index);
- continue;
- }
- }
- }
- removeManifoldPoint(index) {
- let lastIndex = --this._manifold._numPoints;
- if(index != lastIndex) {
- let tmp = this._manifold._points[index];
- this._manifold._points[index] = this._manifold._points[lastIndex];
- this._manifold._points[lastIndex] = tmp;
- }
- let _this = this._manifold._points[lastIndex];
- _this._localPos1X = 0;
- _this._localPos1Y = 0;
- _this._localPos1Z = 0;
- _this._localPos2X = 0;
- _this._localPos2Y = 0;
- _this._localPos2Z = 0;
- _this._relPos1X = 0;
- _this._relPos1Y = 0;
- _this._relPos1Z = 0;
- _this._relPos2X = 0;
- _this._relPos2Y = 0;
- _this._relPos2Z = 0;
- _this._pos1X = 0;
- _this._pos1Y = 0;
- _this._pos1Z = 0;
- _this._pos2X = 0;
- _this._pos2Y = 0;
- _this._pos2Z = 0;
- _this._depth = 0;
- let _this1 = _this._impulse;
- _this1.impulseN = 0;
- _this1.impulseT = 0;
- _this1.impulseB = 0;
- _this1.impulseP = 0;
- _this1.impulseLX = 0;
- _this1.impulseLY = 0;
- _this1.impulseLZ = 0;
- _this._warmStarted = false;
- _this._disabled = false;
- _this._id = -1;
- }
- addManifoldPoint(point,tf1,tf2) {
- let num = this._manifold._numPoints;
- if(num == oimo.common.Setting.maxManifoldPoints) {
- let targetIndex = this.computeTargetIndex(point,tf1,tf2);
- let _this = this._manifold._points[targetIndex];
- let v = point.position1;
- _this._pos1X = v.x;
- _this._pos1Y = v.y;
- _this._pos1Z = v.z;
- let v1 = point.position2;
- _this._pos2X = v1.x;
- _this._pos2Y = v1.y;
- _this._pos2Z = v1.z;
- _this._relPos1X = _this._pos1X - tf1._positionX;
- _this._relPos1Y = _this._pos1Y - tf1._positionY;
- _this._relPos1Z = _this._pos1Z - tf1._positionZ;
- _this._relPos2X = _this._pos2X - tf2._positionX;
- _this._relPos2Y = _this._pos2Y - tf2._positionY;
- _this._relPos2Z = _this._pos2Z - tf2._positionZ;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = tf1._rotation00 * _this._relPos1X + tf1._rotation10 * _this._relPos1Y + tf1._rotation20 * _this._relPos1Z;
- __tmp__Y = tf1._rotation01 * _this._relPos1X + tf1._rotation11 * _this._relPos1Y + tf1._rotation21 * _this._relPos1Z;
- __tmp__Z = tf1._rotation02 * _this._relPos1X + tf1._rotation12 * _this._relPos1Y + tf1._rotation22 * _this._relPos1Z;
- _this._localPos1X = __tmp__X;
- _this._localPos1Y = __tmp__Y;
- _this._localPos1Z = __tmp__Z;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = tf2._rotation00 * _this._relPos2X + tf2._rotation10 * _this._relPos2Y + tf2._rotation20 * _this._relPos2Z;
- __tmp__Y1 = tf2._rotation01 * _this._relPos2X + tf2._rotation11 * _this._relPos2Y + tf2._rotation21 * _this._relPos2Z;
- __tmp__Z1 = tf2._rotation02 * _this._relPos2X + tf2._rotation12 * _this._relPos2Y + tf2._rotation22 * _this._relPos2Z;
- _this._localPos2X = __tmp__X1;
- _this._localPos2Y = __tmp__Y1;
- _this._localPos2Z = __tmp__Z1;
- _this._depth = point.depth;
- let _this1 = _this._impulse;
- _this1.impulseN = 0;
- _this1.impulseT = 0;
- _this1.impulseB = 0;
- _this1.impulseP = 0;
- _this1.impulseLX = 0;
- _this1.impulseLY = 0;
- _this1.impulseLZ = 0;
- _this._id = point.id;
- _this._warmStarted = false;
- _this._disabled = false;
- return;
- }
- let _this = this._manifold._points[num];
- let v = point.position1;
- _this._pos1X = v.x;
- _this._pos1Y = v.y;
- _this._pos1Z = v.z;
- let v1 = point.position2;
- _this._pos2X = v1.x;
- _this._pos2Y = v1.y;
- _this._pos2Z = v1.z;
- _this._relPos1X = _this._pos1X - tf1._positionX;
- _this._relPos1Y = _this._pos1Y - tf1._positionY;
- _this._relPos1Z = _this._pos1Z - tf1._positionZ;
- _this._relPos2X = _this._pos2X - tf2._positionX;
- _this._relPos2Y = _this._pos2Y - tf2._positionY;
- _this._relPos2Z = _this._pos2Z - tf2._positionZ;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = tf1._rotation00 * _this._relPos1X + tf1._rotation10 * _this._relPos1Y + tf1._rotation20 * _this._relPos1Z;
- __tmp__Y = tf1._rotation01 * _this._relPos1X + tf1._rotation11 * _this._relPos1Y + tf1._rotation21 * _this._relPos1Z;
- __tmp__Z = tf1._rotation02 * _this._relPos1X + tf1._rotation12 * _this._relPos1Y + tf1._rotation22 * _this._relPos1Z;
- _this._localPos1X = __tmp__X;
- _this._localPos1Y = __tmp__Y;
- _this._localPos1Z = __tmp__Z;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = tf2._rotation00 * _this._relPos2X + tf2._rotation10 * _this._relPos2Y + tf2._rotation20 * _this._relPos2Z;
- __tmp__Y1 = tf2._rotation01 * _this._relPos2X + tf2._rotation11 * _this._relPos2Y + tf2._rotation21 * _this._relPos2Z;
- __tmp__Z1 = tf2._rotation02 * _this._relPos2X + tf2._rotation12 * _this._relPos2Y + tf2._rotation22 * _this._relPos2Z;
- _this._localPos2X = __tmp__X1;
- _this._localPos2Y = __tmp__Y1;
- _this._localPos2Z = __tmp__Z1;
- _this._depth = point.depth;
- let _this1 = _this._impulse;
- _this1.impulseN = 0;
- _this1.impulseT = 0;
- _this1.impulseB = 0;
- _this1.impulseP = 0;
- _this1.impulseLX = 0;
- _this1.impulseLY = 0;
- _this1.impulseLZ = 0;
- _this._id = point.id;
- _this._warmStarted = false;
- _this._disabled = false;
- this._manifold._numPoints++;
- }
- computeTargetIndex(newPoint,tf1,tf2) {
- let p1 = this._manifold._points[0];
- let p2 = this._manifold._points[1];
- let p3 = this._manifold._points[2];
- let p4 = this._manifold._points[3];
- let maxDepth = p1._depth;
- let maxDepthIndex = 0;
- if(p2._depth > maxDepth) {
- maxDepth = p2._depth;
- maxDepthIndex = 1;
- }
- if(p3._depth > maxDepth) {
- maxDepth = p3._depth;
- maxDepthIndex = 2;
- }
- if(p4._depth > maxDepth) {
- maxDepthIndex = 3;
- }
- let rp1X;
- let rp1Y;
- let rp1Z;
- let v = newPoint.position1;
- rp1X = v.x;
- rp1Y = v.y;
- rp1Z = v.z;
- rp1X -= tf1._positionX;
- rp1Y -= tf1._positionY;
- rp1Z -= tf1._positionZ;
- let p1X = p2._relPos1X;
- let p1Y = p2._relPos1Y;
- let p1Z = p2._relPos1Z;
- let p2X = p3._relPos1X;
- let p2Y = p3._relPos1Y;
- let p2Z = p3._relPos1Z;
- let p3X = p4._relPos1X;
- let p3Y = p4._relPos1Y;
- let p3Z = p4._relPos1Z;
- let v12X;
- let v12Y;
- let v12Z;
- let v34X;
- let v34Y;
- let v34Z;
- let v13X;
- let v13Y;
- let v13Z;
- let v24X;
- let v24Y;
- let v24Z;
- let v14X;
- let v14Y;
- let v14Z;
- let v23X;
- let v23Y;
- let v23Z;
- v12X = p2X - p1X;
- v12Y = p2Y - p1Y;
- v12Z = p2Z - p1Z;
- v34X = rp1X - p3X;
- v34Y = rp1Y - p3Y;
- v34Z = rp1Z - p3Z;
- v13X = p3X - p1X;
- v13Y = p3Y - p1Y;
- v13Z = p3Z - p1Z;
- v24X = rp1X - p2X;
- v24Y = rp1Y - p2Y;
- v24Z = rp1Z - p2Z;
- v14X = rp1X - p1X;
- v14Y = rp1Y - p1Y;
- v14Z = rp1Z - p1Z;
- v23X = p3X - p2X;
- v23Y = p3Y - p2Y;
- v23Z = p3Z - p2Z;
- let cross1X;
- let cross1Y;
- let cross1Z;
- let cross2X;
- let cross2Y;
- let cross2Z;
- let cross3X;
- let cross3Y;
- let cross3Z;
- cross1X = v12Y * v34Z - v12Z * v34Y;
- cross1Y = v12Z * v34X - v12X * v34Z;
- cross1Z = v12X * v34Y - v12Y * v34X;
- cross2X = v13Y * v24Z - v13Z * v24Y;
- cross2Y = v13Z * v24X - v13X * v24Z;
- cross2Z = v13X * v24Y - v13Y * v24X;
- cross3X = v14Y * v23Z - v14Z * v23Y;
- cross3Y = v14Z * v23X - v14X * v23Z;
- cross3Z = v14X * v23Y - v14Y * v23X;
- let a1 = cross1X * cross1X + cross1Y * cross1Y + cross1Z * cross1Z;
- let a2 = cross2X * cross2X + cross2Y * cross2Y + cross2Z * cross2Z;
- let a3 = cross3X * cross3X + cross3Y * cross3Y + cross3Z * cross3Z;
- let p1X1 = p1._relPos1X;
- let p1Y1 = p1._relPos1Y;
- let p1Z1 = p1._relPos1Z;
- let p2X1 = p3._relPos1X;
- let p2Y1 = p3._relPos1Y;
- let p2Z1 = p3._relPos1Z;
- let p3X1 = p4._relPos1X;
- let p3Y1 = p4._relPos1Y;
- let p3Z1 = p4._relPos1Z;
- let v12X1;
- let v12Y1;
- let v12Z1;
- let v34X1;
- let v34Y1;
- let v34Z1;
- let v13X1;
- let v13Y1;
- let v13Z1;
- let v24X1;
- let v24Y1;
- let v24Z1;
- let v14X1;
- let v14Y1;
- let v14Z1;
- let v23X1;
- let v23Y1;
- let v23Z1;
- v12X1 = p2X1 - p1X1;
- v12Y1 = p2Y1 - p1Y1;
- v12Z1 = p2Z1 - p1Z1;
- v34X1 = rp1X - p3X1;
- v34Y1 = rp1Y - p3Y1;
- v34Z1 = rp1Z - p3Z1;
- v13X1 = p3X1 - p1X1;
- v13Y1 = p3Y1 - p1Y1;
- v13Z1 = p3Z1 - p1Z1;
- v24X1 = rp1X - p2X1;
- v24Y1 = rp1Y - p2Y1;
- v24Z1 = rp1Z - p2Z1;
- v14X1 = rp1X - p1X1;
- v14Y1 = rp1Y - p1Y1;
- v14Z1 = rp1Z - p1Z1;
- v23X1 = p3X1 - p2X1;
- v23Y1 = p3Y1 - p2Y1;
- v23Z1 = p3Z1 - p2Z1;
- let cross1X1;
- let cross1Y1;
- let cross1Z1;
- let cross2X1;
- let cross2Y1;
- let cross2Z1;
- let cross3X1;
- let cross3Y1;
- let cross3Z1;
- cross1X1 = v12Y1 * v34Z1 - v12Z1 * v34Y1;
- cross1Y1 = v12Z1 * v34X1 - v12X1 * v34Z1;
- cross1Z1 = v12X1 * v34Y1 - v12Y1 * v34X1;
- cross2X1 = v13Y1 * v24Z1 - v13Z1 * v24Y1;
- cross2Y1 = v13Z1 * v24X1 - v13X1 * v24Z1;
- cross2Z1 = v13X1 * v24Y1 - v13Y1 * v24X1;
- cross3X1 = v14Y1 * v23Z1 - v14Z1 * v23Y1;
- cross3Y1 = v14Z1 * v23X1 - v14X1 * v23Z1;
- cross3Z1 = v14X1 * v23Y1 - v14Y1 * v23X1;
- let a11 = cross1X1 * cross1X1 + cross1Y1 * cross1Y1 + cross1Z1 * cross1Z1;
- let a21 = cross2X1 * cross2X1 + cross2Y1 * cross2Y1 + cross2Z1 * cross2Z1;
- let a31 = cross3X1 * cross3X1 + cross3Y1 * cross3Y1 + cross3Z1 * cross3Z1;
- let a22 = a11 > a21 ? a11 > a31 ? a11 : a31 : a21 > a31 ? a21 : a31;
- let p1X2 = p1._relPos1X;
- let p1Y2 = p1._relPos1Y;
- let p1Z2 = p1._relPos1Z;
- let p2X2 = p2._relPos1X;
- let p2Y2 = p2._relPos1Y;
- let p2Z2 = p2._relPos1Z;
- let p3X2 = p4._relPos1X;
- let p3Y2 = p4._relPos1Y;
- let p3Z2 = p4._relPos1Z;
- let v12X2;
- let v12Y2;
- let v12Z2;
- let v34X2;
- let v34Y2;
- let v34Z2;
- let v13X2;
- let v13Y2;
- let v13Z2;
- let v24X2;
- let v24Y2;
- let v24Z2;
- let v14X2;
- let v14Y2;
- let v14Z2;
- let v23X2;
- let v23Y2;
- let v23Z2;
- v12X2 = p2X2 - p1X2;
- v12Y2 = p2Y2 - p1Y2;
- v12Z2 = p2Z2 - p1Z2;
- v34X2 = rp1X - p3X2;
- v34Y2 = rp1Y - p3Y2;
- v34Z2 = rp1Z - p3Z2;
- v13X2 = p3X2 - p1X2;
- v13Y2 = p3Y2 - p1Y2;
- v13Z2 = p3Z2 - p1Z2;
- v24X2 = rp1X - p2X2;
- v24Y2 = rp1Y - p2Y2;
- v24Z2 = rp1Z - p2Z2;
- v14X2 = rp1X - p1X2;
- v14Y2 = rp1Y - p1Y2;
- v14Z2 = rp1Z - p1Z2;
- v23X2 = p3X2 - p2X2;
- v23Y2 = p3Y2 - p2Y2;
- v23Z2 = p3Z2 - p2Z2;
- let cross1X2;
- let cross1Y2;
- let cross1Z2;
- let cross2X2;
- let cross2Y2;
- let cross2Z2;
- let cross3X2;
- let cross3Y2;
- let cross3Z2;
- cross1X2 = v12Y2 * v34Z2 - v12Z2 * v34Y2;
- cross1Y2 = v12Z2 * v34X2 - v12X2 * v34Z2;
- cross1Z2 = v12X2 * v34Y2 - v12Y2 * v34X2;
- cross2X2 = v13Y2 * v24Z2 - v13Z2 * v24Y2;
- cross2Y2 = v13Z2 * v24X2 - v13X2 * v24Z2;
- cross2Z2 = v13X2 * v24Y2 - v13Y2 * v24X2;
- cross3X2 = v14Y2 * v23Z2 - v14Z2 * v23Y2;
- cross3Y2 = v14Z2 * v23X2 - v14X2 * v23Z2;
- cross3Z2 = v14X2 * v23Y2 - v14Y2 * v23X2;
- let a12 = cross1X2 * cross1X2 + cross1Y2 * cross1Y2 + cross1Z2 * cross1Z2;
- let a23 = cross2X2 * cross2X2 + cross2Y2 * cross2Y2 + cross2Z2 * cross2Z2;
- let a32 = cross3X2 * cross3X2 + cross3Y2 * cross3Y2 + cross3Z2 * cross3Z2;
- let a33 = a12 > a23 ? a12 > a32 ? a12 : a32 : a23 > a32 ? a23 : a32;
- let p1X3 = p1._relPos1X;
- let p1Y3 = p1._relPos1Y;
- let p1Z3 = p1._relPos1Z;
- let p2X3 = p2._relPos1X;
- let p2Y3 = p2._relPos1Y;
- let p2Z3 = p2._relPos1Z;
- let p3X3 = p3._relPos1X;
- let p3Y3 = p3._relPos1Y;
- let p3Z3 = p3._relPos1Z;
- let v12X3;
- let v12Y3;
- let v12Z3;
- let v34X3;
- let v34Y3;
- let v34Z3;
- let v13X3;
- let v13Y3;
- let v13Z3;
- let v24X3;
- let v24Y3;
- let v24Z3;
- let v14X3;
- let v14Y3;
- let v14Z3;
- let v23X3;
- let v23Y3;
- let v23Z3;
- v12X3 = p2X3 - p1X3;
- v12Y3 = p2Y3 - p1Y3;
- v12Z3 = p2Z3 - p1Z3;
- v34X3 = rp1X - p3X3;
- v34Y3 = rp1Y - p3Y3;
- v34Z3 = rp1Z - p3Z3;
- v13X3 = p3X3 - p1X3;
- v13Y3 = p3Y3 - p1Y3;
- v13Z3 = p3Z3 - p1Z3;
- v24X3 = rp1X - p2X3;
- v24Y3 = rp1Y - p2Y3;
- v24Z3 = rp1Z - p2Z3;
- v14X3 = rp1X - p1X3;
- v14Y3 = rp1Y - p1Y3;
- v14Z3 = rp1Z - p1Z3;
- v23X3 = p3X3 - p2X3;
- v23Y3 = p3Y3 - p2Y3;
- v23Z3 = p3Z3 - p2Z3;
- let cross1X3;
- let cross1Y3;
- let cross1Z3;
- let cross2X3;
- let cross2Y3;
- let cross2Z3;
- let cross3X3;
- let cross3Y3;
- let cross3Z3;
- cross1X3 = v12Y3 * v34Z3 - v12Z3 * v34Y3;
- cross1Y3 = v12Z3 * v34X3 - v12X3 * v34Z3;
- cross1Z3 = v12X3 * v34Y3 - v12Y3 * v34X3;
- cross2X3 = v13Y3 * v24Z3 - v13Z3 * v24Y3;
- cross2Y3 = v13Z3 * v24X3 - v13X3 * v24Z3;
- cross2Z3 = v13X3 * v24Y3 - v13Y3 * v24X3;
- cross3X3 = v14Y3 * v23Z3 - v14Z3 * v23Y3;
- cross3Y3 = v14Z3 * v23X3 - v14X3 * v23Z3;
- cross3Z3 = v14X3 * v23Y3 - v14Y3 * v23X3;
- let a13 = cross1X3 * cross1X3 + cross1Y3 * cross1Y3 + cross1Z3 * cross1Z3;
- let a24 = cross2X3 * cross2X3 + cross2Y3 * cross2Y3 + cross2Z3 * cross2Z3;
- let a34 = cross3X3 * cross3X3 + cross3Y3 * cross3Y3 + cross3Z3 * cross3Z3;
- let a4 = a13 > a24 ? a13 > a34 ? a13 : a34 : a24 > a34 ? a24 : a34;
- let max = a1 > a2 ? a1 > a3 ? a1 : a3 : a2 > a3 ? a2 : a3;
- let target = 0;
- if(a22 > max && maxDepthIndex != 1 || maxDepthIndex == 0) {
- max = a22;
- target = 1;
- }
- if(a33 > max && maxDepthIndex != 2) {
- max = a33;
- target = 2;
- }
- if(a4 > max && maxDepthIndex != 3) {
- target = 3;
- }
- return target;
- }
- computeRelativePositions(tf1,tf2) {
- let num = this._manifold._numPoints;
- let _g = 0;
- while(_g < num) {
- let p = this._manifold._points[_g++];
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = tf1._rotation00 * p._localPos1X + tf1._rotation01 * p._localPos1Y + tf1._rotation02 * p._localPos1Z;
- __tmp__Y = tf1._rotation10 * p._localPos1X + tf1._rotation11 * p._localPos1Y + tf1._rotation12 * p._localPos1Z;
- __tmp__Z = tf1._rotation20 * p._localPos1X + tf1._rotation21 * p._localPos1Y + tf1._rotation22 * p._localPos1Z;
- p._relPos1X = __tmp__X;
- p._relPos1Y = __tmp__Y;
- p._relPos1Z = __tmp__Z;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = tf2._rotation00 * p._localPos2X + tf2._rotation01 * p._localPos2Y + tf2._rotation02 * p._localPos2Z;
- __tmp__Y1 = tf2._rotation10 * p._localPos2X + tf2._rotation11 * p._localPos2Y + tf2._rotation12 * p._localPos2Z;
- __tmp__Z1 = tf2._rotation20 * p._localPos2X + tf2._rotation21 * p._localPos2Y + tf2._rotation22 * p._localPos2Z;
- p._relPos2X = __tmp__X1;
- p._relPos2Y = __tmp__Y1;
- p._relPos2Z = __tmp__Z1;
- p._warmStarted = true;
- }
- }
- findNearestContactPointIndex(target,tf1,tf2) {
- let nearestSq = oimo.common.Setting.contactPersistenceThreshold * oimo.common.Setting.contactPersistenceThreshold;
- let idx = -1;
- let _g = 0;
- let _g1 = this._manifold._numPoints;
- while(_g < _g1) {
- let i = _g++;
- let mp = this._manifold._points[i];
- let rp1X;
- let rp1Y;
- let rp1Z;
- let rp2X;
- let rp2Y;
- let rp2Z;
- let v = target.position1;
- rp1X = v.x;
- rp1Y = v.y;
- rp1Z = v.z;
- let v1 = target.position2;
- rp2X = v1.x;
- rp2Y = v1.y;
- rp2Z = v1.z;
- rp1X -= tf1._positionX;
- rp1Y -= tf1._positionY;
- rp1Z -= tf1._positionZ;
- rp2X -= tf2._positionX;
- rp2Y -= tf2._positionY;
- rp2Z -= tf2._positionZ;
- let diff1X;
- let diff1Y;
- let diff1Z;
- let diff2X;
- let diff2Y;
- let diff2Z;
- diff1X = mp._relPos1X - rp1X;
- diff1Y = mp._relPos1Y - rp1Y;
- diff1Z = mp._relPos1Z - rp1Z;
- diff2X = mp._relPos2X - rp2X;
- diff2Y = mp._relPos2Y - rp2Y;
- diff2Z = mp._relPos2Z - rp2Z;
- let sq1 = diff1X * diff1X + diff1Y * diff1Y + diff1Z * diff1Z;
- let sq2 = diff2X * diff2X + diff2Y * diff2Y + diff2Z * diff2Z;
- let d = sq1 < sq2 ? sq1 : sq2;
- if(d < nearestSq) {
- nearestSq = d;
- idx = i;
- }
- }
- return idx;
- }
- totalUpdate(result,tf1,tf2) {
- this.numOldPoints = this._manifold._numPoints;
- let _g = 0;
- let _g1 = this.numOldPoints;
- while(_g < _g1) {
- let i = _g++;
- let _this = this.oldPoints[i];
- let cp = this._manifold._points[i];
- _this._localPos1X = cp._localPos1X;
- _this._localPos1Y = cp._localPos1Y;
- _this._localPos1Z = cp._localPos1Z;
- _this._localPos2X = cp._localPos2X;
- _this._localPos2Y = cp._localPos2Y;
- _this._localPos2Z = cp._localPos2Z;
- _this._relPos1X = cp._relPos1X;
- _this._relPos1Y = cp._relPos1Y;
- _this._relPos1Z = cp._relPos1Z;
- _this._relPos2X = cp._relPos2X;
- _this._relPos2Y = cp._relPos2Y;
- _this._relPos2Z = cp._relPos2Z;
- _this._pos1X = cp._pos1X;
- _this._pos1Y = cp._pos1Y;
- _this._pos1Z = cp._pos1Z;
- _this._pos2X = cp._pos2X;
- _this._pos2Y = cp._pos2Y;
- _this._pos2Z = cp._pos2Z;
- _this._depth = cp._depth;
- _this._impulse.copyFrom(cp._impulse);
- _this._id = cp._id;
- _this._warmStarted = cp._warmStarted;
- _this._disabled = false;
- }
- let num = result.numPoints;
- this._manifold._numPoints = num;
- let _g2 = 0;
- while(_g2 < num) {
- let i = _g2++;
- let p = this._manifold._points[i];
- let ref = result.points[i];
- let v = ref.position1;
- p._pos1X = v.x;
- p._pos1Y = v.y;
- p._pos1Z = v.z;
- let v1 = ref.position2;
- p._pos2X = v1.x;
- p._pos2Y = v1.y;
- p._pos2Z = v1.z;
- p._relPos1X = p._pos1X - tf1._positionX;
- p._relPos1Y = p._pos1Y - tf1._positionY;
- p._relPos1Z = p._pos1Z - tf1._positionZ;
- p._relPos2X = p._pos2X - tf2._positionX;
- p._relPos2Y = p._pos2Y - tf2._positionY;
- p._relPos2Z = p._pos2Z - tf2._positionZ;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = tf1._rotation00 * p._relPos1X + tf1._rotation10 * p._relPos1Y + tf1._rotation20 * p._relPos1Z;
- __tmp__Y = tf1._rotation01 * p._relPos1X + tf1._rotation11 * p._relPos1Y + tf1._rotation21 * p._relPos1Z;
- __tmp__Z = tf1._rotation02 * p._relPos1X + tf1._rotation12 * p._relPos1Y + tf1._rotation22 * p._relPos1Z;
- p._localPos1X = __tmp__X;
- p._localPos1Y = __tmp__Y;
- p._localPos1Z = __tmp__Z;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = tf2._rotation00 * p._relPos2X + tf2._rotation10 * p._relPos2Y + tf2._rotation20 * p._relPos2Z;
- __tmp__Y1 = tf2._rotation01 * p._relPos2X + tf2._rotation11 * p._relPos2Y + tf2._rotation21 * p._relPos2Z;
- __tmp__Z1 = tf2._rotation02 * p._relPos2X + tf2._rotation12 * p._relPos2Y + tf2._rotation22 * p._relPos2Z;
- p._localPos2X = __tmp__X1;
- p._localPos2Y = __tmp__Y1;
- p._localPos2Z = __tmp__Z1;
- p._depth = ref.depth;
- let _this = p._impulse;
- _this.impulseN = 0;
- _this.impulseT = 0;
- _this.impulseB = 0;
- _this.impulseP = 0;
- _this.impulseLX = 0;
- _this.impulseLY = 0;
- _this.impulseLZ = 0;
- p._id = ref.id;
- p._warmStarted = false;
- p._disabled = false;
- let _g = 0;
- let _g1 = this.numOldPoints;
- while(_g < _g1) {
- let ocp = this.oldPoints[_g++];
- if(p._id == ocp._id) {
- p._impulse.copyFrom(ocp._impulse);
- p._warmStarted = true;
- break;
- }
- }
- }
- }
- incrementalUpdate(result,tf1,tf2) {
- this._manifold._updateDepthsAndPositions(tf1,tf2);
- let _g = 0;
- let _g1 = this._manifold._numPoints;
- while(_g < _g1) this._manifold._points[_g++]._warmStarted = true;
- let newPoint = result.points[0];
- let index = this.findNearestContactPointIndex(newPoint,tf1,tf2);
- if(index == -1) {
- this.addManifoldPoint(newPoint,tf1,tf2);
- } else {
- let cp = this._manifold._points[index];
- let v = newPoint.position1;
- cp._pos1X = v.x;
- cp._pos1Y = v.y;
- cp._pos1Z = v.z;
- let v1 = newPoint.position2;
- cp._pos2X = v1.x;
- cp._pos2Y = v1.y;
- cp._pos2Z = v1.z;
- cp._relPos1X = cp._pos1X - tf1._positionX;
- cp._relPos1Y = cp._pos1Y - tf1._positionY;
- cp._relPos1Z = cp._pos1Z - tf1._positionZ;
- cp._relPos2X = cp._pos2X - tf2._positionX;
- cp._relPos2Y = cp._pos2Y - tf2._positionY;
- cp._relPos2Z = cp._pos2Z - tf2._positionZ;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = tf1._rotation00 * cp._relPos1X + tf1._rotation10 * cp._relPos1Y + tf1._rotation20 * cp._relPos1Z;
- __tmp__Y = tf1._rotation01 * cp._relPos1X + tf1._rotation11 * cp._relPos1Y + tf1._rotation21 * cp._relPos1Z;
- __tmp__Z = tf1._rotation02 * cp._relPos1X + tf1._rotation12 * cp._relPos1Y + tf1._rotation22 * cp._relPos1Z;
- cp._localPos1X = __tmp__X;
- cp._localPos1Y = __tmp__Y;
- cp._localPos1Z = __tmp__Z;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = tf2._rotation00 * cp._relPos2X + tf2._rotation10 * cp._relPos2Y + tf2._rotation20 * cp._relPos2Z;
- __tmp__Y1 = tf2._rotation01 * cp._relPos2X + tf2._rotation11 * cp._relPos2Y + tf2._rotation21 * cp._relPos2Z;
- __tmp__Z1 = tf2._rotation02 * cp._relPos2X + tf2._rotation12 * cp._relPos2Y + tf2._rotation22 * cp._relPos2Z;
- cp._localPos2X = __tmp__X1;
- cp._localPos2Y = __tmp__Y1;
- cp._localPos2Z = __tmp__Z1;
- cp._depth = newPoint.depth;
- }
- this.removeOutdatedPoints();
- }
- }
- if(!oimo.dynamics.constraint.info) oimo.dynamics.constraint.info = {};
- oimo.dynamics.constraint.info.JacobianRow = class oimo_dynamics_constraint_info_JacobianRow {
- constructor() {
- this.lin1X = 0;
- this.lin1Y = 0;
- this.lin1Z = 0;
- this.lin2X = 0;
- this.lin2Y = 0;
- this.lin2Z = 0;
- this.ang1X = 0;
- this.ang1Y = 0;
- this.ang1Z = 0;
- this.ang2X = 0;
- this.ang2Y = 0;
- this.ang2Z = 0;
- this.flag = 0;
- }
- updateSparsity() {
- this.flag = 0;
- if(!(this.lin1X == 0 && this.lin1Y == 0 && this.lin1Z == 0) || !(this.lin2X == 0 && this.lin2Y == 0 && this.lin2Z == 0)) {
- this.flag |= 1;
- }
- if(!(this.ang1X == 0 && this.ang1Y == 0 && this.ang1Z == 0) || !(this.ang2X == 0 && this.ang2Y == 0 && this.ang2Z == 0)) {
- this.flag |= 2;
- }
- }
- }
- if(!oimo.dynamics.constraint.info.contact) oimo.dynamics.constraint.info.contact = {};
- oimo.dynamics.constraint.info.contact.ContactSolverInfo = class oimo_dynamics_constraint_info_contact_ContactSolverInfo {
- constructor() {
- this.b1 = null;
- this.b2 = null;
- this.numRows = 0;
- this.rows = new Array(oimo.common.Setting.maxManifoldPoints);
- let _g = 0;
- let _g1 = this.rows.length;
- while(_g < _g1) this.rows[_g++] = new oimo.dynamics.constraint.info.contact.ContactSolverInfoRow();
- }
- }
- oimo.dynamics.constraint.info.contact.ContactSolverInfoRow = class oimo_dynamics_constraint_info_contact_ContactSolverInfoRow {
- constructor() {
- this.jacobianN = new oimo.dynamics.constraint.info.JacobianRow();
- this.jacobianT = new oimo.dynamics.constraint.info.JacobianRow();
- this.jacobianB = new oimo.dynamics.constraint.info.JacobianRow();
- this.rhs = 0;
- this.cfm = 0;
- this.friction = 0;
- this.impulse = null;
- }
- }
- if(!oimo.dynamics.constraint.info.joint) oimo.dynamics.constraint.info.joint = {};
- oimo.dynamics.constraint.info.joint.JointSolverInfo = class oimo_dynamics_constraint_info_joint_JointSolverInfo {
- constructor() {
- this.b1 = null;
- this.b2 = null;
- this.numRows = 0;
- this.rows = new Array(oimo.common.Setting.maxJacobianRows);
- let _g = 0;
- let _g1 = this.rows.length;
- while(_g < _g1) this.rows[_g++] = new oimo.dynamics.constraint.info.joint.JointSolverInfoRow();
- }
- }
- oimo.dynamics.constraint.info.joint.JointSolverInfoRow = class oimo_dynamics_constraint_info_joint_JointSolverInfoRow {
- constructor() {
- this.jacobian = new oimo.dynamics.constraint.info.JacobianRow();
- this.rhs = 0;
- this.cfm = 0;
- this.minImpulse = 0;
- this.maxImpulse = 0;
- this.motorSpeed = 0;
- this.motorMaxImpulse = 0;
- this.impulse = null;
- }
- }
- if(!oimo.dynamics.constraint.joint) oimo.dynamics.constraint.joint = {};
- oimo.dynamics.constraint.joint.BasisTracker = class oimo_dynamics_constraint_joint_BasisTracker {
- constructor(joint) {
- this.joint = joint;
- this.xX = 0;
- this.xY = 0;
- this.xZ = 0;
- this.yX = 0;
- this.yY = 0;
- this.yZ = 0;
- this.zX = 0;
- this.zY = 0;
- this.zZ = 0;
- }
- }
- oimo.dynamics.constraint.joint.Joint = class oimo_dynamics_constraint_joint_Joint {
- constructor(config,type) {
- this._link1 = new oimo.dynamics.constraint.joint.JointLink(this);
- this._link2 = new oimo.dynamics.constraint.joint.JointLink(this);
- this._positionCorrectionAlgorithm = oimo.common.Setting.defaultJointPositionCorrectionAlgorithm;
- this._type = type;
- this._world = null;
- this._b1 = config.rigidBody1;
- this._b2 = config.rigidBody2;
- this._allowCollision = config.allowCollision;
- this._breakForce = config.breakForce;
- this._breakTorque = config.breakTorque;
- switch(config.solverType) {
- case 0:
- this._solver = new oimo.dynamics.constraint.solver.pgs.PgsJointConstraintSolver(this);
- break;
- case 1:
- this._solver = new oimo.dynamics.constraint.solver.direct.DirectJointConstraintSolver(this);
- break;
- }
- let v = config.localAnchor1;
- this._localAnchor1X = v.x;
- this._localAnchor1Y = v.y;
- this._localAnchor1Z = v.z;
- let v1 = config.localAnchor2;
- this._localAnchor2X = v1.x;
- this._localAnchor2Y = v1.y;
- this._localAnchor2Z = v1.z;
- this._relativeAnchor1X = 0;
- this._relativeAnchor1Y = 0;
- this._relativeAnchor1Z = 0;
- this._relativeAnchor2X = 0;
- this._relativeAnchor2Y = 0;
- this._relativeAnchor2Z = 0;
- this._anchor1X = 0;
- this._anchor1Y = 0;
- this._anchor1Z = 0;
- this._anchor2X = 0;
- this._anchor2Y = 0;
- this._anchor2Z = 0;
- this._localBasisX1X = 0;
- this._localBasisX1Y = 0;
- this._localBasisX1Z = 0;
- this._localBasisY1X = 0;
- this._localBasisY1Y = 0;
- this._localBasisY1Z = 0;
- this._localBasisZ1X = 0;
- this._localBasisZ1Y = 0;
- this._localBasisZ1Z = 0;
- this._localBasisX2X = 0;
- this._localBasisX2Y = 0;
- this._localBasisX2Z = 0;
- this._localBasisY2X = 0;
- this._localBasisY2Y = 0;
- this._localBasisY2Z = 0;
- this._localBasisZ2X = 0;
- this._localBasisZ2Y = 0;
- this._localBasisZ2Z = 0;
- this._impulses = new Array(oimo.common.Setting.maxJacobianRows);
- let _g = 0;
- let _g1 = oimo.common.Setting.maxJacobianRows;
- while(_g < _g1) this._impulses[_g++] = new oimo.dynamics.constraint.joint.JointImpulse();
- }
- buildLocalBasesFromX() {
- if(this._localBasisX1X * this._localBasisX1X + this._localBasisX1Y * this._localBasisX1Y + this._localBasisX1Z * this._localBasisX1Z == 0) {
- this._localBasisX1X = 1;
- this._localBasisX1Y = 0;
- this._localBasisX1Z = 0;
- } else {
- let l = this._localBasisX1X * this._localBasisX1X + this._localBasisX1Y * this._localBasisX1Y + this._localBasisX1Z * this._localBasisX1Z;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- this._localBasisX1X *= l;
- this._localBasisX1Y *= l;
- this._localBasisX1Z *= l;
- }
- if(this._localBasisX2X * this._localBasisX2X + this._localBasisX2Y * this._localBasisX2Y + this._localBasisX2Z * this._localBasisX2Z == 0) {
- this._localBasisX2X = 1;
- this._localBasisX2Y = 0;
- this._localBasisX2Z = 0;
- } else {
- let l = this._localBasisX2X * this._localBasisX2X + this._localBasisX2Y * this._localBasisX2Y + this._localBasisX2Z * this._localBasisX2Z;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- this._localBasisX2X *= l;
- this._localBasisX2Y *= l;
- this._localBasisX2Z *= l;
- }
- let slerpQX;
- let slerpQY;
- let slerpQZ;
- let slerpQW;
- let slerpM00;
- let slerpM01;
- let slerpM02;
- let slerpM10;
- let slerpM11;
- let slerpM12;
- let slerpM20;
- let slerpM21;
- let slerpM22;
- let d = this._localBasisX1X * this._localBasisX2X + this._localBasisX1Y * this._localBasisX2Y + this._localBasisX1Z * this._localBasisX2Z;
- if(d < -0.999999999) {
- let vX;
- let vY;
- let vZ;
- let x1 = this._localBasisX1X;
- let y1 = this._localBasisX1Y;
- let z1 = this._localBasisX1Z;
- let x2 = x1 * x1;
- let y2 = y1 * y1;
- let z2 = z1 * z1;
- let d;
- if(x2 < y2) {
- if(x2 < z2) {
- d = 1 / Math.sqrt(y2 + z2);
- vX = 0;
- vY = z1 * d;
- vZ = -y1 * d;
- } else {
- d = 1 / Math.sqrt(x2 + y2);
- vX = y1 * d;
- vY = -x1 * d;
- vZ = 0;
- }
- } else if(y2 < z2) {
- d = 1 / Math.sqrt(z2 + x2);
- vX = -z1 * d;
- vY = 0;
- vZ = x1 * d;
- } else {
- d = 1 / Math.sqrt(x2 + y2);
- vX = y1 * d;
- vY = -x1 * d;
- vZ = 0;
- }
- slerpQX = vX;
- slerpQY = vY;
- slerpQZ = vZ;
- slerpQW = 0;
- } else {
- let cX;
- let cY;
- let cZ;
- cX = this._localBasisX1Y * this._localBasisX2Z - this._localBasisX1Z * this._localBasisX2Y;
- cY = this._localBasisX1Z * this._localBasisX2X - this._localBasisX1X * this._localBasisX2Z;
- cZ = this._localBasisX1X * this._localBasisX2Y - this._localBasisX1Y * this._localBasisX2X;
- let w = Math.sqrt((1 + d) * 0.5);
- d = 0.5 / w;
- cX *= d;
- cY *= d;
- cZ *= d;
- slerpQX = cX;
- slerpQY = cY;
- slerpQZ = cZ;
- slerpQW = w;
- }
- let x = slerpQX;
- let y = slerpQY;
- let z = slerpQZ;
- let w = slerpQW;
- let x2 = 2 * x;
- let y2 = 2 * y;
- let z2 = 2 * z;
- let xx = x * x2;
- let yy = y * y2;
- let zz = z * z2;
- let xy = x * y2;
- let yz = y * z2;
- let xz = x * z2;
- let wx = w * x2;
- let wy = w * y2;
- let wz = w * z2;
- slerpM00 = 1 - yy - zz;
- slerpM01 = xy - wz;
- slerpM02 = xz + wy;
- slerpM10 = xy + wz;
- slerpM11 = 1 - xx - zz;
- slerpM12 = yz - wx;
- slerpM20 = xz - wy;
- slerpM21 = yz + wx;
- slerpM22 = 1 - xx - yy;
- let x1 = this._localBasisX1X;
- let y1 = this._localBasisX1Y;
- let z1 = this._localBasisX1Z;
- let x21 = x1 * x1;
- let y21 = y1 * y1;
- let z21 = z1 * z1;
- let d1;
- if(x21 < y21) {
- if(x21 < z21) {
- d1 = 1 / Math.sqrt(y21 + z21);
- this._localBasisY1X = 0;
- this._localBasisY1Y = z1 * d1;
- this._localBasisY1Z = -y1 * d1;
- } else {
- d1 = 1 / Math.sqrt(x21 + y21);
- this._localBasisY1X = y1 * d1;
- this._localBasisY1Y = -x1 * d1;
- this._localBasisY1Z = 0;
- }
- } else if(y21 < z21) {
- d1 = 1 / Math.sqrt(z21 + x21);
- this._localBasisY1X = -z1 * d1;
- this._localBasisY1Y = 0;
- this._localBasisY1Z = x1 * d1;
- } else {
- d1 = 1 / Math.sqrt(x21 + y21);
- this._localBasisY1X = y1 * d1;
- this._localBasisY1Y = -x1 * d1;
- this._localBasisY1Z = 0;
- }
- this._localBasisZ1X = this._localBasisX1Y * this._localBasisY1Z - this._localBasisX1Z * this._localBasisY1Y;
- this._localBasisZ1Y = this._localBasisX1Z * this._localBasisY1X - this._localBasisX1X * this._localBasisY1Z;
- this._localBasisZ1Z = this._localBasisX1X * this._localBasisY1Y - this._localBasisX1Y * this._localBasisY1X;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = slerpM00 * this._localBasisX1X + slerpM01 * this._localBasisX1Y + slerpM02 * this._localBasisX1Z;
- __tmp__Y = slerpM10 * this._localBasisX1X + slerpM11 * this._localBasisX1Y + slerpM12 * this._localBasisX1Z;
- __tmp__Z = slerpM20 * this._localBasisX1X + slerpM21 * this._localBasisX1Y + slerpM22 * this._localBasisX1Z;
- this._localBasisX2X = __tmp__X;
- this._localBasisX2Y = __tmp__Y;
- this._localBasisX2Z = __tmp__Z;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = slerpM00 * this._localBasisY1X + slerpM01 * this._localBasisY1Y + slerpM02 * this._localBasisY1Z;
- __tmp__Y1 = slerpM10 * this._localBasisY1X + slerpM11 * this._localBasisY1Y + slerpM12 * this._localBasisY1Z;
- __tmp__Z1 = slerpM20 * this._localBasisY1X + slerpM21 * this._localBasisY1Y + slerpM22 * this._localBasisY1Z;
- this._localBasisY2X = __tmp__X1;
- this._localBasisY2Y = __tmp__Y1;
- this._localBasisY2Z = __tmp__Z1;
- let __tmp__X2;
- let __tmp__Y2;
- let __tmp__Z2;
- __tmp__X2 = slerpM00 * this._localBasisZ1X + slerpM01 * this._localBasisZ1Y + slerpM02 * this._localBasisZ1Z;
- __tmp__Y2 = slerpM10 * this._localBasisZ1X + slerpM11 * this._localBasisZ1Y + slerpM12 * this._localBasisZ1Z;
- __tmp__Z2 = slerpM20 * this._localBasisZ1X + slerpM21 * this._localBasisZ1Y + slerpM22 * this._localBasisZ1Z;
- this._localBasisZ2X = __tmp__X2;
- this._localBasisZ2Y = __tmp__Y2;
- this._localBasisZ2Z = __tmp__Z2;
- }
- buildLocalBasesFromXY() {
- if(this._localBasisX1X * this._localBasisX1X + this._localBasisX1Y * this._localBasisX1Y + this._localBasisX1Z * this._localBasisX1Z == 0) {
- this._localBasisX1X = 1;
- this._localBasisX1Y = 0;
- this._localBasisX1Z = 0;
- } else {
- let l = this._localBasisX1X * this._localBasisX1X + this._localBasisX1Y * this._localBasisX1Y + this._localBasisX1Z * this._localBasisX1Z;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- this._localBasisX1X *= l;
- this._localBasisX1Y *= l;
- this._localBasisX1Z *= l;
- }
- if(this._localBasisX2X * this._localBasisX2X + this._localBasisX2Y * this._localBasisX2Y + this._localBasisX2Z * this._localBasisX2Z == 0) {
- this._localBasisX2X = 1;
- this._localBasisX2Y = 0;
- this._localBasisX2Z = 0;
- } else {
- let l = this._localBasisX2X * this._localBasisX2X + this._localBasisX2Y * this._localBasisX2Y + this._localBasisX2Z * this._localBasisX2Z;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- this._localBasisX2X *= l;
- this._localBasisX2Y *= l;
- this._localBasisX2Z *= l;
- }
- this._localBasisZ1X = this._localBasisX1Y * this._localBasisY1Z - this._localBasisX1Z * this._localBasisY1Y;
- this._localBasisZ1Y = this._localBasisX1Z * this._localBasisY1X - this._localBasisX1X * this._localBasisY1Z;
- this._localBasisZ1Z = this._localBasisX1X * this._localBasisY1Y - this._localBasisX1Y * this._localBasisY1X;
- this._localBasisZ2X = this._localBasisX2Y * this._localBasisY2Z - this._localBasisX2Z * this._localBasisY2Y;
- this._localBasisZ2Y = this._localBasisX2Z * this._localBasisY2X - this._localBasisX2X * this._localBasisY2Z;
- this._localBasisZ2Z = this._localBasisX2X * this._localBasisY2Y - this._localBasisX2Y * this._localBasisY2X;
- if(this._localBasisZ1X * this._localBasisZ1X + this._localBasisZ1Y * this._localBasisZ1Y + this._localBasisZ1Z * this._localBasisZ1Z == 0) {
- let x1 = this._localBasisX1X;
- let y1 = this._localBasisX1Y;
- let z1 = this._localBasisX1Z;
- let x2 = x1 * x1;
- let y2 = y1 * y1;
- let z2 = z1 * z1;
- let d;
- if(x2 < y2) {
- if(x2 < z2) {
- d = 1 / Math.sqrt(y2 + z2);
- this._localBasisY1X = 0;
- this._localBasisY1Y = z1 * d;
- this._localBasisY1Z = -y1 * d;
- } else {
- d = 1 / Math.sqrt(x2 + y2);
- this._localBasisY1X = y1 * d;
- this._localBasisY1Y = -x1 * d;
- this._localBasisY1Z = 0;
- }
- } else if(y2 < z2) {
- d = 1 / Math.sqrt(z2 + x2);
- this._localBasisY1X = -z1 * d;
- this._localBasisY1Y = 0;
- this._localBasisY1Z = x1 * d;
- } else {
- d = 1 / Math.sqrt(x2 + y2);
- this._localBasisY1X = y1 * d;
- this._localBasisY1Y = -x1 * d;
- this._localBasisY1Z = 0;
- }
- this._localBasisZ1X = this._localBasisX1Y * this._localBasisY1Z - this._localBasisX1Z * this._localBasisY1Y;
- this._localBasisZ1Y = this._localBasisX1Z * this._localBasisY1X - this._localBasisX1X * this._localBasisY1Z;
- this._localBasisZ1Z = this._localBasisX1X * this._localBasisY1Y - this._localBasisX1Y * this._localBasisY1X;
- } else {
- let l = this._localBasisZ1X * this._localBasisZ1X + this._localBasisZ1Y * this._localBasisZ1Y + this._localBasisZ1Z * this._localBasisZ1Z;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- this._localBasisZ1X *= l;
- this._localBasisZ1Y *= l;
- this._localBasisZ1Z *= l;
- this._localBasisY1X = this._localBasisZ1Y * this._localBasisX1Z - this._localBasisZ1Z * this._localBasisX1Y;
- this._localBasisY1Y = this._localBasisZ1Z * this._localBasisX1X - this._localBasisZ1X * this._localBasisX1Z;
- this._localBasisY1Z = this._localBasisZ1X * this._localBasisX1Y - this._localBasisZ1Y * this._localBasisX1X;
- }
- if(this._localBasisZ2X * this._localBasisZ2X + this._localBasisZ2Y * this._localBasisZ2Y + this._localBasisZ2Z * this._localBasisZ2Z == 0) {
- let x1 = this._localBasisX2X;
- let y1 = this._localBasisX2Y;
- let z1 = this._localBasisX2Z;
- let x2 = x1 * x1;
- let y2 = y1 * y1;
- let z2 = z1 * z1;
- let d;
- if(x2 < y2) {
- if(x2 < z2) {
- d = 1 / Math.sqrt(y2 + z2);
- this._localBasisY2X = 0;
- this._localBasisY2Y = z1 * d;
- this._localBasisY2Z = -y1 * d;
- } else {
- d = 1 / Math.sqrt(x2 + y2);
- this._localBasisY2X = y1 * d;
- this._localBasisY2Y = -x1 * d;
- this._localBasisY2Z = 0;
- }
- } else if(y2 < z2) {
- d = 1 / Math.sqrt(z2 + x2);
- this._localBasisY2X = -z1 * d;
- this._localBasisY2Y = 0;
- this._localBasisY2Z = x1 * d;
- } else {
- d = 1 / Math.sqrt(x2 + y2);
- this._localBasisY2X = y1 * d;
- this._localBasisY2Y = -x1 * d;
- this._localBasisY2Z = 0;
- }
- this._localBasisZ2X = this._localBasisX2Y * this._localBasisY2Z - this._localBasisX2Z * this._localBasisY2Y;
- this._localBasisZ2Y = this._localBasisX2Z * this._localBasisY2X - this._localBasisX2X * this._localBasisY2Z;
- this._localBasisZ2Z = this._localBasisX2X * this._localBasisY2Y - this._localBasisX2Y * this._localBasisY2X;
- } else {
- let l = this._localBasisZ2X * this._localBasisZ2X + this._localBasisZ2Y * this._localBasisZ2Y + this._localBasisZ2Z * this._localBasisZ2Z;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- this._localBasisZ2X *= l;
- this._localBasisZ2Y *= l;
- this._localBasisZ2Z *= l;
- this._localBasisY2X = this._localBasisZ2Y * this._localBasisX2Z - this._localBasisZ2Z * this._localBasisX2Y;
- this._localBasisY2Y = this._localBasisZ2Z * this._localBasisX2X - this._localBasisZ2X * this._localBasisX2Z;
- this._localBasisY2Z = this._localBasisZ2X * this._localBasisX2Y - this._localBasisZ2Y * this._localBasisX2X;
- }
- }
- buildLocalBasesFromX1Z2() {
- if(this._localBasisX1X * this._localBasisX1X + this._localBasisX1Y * this._localBasisX1Y + this._localBasisX1Z * this._localBasisX1Z == 0) {
- this._localBasisX1X = 1;
- this._localBasisX1Y = 0;
- this._localBasisX1Z = 0;
- } else {
- let l = this._localBasisX1X * this._localBasisX1X + this._localBasisX1Y * this._localBasisX1Y + this._localBasisX1Z * this._localBasisX1Z;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- this._localBasisX1X *= l;
- this._localBasisX1Y *= l;
- this._localBasisX1Z *= l;
- }
- if(this._localBasisZ2X * this._localBasisZ2X + this._localBasisZ2Y * this._localBasisZ2Y + this._localBasisZ2Z * this._localBasisZ2Z == 0) {
- this._localBasisZ2X = 0;
- this._localBasisZ2Y = 0;
- this._localBasisZ2Z = 1;
- } else {
- let l = this._localBasisZ2X * this._localBasisZ2X + this._localBasisZ2Y * this._localBasisZ2Y + this._localBasisZ2Z * this._localBasisZ2Z;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- this._localBasisZ2X *= l;
- this._localBasisZ2Y *= l;
- this._localBasisZ2Z *= l;
- }
- let tf1 = this._b1._transform;
- let tf2 = this._b2._transform;
- let worldX1X;
- let worldX1Y;
- let worldX1Z;
- let worldZ1X;
- let worldZ1Y;
- let worldZ1Z;
- let worldYX;
- let worldYY;
- let worldYZ;
- let worldX2X;
- let worldX2Y;
- let worldX2Z;
- let worldZ2X;
- let worldZ2Y;
- let worldZ2Z;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = tf1._rotation00 * this._localBasisX1X + tf1._rotation01 * this._localBasisX1Y + tf1._rotation02 * this._localBasisX1Z;
- __tmp__Y = tf1._rotation10 * this._localBasisX1X + tf1._rotation11 * this._localBasisX1Y + tf1._rotation12 * this._localBasisX1Z;
- __tmp__Z = tf1._rotation20 * this._localBasisX1X + tf1._rotation21 * this._localBasisX1Y + tf1._rotation22 * this._localBasisX1Z;
- worldX1X = __tmp__X;
- worldX1Y = __tmp__Y;
- worldX1Z = __tmp__Z;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = tf2._rotation00 * this._localBasisZ2X + tf2._rotation01 * this._localBasisZ2Y + tf2._rotation02 * this._localBasisZ2Z;
- __tmp__Y1 = tf2._rotation10 * this._localBasisZ2X + tf2._rotation11 * this._localBasisZ2Y + tf2._rotation12 * this._localBasisZ2Z;
- __tmp__Z1 = tf2._rotation20 * this._localBasisZ2X + tf2._rotation21 * this._localBasisZ2Y + tf2._rotation22 * this._localBasisZ2Z;
- worldZ2X = __tmp__X1;
- worldZ2Y = __tmp__Y1;
- worldZ2Z = __tmp__Z1;
- worldYX = worldZ2Y * worldX1Z - worldZ2Z * worldX1Y;
- worldYY = worldZ2Z * worldX1X - worldZ2X * worldX1Z;
- worldYZ = worldZ2X * worldX1Y - worldZ2Y * worldX1X;
- if(worldYX * worldYX + worldYY * worldYY + worldYZ * worldYZ == 0) {
- let x1 = worldX1X;
- let y1 = worldX1Y;
- let z1 = worldX1Z;
- let x2 = x1 * x1;
- let y2 = y1 * y1;
- let z2 = z1 * z1;
- let d;
- if(x2 < y2) {
- if(x2 < z2) {
- d = 1 / Math.sqrt(y2 + z2);
- worldYX = 0;
- worldYY = z1 * d;
- worldYZ = -y1 * d;
- } else {
- d = 1 / Math.sqrt(x2 + y2);
- worldYX = y1 * d;
- worldYY = -x1 * d;
- worldYZ = 0;
- }
- } else if(y2 < z2) {
- d = 1 / Math.sqrt(z2 + x2);
- worldYX = -z1 * d;
- worldYY = 0;
- worldYZ = x1 * d;
- } else {
- d = 1 / Math.sqrt(x2 + y2);
- worldYX = y1 * d;
- worldYY = -x1 * d;
- worldYZ = 0;
- }
- }
- worldZ1X = worldX1Y * worldYZ - worldX1Z * worldYY;
- worldZ1Y = worldX1Z * worldYX - worldX1X * worldYZ;
- worldZ1Z = worldX1X * worldYY - worldX1Y * worldYX;
- worldX2X = worldYY * worldZ2Z - worldYZ * worldZ2Y;
- worldX2Y = worldYZ * worldZ2X - worldYX * worldZ2Z;
- worldX2Z = worldYX * worldZ2Y - worldYY * worldZ2X;
- let __tmp__X2;
- let __tmp__Y2;
- let __tmp__Z2;
- __tmp__X2 = tf1._rotation00 * worldX1X + tf1._rotation10 * worldX1Y + tf1._rotation20 * worldX1Z;
- __tmp__Y2 = tf1._rotation01 * worldX1X + tf1._rotation11 * worldX1Y + tf1._rotation21 * worldX1Z;
- __tmp__Z2 = tf1._rotation02 * worldX1X + tf1._rotation12 * worldX1Y + tf1._rotation22 * worldX1Z;
- this._localBasisX1X = __tmp__X2;
- this._localBasisX1Y = __tmp__Y2;
- this._localBasisX1Z = __tmp__Z2;
- let __tmp__X3;
- let __tmp__Y3;
- let __tmp__Z3;
- __tmp__X3 = tf1._rotation00 * worldYX + tf1._rotation10 * worldYY + tf1._rotation20 * worldYZ;
- __tmp__Y3 = tf1._rotation01 * worldYX + tf1._rotation11 * worldYY + tf1._rotation21 * worldYZ;
- __tmp__Z3 = tf1._rotation02 * worldYX + tf1._rotation12 * worldYY + tf1._rotation22 * worldYZ;
- this._localBasisY1X = __tmp__X3;
- this._localBasisY1Y = __tmp__Y3;
- this._localBasisY1Z = __tmp__Z3;
- let __tmp__X4;
- let __tmp__Y4;
- let __tmp__Z4;
- __tmp__X4 = tf1._rotation00 * worldZ1X + tf1._rotation10 * worldZ1Y + tf1._rotation20 * worldZ1Z;
- __tmp__Y4 = tf1._rotation01 * worldZ1X + tf1._rotation11 * worldZ1Y + tf1._rotation21 * worldZ1Z;
- __tmp__Z4 = tf1._rotation02 * worldZ1X + tf1._rotation12 * worldZ1Y + tf1._rotation22 * worldZ1Z;
- this._localBasisZ1X = __tmp__X4;
- this._localBasisZ1Y = __tmp__Y4;
- this._localBasisZ1Z = __tmp__Z4;
- let __tmp__X5;
- let __tmp__Y5;
- let __tmp__Z5;
- __tmp__X5 = tf2._rotation00 * worldX2X + tf2._rotation10 * worldX2Y + tf2._rotation20 * worldX2Z;
- __tmp__Y5 = tf2._rotation01 * worldX2X + tf2._rotation11 * worldX2Y + tf2._rotation21 * worldX2Z;
- __tmp__Z5 = tf2._rotation02 * worldX2X + tf2._rotation12 * worldX2Y + tf2._rotation22 * worldX2Z;
- this._localBasisX2X = __tmp__X5;
- this._localBasisX2Y = __tmp__Y5;
- this._localBasisX2Z = __tmp__Z5;
- let __tmp__X6;
- let __tmp__Y6;
- let __tmp__Z6;
- __tmp__X6 = tf2._rotation00 * worldYX + tf2._rotation10 * worldYY + tf2._rotation20 * worldYZ;
- __tmp__Y6 = tf2._rotation01 * worldYX + tf2._rotation11 * worldYY + tf2._rotation21 * worldYZ;
- __tmp__Z6 = tf2._rotation02 * worldYX + tf2._rotation12 * worldYY + tf2._rotation22 * worldYZ;
- this._localBasisY2X = __tmp__X6;
- this._localBasisY2Y = __tmp__Y6;
- this._localBasisY2Z = __tmp__Z6;
- let __tmp__X7;
- let __tmp__Y7;
- let __tmp__Z7;
- __tmp__X7 = tf2._rotation00 * worldZ2X + tf2._rotation10 * worldZ2Y + tf2._rotation20 * worldZ2Z;
- __tmp__Y7 = tf2._rotation01 * worldZ2X + tf2._rotation11 * worldZ2Y + tf2._rotation21 * worldZ2Z;
- __tmp__Z7 = tf2._rotation02 * worldZ2X + tf2._rotation12 * worldZ2Y + tf2._rotation22 * worldZ2Z;
- this._localBasisZ2X = __tmp__X7;
- this._localBasisZ2Y = __tmp__Y7;
- this._localBasisZ2Z = __tmp__Z7;
- }
- buildLocalBasesFromXY1X2() {
- if(this._localBasisX1X * this._localBasisX1X + this._localBasisX1Y * this._localBasisX1Y + this._localBasisX1Z * this._localBasisX1Z == 0) {
- this._localBasisX1X = 1;
- this._localBasisX1Y = 0;
- this._localBasisX1Z = 0;
- } else {
- let l = this._localBasisX1X * this._localBasisX1X + this._localBasisX1Y * this._localBasisX1Y + this._localBasisX1Z * this._localBasisX1Z;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- this._localBasisX1X *= l;
- this._localBasisX1Y *= l;
- this._localBasisX1Z *= l;
- }
- this._localBasisZ1X = this._localBasisX1Y * this._localBasisY1Z - this._localBasisX1Z * this._localBasisY1Y;
- this._localBasisZ1Y = this._localBasisX1Z * this._localBasisY1X - this._localBasisX1X * this._localBasisY1Z;
- this._localBasisZ1Z = this._localBasisX1X * this._localBasisY1Y - this._localBasisX1Y * this._localBasisY1X;
- if(this._localBasisZ1X * this._localBasisZ1X + this._localBasisZ1Y * this._localBasisZ1Y + this._localBasisZ1Z * this._localBasisZ1Z == 0) {
- let x1 = this._localBasisX1X;
- let y1 = this._localBasisX1Y;
- let z1 = this._localBasisX1Z;
- let x2 = x1 * x1;
- let y2 = y1 * y1;
- let z2 = z1 * z1;
- let d;
- if(x2 < y2) {
- if(x2 < z2) {
- d = 1 / Math.sqrt(y2 + z2);
- this._localBasisY1X = 0;
- this._localBasisY1Y = z1 * d;
- this._localBasisY1Z = -y1 * d;
- } else {
- d = 1 / Math.sqrt(x2 + y2);
- this._localBasisY1X = y1 * d;
- this._localBasisY1Y = -x1 * d;
- this._localBasisY1Z = 0;
- }
- } else if(y2 < z2) {
- d = 1 / Math.sqrt(z2 + x2);
- this._localBasisY1X = -z1 * d;
- this._localBasisY1Y = 0;
- this._localBasisY1Z = x1 * d;
- } else {
- d = 1 / Math.sqrt(x2 + y2);
- this._localBasisY1X = y1 * d;
- this._localBasisY1Y = -x1 * d;
- this._localBasisY1Z = 0;
- }
- this._localBasisZ1X = this._localBasisX1Y * this._localBasisY1Z - this._localBasisX1Z * this._localBasisY1Y;
- this._localBasisZ1Y = this._localBasisX1Z * this._localBasisY1X - this._localBasisX1X * this._localBasisY1Z;
- this._localBasisZ1Z = this._localBasisX1X * this._localBasisY1Y - this._localBasisX1Y * this._localBasisY1X;
- } else {
- let l = this._localBasisZ1X * this._localBasisZ1X + this._localBasisZ1Y * this._localBasisZ1Y + this._localBasisZ1Z * this._localBasisZ1Z;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- this._localBasisZ1X *= l;
- this._localBasisZ1Y *= l;
- this._localBasisZ1Z *= l;
- this._localBasisY1X = this._localBasisZ1Y * this._localBasisX1Z - this._localBasisZ1Z * this._localBasisX1Y;
- this._localBasisY1Y = this._localBasisZ1Z * this._localBasisX1X - this._localBasisZ1X * this._localBasisX1Z;
- this._localBasisY1Z = this._localBasisZ1X * this._localBasisX1Y - this._localBasisZ1Y * this._localBasisX1X;
- }
- let slerpQX;
- let slerpQY;
- let slerpQZ;
- let slerpQW;
- let slerpM00;
- let slerpM01;
- let slerpM02;
- let slerpM10;
- let slerpM11;
- let slerpM12;
- let slerpM20;
- let slerpM21;
- let slerpM22;
- let d = this._localBasisX1X * this._localBasisX2X + this._localBasisX1Y * this._localBasisX2Y + this._localBasisX1Z * this._localBasisX2Z;
- if(d < -0.999999999) {
- let vX;
- let vY;
- let vZ;
- let x1 = this._localBasisX1X;
- let y1 = this._localBasisX1Y;
- let z1 = this._localBasisX1Z;
- let x2 = x1 * x1;
- let y2 = y1 * y1;
- let z2 = z1 * z1;
- let d;
- if(x2 < y2) {
- if(x2 < z2) {
- d = 1 / Math.sqrt(y2 + z2);
- vX = 0;
- vY = z1 * d;
- vZ = -y1 * d;
- } else {
- d = 1 / Math.sqrt(x2 + y2);
- vX = y1 * d;
- vY = -x1 * d;
- vZ = 0;
- }
- } else if(y2 < z2) {
- d = 1 / Math.sqrt(z2 + x2);
- vX = -z1 * d;
- vY = 0;
- vZ = x1 * d;
- } else {
- d = 1 / Math.sqrt(x2 + y2);
- vX = y1 * d;
- vY = -x1 * d;
- vZ = 0;
- }
- slerpQX = vX;
- slerpQY = vY;
- slerpQZ = vZ;
- slerpQW = 0;
- } else {
- let cX;
- let cY;
- let cZ;
- cX = this._localBasisX1Y * this._localBasisX2Z - this._localBasisX1Z * this._localBasisX2Y;
- cY = this._localBasisX1Z * this._localBasisX2X - this._localBasisX1X * this._localBasisX2Z;
- cZ = this._localBasisX1X * this._localBasisX2Y - this._localBasisX1Y * this._localBasisX2X;
- let w = Math.sqrt((1 + d) * 0.5);
- d = 0.5 / w;
- cX *= d;
- cY *= d;
- cZ *= d;
- slerpQX = cX;
- slerpQY = cY;
- slerpQZ = cZ;
- slerpQW = w;
- }
- let x = slerpQX;
- let y = slerpQY;
- let z = slerpQZ;
- let w = slerpQW;
- let x2 = 2 * x;
- let y2 = 2 * y;
- let z2 = 2 * z;
- let xx = x * x2;
- let yy = y * y2;
- let zz = z * z2;
- let xy = x * y2;
- let yz = y * z2;
- let xz = x * z2;
- let wx = w * x2;
- let wy = w * y2;
- let wz = w * z2;
- slerpM00 = 1 - yy - zz;
- slerpM01 = xy - wz;
- slerpM02 = xz + wy;
- slerpM10 = xy + wz;
- slerpM11 = 1 - xx - zz;
- slerpM12 = yz - wx;
- slerpM20 = xz - wy;
- slerpM21 = yz + wx;
- slerpM22 = 1 - xx - yy;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = slerpM00 * this._localBasisX1X + slerpM01 * this._localBasisX1Y + slerpM02 * this._localBasisX1Z;
- __tmp__Y = slerpM10 * this._localBasisX1X + slerpM11 * this._localBasisX1Y + slerpM12 * this._localBasisX1Z;
- __tmp__Z = slerpM20 * this._localBasisX1X + slerpM21 * this._localBasisX1Y + slerpM22 * this._localBasisX1Z;
- this._localBasisX2X = __tmp__X;
- this._localBasisX2Y = __tmp__Y;
- this._localBasisX2Z = __tmp__Z;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = slerpM00 * this._localBasisY1X + slerpM01 * this._localBasisY1Y + slerpM02 * this._localBasisY1Z;
- __tmp__Y1 = slerpM10 * this._localBasisY1X + slerpM11 * this._localBasisY1Y + slerpM12 * this._localBasisY1Z;
- __tmp__Z1 = slerpM20 * this._localBasisY1X + slerpM21 * this._localBasisY1Y + slerpM22 * this._localBasisY1Z;
- this._localBasisY2X = __tmp__X1;
- this._localBasisY2Y = __tmp__Y1;
- this._localBasisY2Z = __tmp__Z1;
- let __tmp__X2;
- let __tmp__Y2;
- let __tmp__Z2;
- __tmp__X2 = slerpM00 * this._localBasisZ1X + slerpM01 * this._localBasisZ1Y + slerpM02 * this._localBasisZ1Z;
- __tmp__Y2 = slerpM10 * this._localBasisZ1X + slerpM11 * this._localBasisZ1Y + slerpM12 * this._localBasisZ1Z;
- __tmp__Z2 = slerpM20 * this._localBasisZ1X + slerpM21 * this._localBasisZ1Y + slerpM22 * this._localBasisZ1Z;
- this._localBasisZ2X = __tmp__X2;
- this._localBasisZ2Y = __tmp__Y2;
- this._localBasisZ2Z = __tmp__Z2;
- }
- setSolverInfoRowLinear(row,diff,lm,mass,sd,timeStep,isPositionPart) {
- let cfmFactor;
- let erp;
- let slop = oimo.common.Setting.linearSlop;
- if(isPositionPart) {
- cfmFactor = 0;
- erp = 1;
- } else {
- if(sd.frequency > 0) {
- slop = 0;
- let omega = 6.28318530717958 * sd.frequency;
- let zeta = sd.dampingRatio;
- if(zeta < oimo.common.Setting.minSpringDamperDampingRatio) {
- zeta = oimo.common.Setting.minSpringDamperDampingRatio;
- }
- let h = timeStep.dt;
- let c = 2 * zeta * omega;
- let k = omega * omega;
- if(sd.useSymplecticEuler) {
- cfmFactor = 1 / (h * c);
- erp = k / c;
- } else {
- cfmFactor = 1 / (h * (h * k + c));
- erp = k / (h * k + c);
- }
- } else {
- cfmFactor = 0;
- erp = this.getErp(timeStep,false);
- }
- if(lm.motorForce > 0) {
- row.motorSpeed = lm.motorSpeed;
- row.motorMaxImpulse = lm.motorForce * timeStep.dt;
- } else {
- row.motorSpeed = 0;
- row.motorMaxImpulse = 0;
- }
- }
- let lower = lm.lowerLimit;
- let upper = lm.upperLimit;
- let minImp;
- let maxImp;
- let error;
- if(lower > upper) {
- minImp = 0;
- maxImp = 0;
- error = 0;
- } else if(lower == upper) {
- minImp = -1e65536;
- maxImp = 1e65536;
- error = diff - lower;
- } else if(diff < lower) {
- minImp = -1e65536;
- maxImp = 0;
- error = diff - lower + slop;
- if(error > 0) {
- error = 0;
- }
- } else if(diff > upper) {
- minImp = 0;
- maxImp = 1e65536;
- error = diff - upper - slop;
- if(error < 0) {
- error = 0;
- }
- } else {
- minImp = 0;
- maxImp = 0;
- error = 0;
- }
- row.minImpulse = minImp;
- row.maxImpulse = maxImp;
- row.cfm = cfmFactor * (mass == 0 ? 0 : 1 / mass);
- row.rhs = error * erp;
- }
- setSolverInfoRowAngular(row,diff,lm,mass,sd,timeStep,isPositionPart) {
- let cfmFactor;
- let erp;
- let slop = oimo.common.Setting.angularSlop;
- if(isPositionPart) {
- cfmFactor = 0;
- erp = 1;
- } else {
- if(sd.frequency > 0) {
- slop = 0;
- let omega = 6.28318530717958 * sd.frequency;
- let zeta = sd.dampingRatio;
- if(zeta < oimo.common.Setting.minSpringDamperDampingRatio) {
- zeta = oimo.common.Setting.minSpringDamperDampingRatio;
- }
- let h = timeStep.dt;
- let c = 2 * zeta * omega;
- let k = omega * omega;
- if(sd.useSymplecticEuler) {
- cfmFactor = 1 / (h * c);
- erp = k / c;
- } else {
- cfmFactor = 1 / (h * (h * k + c));
- erp = k / (h * k + c);
- }
- } else {
- cfmFactor = 0;
- erp = this.getErp(timeStep,false);
- }
- if(lm.motorTorque > 0) {
- row.motorSpeed = lm.motorSpeed;
- row.motorMaxImpulse = lm.motorTorque * timeStep.dt;
- } else {
- row.motorSpeed = 0;
- row.motorMaxImpulse = 0;
- }
- }
- let lower = lm.lowerLimit;
- let upper = lm.upperLimit;
- let mid = (lower + upper) * 0.5;
- diff -= mid;
- diff = ((diff + 3.14159265358979) % 6.28318530717958 + 6.28318530717958) % 6.28318530717958 - 3.14159265358979;
- diff += mid;
- let minImp;
- let maxImp;
- let error;
- if(lower > upper) {
- minImp = 0;
- maxImp = 0;
- error = 0;
- } else if(lower == upper) {
- minImp = -1e65536;
- maxImp = 1e65536;
- error = diff - lower;
- } else if(diff < lower) {
- minImp = -1e65536;
- maxImp = 0;
- error = diff - lower + slop;
- if(error > 0) {
- error = 0;
- }
- } else if(diff > upper) {
- minImp = 0;
- maxImp = 1e65536;
- error = diff - upper - slop;
- if(error < 0) {
- error = 0;
- }
- } else {
- minImp = 0;
- maxImp = 0;
- error = 0;
- }
- row.minImpulse = minImp;
- row.maxImpulse = maxImp;
- row.cfm = cfmFactor * (mass == 0 ? 0 : 1 / mass);
- row.rhs = error * erp;
- }
- getErp(timeStep,isPositionPart) {
- if(isPositionPart) {
- return 1;
- } else if(this._positionCorrectionAlgorithm == oimo.dynamics.constraint.PositionCorrectionAlgorithm.BAUMGARTE) {
- return timeStep.invDt * oimo.common.Setting.velocityBaumgarte;
- } else {
- return 0;
- }
- }
- computeEffectiveInertiaMoment(axisX,axisY,axisZ) {
- let ia1X;
- let ia1Y;
- let ia1Z;
- let ia2X;
- let ia2Y;
- let ia2Z;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = this._b1._invInertia00 * axisX + this._b1._invInertia01 * axisY + this._b1._invInertia02 * axisZ;
- __tmp__Y = this._b1._invInertia10 * axisX + this._b1._invInertia11 * axisY + this._b1._invInertia12 * axisZ;
- __tmp__Z = this._b1._invInertia20 * axisX + this._b1._invInertia21 * axisY + this._b1._invInertia22 * axisZ;
- ia1X = __tmp__X;
- ia1Y = __tmp__Y;
- ia1Z = __tmp__Z;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = this._b2._invInertia00 * axisX + this._b2._invInertia01 * axisY + this._b2._invInertia02 * axisZ;
- __tmp__Y1 = this._b2._invInertia10 * axisX + this._b2._invInertia11 * axisY + this._b2._invInertia12 * axisZ;
- __tmp__Z1 = this._b2._invInertia20 * axisX + this._b2._invInertia21 * axisY + this._b2._invInertia22 * axisZ;
- ia2X = __tmp__X1;
- ia2Y = __tmp__Y1;
- ia2Z = __tmp__Z1;
- let invI1 = ia1X * axisX + ia1Y * axisY + ia1Z * axisZ;
- let invI2 = ia2X * axisX + ia2Y * axisY + ia2Z * axisZ;
- if(invI1 > 0) {
- let dot = axisX * this._relativeAnchor1X + axisY * this._relativeAnchor1Y + axisZ * this._relativeAnchor1Z;
- let projsq = this._relativeAnchor1X * this._relativeAnchor1X + this._relativeAnchor1Y * this._relativeAnchor1Y + this._relativeAnchor1Z * this._relativeAnchor1Z - dot * dot;
- if(projsq > 0) {
- if(this._b1._invMass > 0) {
- invI1 = 1 / (1 / invI1 + this._b1._mass * projsq);
- } else {
- invI1 = 0;
- }
- }
- }
- if(invI2 > 0) {
- let dot = axisX * this._relativeAnchor2X + axisY * this._relativeAnchor2Y + axisZ * this._relativeAnchor2Z;
- let projsq = this._relativeAnchor2X * this._relativeAnchor2X + this._relativeAnchor2Y * this._relativeAnchor2Y + this._relativeAnchor2Z * this._relativeAnchor2Z - dot * dot;
- if(projsq > 0) {
- if(this._b2._invMass > 0) {
- invI2 = 1 / (1 / invI2 + this._b2._mass * projsq);
- } else {
- invI2 = 0;
- }
- }
- }
- if(invI1 + invI2 == 0) {
- return 0;
- } else {
- return 1 / (invI1 + invI2);
- }
- }
- computeEffectiveInertiaMoment2(axis1X,axis1Y,axis1Z,axis2X,axis2Y,axis2Z) {
- let ia1X;
- let ia1Y;
- let ia1Z;
- let ia2X;
- let ia2Y;
- let ia2Z;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = this._b1._invInertia00 * axis1X + this._b1._invInertia01 * axis1Y + this._b1._invInertia02 * axis1Z;
- __tmp__Y = this._b1._invInertia10 * axis1X + this._b1._invInertia11 * axis1Y + this._b1._invInertia12 * axis1Z;
- __tmp__Z = this._b1._invInertia20 * axis1X + this._b1._invInertia21 * axis1Y + this._b1._invInertia22 * axis1Z;
- ia1X = __tmp__X;
- ia1Y = __tmp__Y;
- ia1Z = __tmp__Z;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = this._b2._invInertia00 * axis2X + this._b2._invInertia01 * axis2Y + this._b2._invInertia02 * axis2Z;
- __tmp__Y1 = this._b2._invInertia10 * axis2X + this._b2._invInertia11 * axis2Y + this._b2._invInertia12 * axis2Z;
- __tmp__Z1 = this._b2._invInertia20 * axis2X + this._b2._invInertia21 * axis2Y + this._b2._invInertia22 * axis2Z;
- ia2X = __tmp__X1;
- ia2Y = __tmp__Y1;
- ia2Z = __tmp__Z1;
- let invI1 = ia1X * axis1X + ia1Y * axis1Y + ia1Z * axis1Z;
- let invI2 = ia2X * axis2X + ia2Y * axis2Y + ia2Z * axis2Z;
- if(invI1 > 0) {
- let rsq = this._relativeAnchor1X * this._relativeAnchor1X + this._relativeAnchor1Y * this._relativeAnchor1Y + this._relativeAnchor1Z * this._relativeAnchor1Z;
- let dot = axis1X * this._relativeAnchor1X + axis1Y * this._relativeAnchor1Y + axis1Z * this._relativeAnchor1Z;
- let projsq = rsq * rsq - dot * dot;
- if(projsq > 0) {
- if(this._b1._invMass > 0) {
- invI1 = 1 / (1 / invI1 + this._b1._mass * projsq);
- } else {
- invI1 = 0;
- }
- }
- }
- if(invI2 > 0) {
- let rsq = this._relativeAnchor2X * this._relativeAnchor2X + this._relativeAnchor2Y * this._relativeAnchor2Y + this._relativeAnchor2Z * this._relativeAnchor2Z;
- let dot = axis2X * this._relativeAnchor2X + axis2Y * this._relativeAnchor2Y + axis2Z * this._relativeAnchor2Z;
- let projsq = rsq * rsq - dot * dot;
- if(projsq > 0) {
- if(this._b2._invMass > 0) {
- invI2 = 1 / (1 / invI2 + this._b2._mass * projsq);
- } else {
- invI2 = 0;
- }
- }
- }
- if(invI1 + invI2 == 0) {
- return 0;
- } else {
- return 1 / (invI1 + invI2);
- }
- }
- _syncAnchors() {
- let tf1 = this._b1._transform;
- let tf2 = this._b2._transform;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = tf1._rotation00 * this._localAnchor1X + tf1._rotation01 * this._localAnchor1Y + tf1._rotation02 * this._localAnchor1Z;
- __tmp__Y = tf1._rotation10 * this._localAnchor1X + tf1._rotation11 * this._localAnchor1Y + tf1._rotation12 * this._localAnchor1Z;
- __tmp__Z = tf1._rotation20 * this._localAnchor1X + tf1._rotation21 * this._localAnchor1Y + tf1._rotation22 * this._localAnchor1Z;
- this._relativeAnchor1X = __tmp__X;
- this._relativeAnchor1Y = __tmp__Y;
- this._relativeAnchor1Z = __tmp__Z;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = tf2._rotation00 * this._localAnchor2X + tf2._rotation01 * this._localAnchor2Y + tf2._rotation02 * this._localAnchor2Z;
- __tmp__Y1 = tf2._rotation10 * this._localAnchor2X + tf2._rotation11 * this._localAnchor2Y + tf2._rotation12 * this._localAnchor2Z;
- __tmp__Z1 = tf2._rotation20 * this._localAnchor2X + tf2._rotation21 * this._localAnchor2Y + tf2._rotation22 * this._localAnchor2Z;
- this._relativeAnchor2X = __tmp__X1;
- this._relativeAnchor2Y = __tmp__Y1;
- this._relativeAnchor2Z = __tmp__Z1;
- this._anchor1X = this._relativeAnchor1X + tf1._positionX;
- this._anchor1Y = this._relativeAnchor1Y + tf1._positionY;
- this._anchor1Z = this._relativeAnchor1Z + tf1._positionZ;
- this._anchor2X = this._relativeAnchor2X + tf2._positionX;
- this._anchor2Y = this._relativeAnchor2Y + tf2._positionY;
- this._anchor2Z = this._relativeAnchor2Z + tf2._positionZ;
- let __tmp__X2;
- let __tmp__Y2;
- let __tmp__Z2;
- __tmp__X2 = tf1._rotation00 * this._localBasisX1X + tf1._rotation01 * this._localBasisX1Y + tf1._rotation02 * this._localBasisX1Z;
- __tmp__Y2 = tf1._rotation10 * this._localBasisX1X + tf1._rotation11 * this._localBasisX1Y + tf1._rotation12 * this._localBasisX1Z;
- __tmp__Z2 = tf1._rotation20 * this._localBasisX1X + tf1._rotation21 * this._localBasisX1Y + tf1._rotation22 * this._localBasisX1Z;
- this._basisX1X = __tmp__X2;
- this._basisX1Y = __tmp__Y2;
- this._basisX1Z = __tmp__Z2;
- let __tmp__X3;
- let __tmp__Y3;
- let __tmp__Z3;
- __tmp__X3 = tf1._rotation00 * this._localBasisY1X + tf1._rotation01 * this._localBasisY1Y + tf1._rotation02 * this._localBasisY1Z;
- __tmp__Y3 = tf1._rotation10 * this._localBasisY1X + tf1._rotation11 * this._localBasisY1Y + tf1._rotation12 * this._localBasisY1Z;
- __tmp__Z3 = tf1._rotation20 * this._localBasisY1X + tf1._rotation21 * this._localBasisY1Y + tf1._rotation22 * this._localBasisY1Z;
- this._basisY1X = __tmp__X3;
- this._basisY1Y = __tmp__Y3;
- this._basisY1Z = __tmp__Z3;
- let __tmp__X4;
- let __tmp__Y4;
- let __tmp__Z4;
- __tmp__X4 = tf1._rotation00 * this._localBasisZ1X + tf1._rotation01 * this._localBasisZ1Y + tf1._rotation02 * this._localBasisZ1Z;
- __tmp__Y4 = tf1._rotation10 * this._localBasisZ1X + tf1._rotation11 * this._localBasisZ1Y + tf1._rotation12 * this._localBasisZ1Z;
- __tmp__Z4 = tf1._rotation20 * this._localBasisZ1X + tf1._rotation21 * this._localBasisZ1Y + tf1._rotation22 * this._localBasisZ1Z;
- this._basisZ1X = __tmp__X4;
- this._basisZ1Y = __tmp__Y4;
- this._basisZ1Z = __tmp__Z4;
- let __tmp__X5;
- let __tmp__Y5;
- let __tmp__Z5;
- __tmp__X5 = tf2._rotation00 * this._localBasisX2X + tf2._rotation01 * this._localBasisX2Y + tf2._rotation02 * this._localBasisX2Z;
- __tmp__Y5 = tf2._rotation10 * this._localBasisX2X + tf2._rotation11 * this._localBasisX2Y + tf2._rotation12 * this._localBasisX2Z;
- __tmp__Z5 = tf2._rotation20 * this._localBasisX2X + tf2._rotation21 * this._localBasisX2Y + tf2._rotation22 * this._localBasisX2Z;
- this._basisX2X = __tmp__X5;
- this._basisX2Y = __tmp__Y5;
- this._basisX2Z = __tmp__Z5;
- let __tmp__X6;
- let __tmp__Y6;
- let __tmp__Z6;
- __tmp__X6 = tf2._rotation00 * this._localBasisY2X + tf2._rotation01 * this._localBasisY2Y + tf2._rotation02 * this._localBasisY2Z;
- __tmp__Y6 = tf2._rotation10 * this._localBasisY2X + tf2._rotation11 * this._localBasisY2Y + tf2._rotation12 * this._localBasisY2Z;
- __tmp__Z6 = tf2._rotation20 * this._localBasisY2X + tf2._rotation21 * this._localBasisY2Y + tf2._rotation22 * this._localBasisY2Z;
- this._basisY2X = __tmp__X6;
- this._basisY2Y = __tmp__Y6;
- this._basisY2Z = __tmp__Z6;
- let __tmp__X7;
- let __tmp__Y7;
- let __tmp__Z7;
- __tmp__X7 = tf2._rotation00 * this._localBasisZ2X + tf2._rotation01 * this._localBasisZ2Y + tf2._rotation02 * this._localBasisZ2Z;
- __tmp__Y7 = tf2._rotation10 * this._localBasisZ2X + tf2._rotation11 * this._localBasisZ2Y + tf2._rotation12 * this._localBasisZ2Z;
- __tmp__Z7 = tf2._rotation20 * this._localBasisZ2X + tf2._rotation21 * this._localBasisZ2Y + tf2._rotation22 * this._localBasisZ2Z;
- this._basisZ2X = __tmp__X7;
- this._basisZ2Y = __tmp__Y7;
- this._basisZ2Z = __tmp__Z7;
- }
- _getVelocitySolverInfo(timeStep,info) {
- info.b1 = this._b1;
- info.b2 = this._b2;
- info.numRows = 0;
- }
- _getPositionSolverInfo(info) {
- info.b1 = this._b1;
- info.b2 = this._b2;
- info.numRows = 0;
- }
- _checkDestruction() {
- let torqueSq = this._appliedTorqueX * this._appliedTorqueX + this._appliedTorqueY * this._appliedTorqueY + this._appliedTorqueZ * this._appliedTorqueZ;
- if(this._breakForce > 0 && this._appliedForceX * this._appliedForceX + this._appliedForceY * this._appliedForceY + this._appliedForceZ * this._appliedForceZ > this._breakForce * this._breakForce) {
- this._world.removeJoint(this);
- return;
- }
- if(this._breakTorque > 0 && torqueSq > this._breakTorque * this._breakTorque) {
- this._world.removeJoint(this);
- return;
- }
- }
- getRigidBody1() {
- return this._b1;
- }
- getRigidBody2() {
- return this._b2;
- }
- getType() {
- return this._type;
- }
- getAnchor1() {
- let v = new oimo.common.Vec3();
- v.x = this._anchor1X;
- v.y = this._anchor1Y;
- v.z = this._anchor1Z;
- return v;
- }
- getAnchor2() {
- let v = new oimo.common.Vec3();
- v.x = this._anchor2X;
- v.y = this._anchor2Y;
- v.z = this._anchor2Z;
- return v;
- }
- getAnchor1To(anchor) {
- anchor.x = this._anchor1X;
- anchor.y = this._anchor1Y;
- anchor.z = this._anchor1Z;
- }
- getAnchor2To(anchor) {
- anchor.x = this._anchor2X;
- anchor.y = this._anchor2Y;
- anchor.z = this._anchor2Z;
- }
- getLocalAnchor1() {
- let v = new oimo.common.Vec3();
- v.x = this._localAnchor1X;
- v.y = this._localAnchor1Y;
- v.z = this._localAnchor1Z;
- return v;
- }
- getLocalAnchor2() {
- let v = new oimo.common.Vec3();
- v.x = this._localAnchor2X;
- v.y = this._localAnchor2Y;
- v.z = this._localAnchor2Z;
- return v;
- }
- getLocalAnchor1To(localAnchor) {
- localAnchor.x = this._localAnchor1X;
- localAnchor.y = this._localAnchor1Y;
- localAnchor.z = this._localAnchor1Z;
- }
- getLocalAnchor2To(localAnchor) {
- localAnchor.x = this._localAnchor2X;
- localAnchor.y = this._localAnchor2Y;
- localAnchor.z = this._localAnchor2Z;
- }
- getBasis1() {
- let m = new oimo.common.Mat3();
- let b00;
- let b01;
- let b02;
- let b10;
- let b11;
- let b12;
- let b20;
- let b21;
- let b22;
- b00 = this._basisX1X;
- b01 = this._basisY1X;
- b02 = this._basisZ1X;
- b10 = this._basisX1Y;
- b11 = this._basisY1Y;
- b12 = this._basisZ1Y;
- b20 = this._basisX1Z;
- b21 = this._basisY1Z;
- b22 = this._basisZ1Z;
- m.e00 = b00;
- m.e01 = b01;
- m.e02 = b02;
- m.e10 = b10;
- m.e11 = b11;
- m.e12 = b12;
- m.e20 = b20;
- m.e21 = b21;
- m.e22 = b22;
- return m;
- }
- getBasis2() {
- let m = new oimo.common.Mat3();
- let b00;
- let b01;
- let b02;
- let b10;
- let b11;
- let b12;
- let b20;
- let b21;
- let b22;
- b00 = this._basisX2X;
- b01 = this._basisY2X;
- b02 = this._basisZ2X;
- b10 = this._basisX2Y;
- b11 = this._basisY2Y;
- b12 = this._basisZ2Y;
- b20 = this._basisX2Z;
- b21 = this._basisY2Z;
- b22 = this._basisZ2Z;
- m.e00 = b00;
- m.e01 = b01;
- m.e02 = b02;
- m.e10 = b10;
- m.e11 = b11;
- m.e12 = b12;
- m.e20 = b20;
- m.e21 = b21;
- m.e22 = b22;
- return m;
- }
- getBasis1To(basis) {
- let b00;
- let b01;
- let b02;
- let b10;
- let b11;
- let b12;
- let b20;
- let b21;
- let b22;
- b00 = this._basisX1X;
- b01 = this._basisY1X;
- b02 = this._basisZ1X;
- b10 = this._basisX1Y;
- b11 = this._basisY1Y;
- b12 = this._basisZ1Y;
- b20 = this._basisX1Z;
- b21 = this._basisY1Z;
- b22 = this._basisZ1Z;
- basis.e00 = b00;
- basis.e01 = b01;
- basis.e02 = b02;
- basis.e10 = b10;
- basis.e11 = b11;
- basis.e12 = b12;
- basis.e20 = b20;
- basis.e21 = b21;
- basis.e22 = b22;
- }
- getBasis2To(basis) {
- let b00;
- let b01;
- let b02;
- let b10;
- let b11;
- let b12;
- let b20;
- let b21;
- let b22;
- b00 = this._basisX2X;
- b01 = this._basisY2X;
- b02 = this._basisZ2X;
- b10 = this._basisX2Y;
- b11 = this._basisY2Y;
- b12 = this._basisZ2Y;
- b20 = this._basisX2Z;
- b21 = this._basisY2Z;
- b22 = this._basisZ2Z;
- basis.e00 = b00;
- basis.e01 = b01;
- basis.e02 = b02;
- basis.e10 = b10;
- basis.e11 = b11;
- basis.e12 = b12;
- basis.e20 = b20;
- basis.e21 = b21;
- basis.e22 = b22;
- }
- getAllowCollision() {
- return this._allowCollision;
- }
- setAllowCollision(allowCollision) {
- this._allowCollision = allowCollision;
- }
- getBreakForce() {
- return this._breakForce;
- }
- setBreakForce(breakForce) {
- this._breakForce = breakForce;
- }
- getBreakTorque() {
- return this._breakTorque;
- }
- setBreakTorque(breakTorque) {
- this._breakTorque = breakTorque;
- }
- getPositionCorrectionAlgorithm() {
- return this._positionCorrectionAlgorithm;
- }
- setPositionCorrectionAlgorithm(positionCorrectionAlgorithm) {
- switch(positionCorrectionAlgorithm) {
- case 0:case 1:case 2:
- break;
- default:
- throw new Error("invalid position correction algorithm id: " + positionCorrectionAlgorithm);
- }
- this._positionCorrectionAlgorithm = positionCorrectionAlgorithm;
- }
- getAppliedForce() {
- let v = new oimo.common.Vec3();
- v.x = this._appliedForceX;
- v.y = this._appliedForceY;
- v.z = this._appliedForceZ;
- return v;
- }
- getAppliedForceTo(appliedForce) {
- appliedForce.x = this._appliedForceX;
- appliedForce.y = this._appliedForceY;
- appliedForce.z = this._appliedForceZ;
- }
- getAppliedTorque() {
- let v = new oimo.common.Vec3();
- v.x = this._appliedTorqueX;
- v.y = this._appliedTorqueY;
- v.z = this._appliedTorqueZ;
- return v;
- }
- getAppliedTorqueTo(appliedTorque) {
- appliedTorque.x = this._appliedTorqueX;
- appliedTorque.y = this._appliedTorqueY;
- appliedTorque.z = this._appliedTorqueZ;
- }
- getPrev() {
- return this._prev;
- }
- getNext() {
- return this._next;
- }
- }
- oimo.dynamics.constraint.joint.CylindricalJoint = class oimo_dynamics_constraint_joint_CylindricalJoint extends oimo.dynamics.constraint.joint.Joint {
- constructor(config) {
- super(config,2);
- let v = config.localAxis1;
- this._localBasisX1X = v.x;
- this._localBasisX1Y = v.y;
- this._localBasisX1Z = v.z;
- let v1 = config.localAxis2;
- this._localBasisX2X = v1.x;
- this._localBasisX2Y = v1.y;
- this._localBasisX2Z = v1.z;
- this.buildLocalBasesFromX();
- this.angle = 0;
- this.angularErrorY = 0;
- this.angularErrorZ = 0;
- this.translation = 0;
- this.linearErrorY = 0;
- this.linearErrorZ = 0;
- this._basis = new oimo.dynamics.constraint.joint.BasisTracker(this);
- this._translSd = config.translationalSpringDamper.clone();
- this._translLm = config.translationalLimitMotor.clone();
- this._rotSd = config.rotationalSpringDamper.clone();
- this._rotLm = config.rotationalLimitMotor.clone();
- }
- getInfo(info,timeStep,isPositionPart) {
- let erp = this.getErp(timeStep,isPositionPart);
- let linRhsY = this.linearErrorY * erp;
- let linRhsZ = this.linearErrorZ * erp;
- let angRhsY = this.angularErrorY * erp;
- let angRhsZ = this.angularErrorZ * erp;
- let j;
- let translationalMotorMass = 1 / (this._b1._invMass + this._b2._invMass);
- let rotationalMotorMass = this.computeEffectiveInertiaMoment(this._basis.xX,this._basis.xY,this._basis.xZ);
- if(this._translSd.frequency <= 0 || !isPositionPart) {
- let impulse = this._impulses[0];
- let row = info.rows[info.numRows++];
- let _this = row.jacobian;
- _this.lin1X = 0;
- _this.lin1Y = 0;
- _this.lin1Z = 0;
- _this.lin2X = 0;
- _this.lin2Y = 0;
- _this.lin2Z = 0;
- _this.ang1X = 0;
- _this.ang1Y = 0;
- _this.ang1Z = 0;
- _this.ang2X = 0;
- _this.ang2Y = 0;
- _this.ang2Z = 0;
- row.rhs = 0;
- row.cfm = 0;
- row.minImpulse = 0;
- row.maxImpulse = 0;
- row.motorSpeed = 0;
- row.motorMaxImpulse = 0;
- row.impulse = null;
- row.impulse = impulse;
- this.setSolverInfoRowLinear(row,this.translation,this._translLm,translationalMotorMass,this._translSd,timeStep,isPositionPart);
- j = row.jacobian;
- j.lin1X = this._basis.xX;
- j.lin1Y = this._basis.xY;
- j.lin1Z = this._basis.xZ;
- j.lin2X = this._basis.xX;
- j.lin2Y = this._basis.xY;
- j.lin2Z = this._basis.xZ;
- j.ang1X = this._relativeAnchor1Y * this._basis.xZ - this._relativeAnchor1Z * this._basis.xY;
- j.ang1Y = this._relativeAnchor1Z * this._basis.xX - this._relativeAnchor1X * this._basis.xZ;
- j.ang1Z = this._relativeAnchor1X * this._basis.xY - this._relativeAnchor1Y * this._basis.xX;
- j.ang2X = this._relativeAnchor2Y * this._basis.xZ - this._relativeAnchor2Z * this._basis.xY;
- j.ang2Y = this._relativeAnchor2Z * this._basis.xX - this._relativeAnchor2X * this._basis.xZ;
- j.ang2Z = this._relativeAnchor2X * this._basis.xY - this._relativeAnchor2Y * this._basis.xX;
- }
- let impulse = this._impulses[1];
- let row = info.rows[info.numRows++];
- let _this = row.jacobian;
- _this.lin1X = 0;
- _this.lin1Y = 0;
- _this.lin1Z = 0;
- _this.lin2X = 0;
- _this.lin2Y = 0;
- _this.lin2Z = 0;
- _this.ang1X = 0;
- _this.ang1Y = 0;
- _this.ang1Z = 0;
- _this.ang2X = 0;
- _this.ang2Y = 0;
- _this.ang2Z = 0;
- row.rhs = 0;
- row.cfm = 0;
- row.minImpulse = 0;
- row.maxImpulse = 0;
- row.motorSpeed = 0;
- row.motorMaxImpulse = 0;
- row.impulse = null;
- row.impulse = impulse;
- row.rhs = linRhsY;
- row.cfm = 0;
- row.minImpulse = -1e65536;
- row.maxImpulse = 1e65536;
- j = row.jacobian;
- j.lin1X = this._basis.yX;
- j.lin1Y = this._basis.yY;
- j.lin1Z = this._basis.yZ;
- j.lin2X = this._basis.yX;
- j.lin2Y = this._basis.yY;
- j.lin2Z = this._basis.yZ;
- j.ang1X = this._relativeAnchor1Y * this._basis.yZ - this._relativeAnchor1Z * this._basis.yY;
- j.ang1Y = this._relativeAnchor1Z * this._basis.yX - this._relativeAnchor1X * this._basis.yZ;
- j.ang1Z = this._relativeAnchor1X * this._basis.yY - this._relativeAnchor1Y * this._basis.yX;
- j.ang2X = this._relativeAnchor2Y * this._basis.yZ - this._relativeAnchor2Z * this._basis.yY;
- j.ang2Y = this._relativeAnchor2Z * this._basis.yX - this._relativeAnchor2X * this._basis.yZ;
- j.ang2Z = this._relativeAnchor2X * this._basis.yY - this._relativeAnchor2Y * this._basis.yX;
- let impulse1 = this._impulses[2];
- let row1 = info.rows[info.numRows++];
- let _this1 = row1.jacobian;
- _this1.lin1X = 0;
- _this1.lin1Y = 0;
- _this1.lin1Z = 0;
- _this1.lin2X = 0;
- _this1.lin2Y = 0;
- _this1.lin2Z = 0;
- _this1.ang1X = 0;
- _this1.ang1Y = 0;
- _this1.ang1Z = 0;
- _this1.ang2X = 0;
- _this1.ang2Y = 0;
- _this1.ang2Z = 0;
- row1.rhs = 0;
- row1.cfm = 0;
- row1.minImpulse = 0;
- row1.maxImpulse = 0;
- row1.motorSpeed = 0;
- row1.motorMaxImpulse = 0;
- row1.impulse = null;
- row1.impulse = impulse1;
- row1.rhs = linRhsZ;
- row1.cfm = 0;
- row1.minImpulse = -1e65536;
- row1.maxImpulse = 1e65536;
- j = row1.jacobian;
- j.lin1X = this._basis.zX;
- j.lin1Y = this._basis.zY;
- j.lin1Z = this._basis.zZ;
- j.lin2X = this._basis.zX;
- j.lin2Y = this._basis.zY;
- j.lin2Z = this._basis.zZ;
- j.ang1X = this._relativeAnchor1Y * this._basis.zZ - this._relativeAnchor1Z * this._basis.zY;
- j.ang1Y = this._relativeAnchor1Z * this._basis.zX - this._relativeAnchor1X * this._basis.zZ;
- j.ang1Z = this._relativeAnchor1X * this._basis.zY - this._relativeAnchor1Y * this._basis.zX;
- j.ang2X = this._relativeAnchor2Y * this._basis.zZ - this._relativeAnchor2Z * this._basis.zY;
- j.ang2Y = this._relativeAnchor2Z * this._basis.zX - this._relativeAnchor2X * this._basis.zZ;
- j.ang2Z = this._relativeAnchor2X * this._basis.zY - this._relativeAnchor2Y * this._basis.zX;
- if(this._rotSd.frequency <= 0 || !isPositionPart) {
- let impulse = this._impulses[3];
- let row = info.rows[info.numRows++];
- let _this = row.jacobian;
- _this.lin1X = 0;
- _this.lin1Y = 0;
- _this.lin1Z = 0;
- _this.lin2X = 0;
- _this.lin2Y = 0;
- _this.lin2Z = 0;
- _this.ang1X = 0;
- _this.ang1Y = 0;
- _this.ang1Z = 0;
- _this.ang2X = 0;
- _this.ang2Y = 0;
- _this.ang2Z = 0;
- row.rhs = 0;
- row.cfm = 0;
- row.minImpulse = 0;
- row.maxImpulse = 0;
- row.motorSpeed = 0;
- row.motorMaxImpulse = 0;
- row.impulse = null;
- row.impulse = impulse;
- this.setSolverInfoRowAngular(row,this.angle,this._rotLm,rotationalMotorMass,this._rotSd,timeStep,isPositionPart);
- j = row.jacobian;
- j.ang1X = this._basis.xX;
- j.ang1Y = this._basis.xY;
- j.ang1Z = this._basis.xZ;
- j.ang2X = this._basis.xX;
- j.ang2Y = this._basis.xY;
- j.ang2Z = this._basis.xZ;
- }
- let impulse2 = this._impulses[4];
- let row2 = info.rows[info.numRows++];
- let _this2 = row2.jacobian;
- _this2.lin1X = 0;
- _this2.lin1Y = 0;
- _this2.lin1Z = 0;
- _this2.lin2X = 0;
- _this2.lin2Y = 0;
- _this2.lin2Z = 0;
- _this2.ang1X = 0;
- _this2.ang1Y = 0;
- _this2.ang1Z = 0;
- _this2.ang2X = 0;
- _this2.ang2Y = 0;
- _this2.ang2Z = 0;
- row2.rhs = 0;
- row2.cfm = 0;
- row2.minImpulse = 0;
- row2.maxImpulse = 0;
- row2.motorSpeed = 0;
- row2.motorMaxImpulse = 0;
- row2.impulse = null;
- row2.impulse = impulse2;
- row2.rhs = angRhsY;
- row2.cfm = 0;
- row2.minImpulse = -1e65536;
- row2.maxImpulse = 1e65536;
- j = row2.jacobian;
- j.ang1X = this._basis.yX;
- j.ang1Y = this._basis.yY;
- j.ang1Z = this._basis.yZ;
- j.ang2X = this._basis.yX;
- j.ang2Y = this._basis.yY;
- j.ang2Z = this._basis.yZ;
- let impulse3 = this._impulses[5];
- let row3 = info.rows[info.numRows++];
- let _this3 = row3.jacobian;
- _this3.lin1X = 0;
- _this3.lin1Y = 0;
- _this3.lin1Z = 0;
- _this3.lin2X = 0;
- _this3.lin2Y = 0;
- _this3.lin2Z = 0;
- _this3.ang1X = 0;
- _this3.ang1Y = 0;
- _this3.ang1Z = 0;
- _this3.ang2X = 0;
- _this3.ang2Y = 0;
- _this3.ang2Z = 0;
- row3.rhs = 0;
- row3.cfm = 0;
- row3.minImpulse = 0;
- row3.maxImpulse = 0;
- row3.motorSpeed = 0;
- row3.motorMaxImpulse = 0;
- row3.impulse = null;
- row3.impulse = impulse3;
- row3.rhs = angRhsZ;
- row3.cfm = 0;
- row3.minImpulse = -1e65536;
- row3.maxImpulse = 1e65536;
- j = row3.jacobian;
- j.ang1X = this._basis.zX;
- j.ang1Y = this._basis.zY;
- j.ang1Z = this._basis.zZ;
- j.ang2X = this._basis.zX;
- j.ang2Y = this._basis.zY;
- j.ang2Z = this._basis.zZ;
- }
- _syncAnchors() {
- super._syncAnchors();
- let _this = this._basis;
- let invM1 = _this.joint._b1._invMass;
- let invM2 = _this.joint._b2._invMass;
- let qX;
- let qY;
- let qZ;
- let qW;
- let idQX;
- let idQY;
- let idQZ;
- let idQW;
- let slerpQX;
- let slerpQY;
- let slerpQZ;
- let slerpQW;
- let slerpM00;
- let slerpM01;
- let slerpM02;
- let slerpM10;
- let slerpM11;
- let slerpM12;
- let slerpM20;
- let slerpM21;
- let slerpM22;
- let newXX;
- let newXY;
- let newXZ;
- let newYX;
- let newYY;
- let newYZ;
- let newZX;
- let newZY;
- let newZZ;
- let prevXX;
- let prevXY;
- let prevXZ;
- let prevYX;
- let prevYY;
- let prevYZ;
- let d = _this.joint._basisX1X * _this.joint._basisX2X + _this.joint._basisX1Y * _this.joint._basisX2Y + _this.joint._basisX1Z * _this.joint._basisX2Z;
- if(d < -0.999999999) {
- let vX;
- let vY;
- let vZ;
- let x1 = _this.joint._basisX1X;
- let y1 = _this.joint._basisX1Y;
- let z1 = _this.joint._basisX1Z;
- let x2 = x1 * x1;
- let y2 = y1 * y1;
- let z2 = z1 * z1;
- let d;
- if(x2 < y2) {
- if(x2 < z2) {
- d = 1 / Math.sqrt(y2 + z2);
- vX = 0;
- vY = z1 * d;
- vZ = -y1 * d;
- } else {
- d = 1 / Math.sqrt(x2 + y2);
- vX = y1 * d;
- vY = -x1 * d;
- vZ = 0;
- }
- } else if(y2 < z2) {
- d = 1 / Math.sqrt(z2 + x2);
- vX = -z1 * d;
- vY = 0;
- vZ = x1 * d;
- } else {
- d = 1 / Math.sqrt(x2 + y2);
- vX = y1 * d;
- vY = -x1 * d;
- vZ = 0;
- }
- qX = vX;
- qY = vY;
- qZ = vZ;
- qW = 0;
- } else {
- let cX;
- let cY;
- let cZ;
- cX = _this.joint._basisX1Y * _this.joint._basisX2Z - _this.joint._basisX1Z * _this.joint._basisX2Y;
- cY = _this.joint._basisX1Z * _this.joint._basisX2X - _this.joint._basisX1X * _this.joint._basisX2Z;
- cZ = _this.joint._basisX1X * _this.joint._basisX2Y - _this.joint._basisX1Y * _this.joint._basisX2X;
- let w = Math.sqrt((1 + d) * 0.5);
- d = 0.5 / w;
- cX *= d;
- cY *= d;
- cZ *= d;
- qX = cX;
- qY = cY;
- qZ = cZ;
- qW = w;
- }
- idQX = 0;
- idQY = 0;
- idQZ = 0;
- idQW = 1;
- let q1X;
- let q1Y;
- let q1Z;
- let q1W;
- let q2X;
- let q2Y;
- let q2Z;
- let q2W;
- q1X = idQX;
- q1Y = idQY;
- q1Z = idQZ;
- q1W = idQW;
- q2X = qX;
- q2Y = qY;
- q2Z = qZ;
- q2W = qW;
- let d1 = q1X * q2X + q1Y * q2Y + q1Z * q2Z + q1W * q2W;
- if(d1 < 0) {
- d1 = -d1;
- q2X = -q2X;
- q2Y = -q2Y;
- q2Z = -q2Z;
- q2W = -q2W;
- }
- if(d1 > 0.999999) {
- let dqX;
- let dqY;
- let dqZ;
- let dqW;
- dqX = q2X - q1X;
- dqY = q2Y - q1Y;
- dqZ = q2Z - q1Z;
- dqW = q2W - q1W;
- q2X = q1X + dqX * (invM1 / (invM1 + invM2));
- q2Y = q1Y + dqY * (invM1 / (invM1 + invM2));
- q2Z = q1Z + dqZ * (invM1 / (invM1 + invM2));
- q2W = q1W + dqW * (invM1 / (invM1 + invM2));
- let l = q2X * q2X + q2Y * q2Y + q2Z * q2Z + q2W * q2W;
- if(l > 1e-32) {
- l = 1 / Math.sqrt(l);
- }
- slerpQX = q2X * l;
- slerpQY = q2Y * l;
- slerpQZ = q2Z * l;
- slerpQW = q2W * l;
- } else {
- let theta = invM1 / (invM1 + invM2) * Math.acos(d1);
- q2X += q1X * -d1;
- q2Y += q1Y * -d1;
- q2Z += q1Z * -d1;
- q2W += q1W * -d1;
- let l = q2X * q2X + q2Y * q2Y + q2Z * q2Z + q2W * q2W;
- if(l > 1e-32) {
- l = 1 / Math.sqrt(l);
- }
- q2X *= l;
- q2Y *= l;
- q2Z *= l;
- q2W *= l;
- let sin = Math.sin(theta);
- let cos = Math.cos(theta);
- q1X *= cos;
- q1Y *= cos;
- q1Z *= cos;
- q1W *= cos;
- slerpQX = q1X + q2X * sin;
- slerpQY = q1Y + q2Y * sin;
- slerpQZ = q1Z + q2Z * sin;
- slerpQW = q1W + q2W * sin;
- }
- let x = slerpQX;
- let y = slerpQY;
- let z = slerpQZ;
- let w = slerpQW;
- let x2 = 2 * x;
- let y2 = 2 * y;
- let z2 = 2 * z;
- let xx = x * x2;
- let yy = y * y2;
- let zz = z * z2;
- let xy = x * y2;
- let yz = y * z2;
- let xz = x * z2;
- let wx = w * x2;
- let wy = w * y2;
- let wz = w * z2;
- slerpM00 = 1 - yy - zz;
- slerpM01 = xy - wz;
- slerpM02 = xz + wy;
- slerpM10 = xy + wz;
- slerpM11 = 1 - xx - zz;
- slerpM12 = yz - wx;
- slerpM20 = xz - wy;
- slerpM21 = yz + wx;
- slerpM22 = 1 - xx - yy;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = slerpM00 * _this.joint._basisX1X + slerpM01 * _this.joint._basisX1Y + slerpM02 * _this.joint._basisX1Z;
- __tmp__Y = slerpM10 * _this.joint._basisX1X + slerpM11 * _this.joint._basisX1Y + slerpM12 * _this.joint._basisX1Z;
- __tmp__Z = slerpM20 * _this.joint._basisX1X + slerpM21 * _this.joint._basisX1Y + slerpM22 * _this.joint._basisX1Z;
- newXX = __tmp__X;
- newXY = __tmp__Y;
- newXZ = __tmp__Z;
- prevXX = _this.xX;
- prevXY = _this.xY;
- prevXZ = _this.xZ;
- prevYX = _this.yX;
- prevYY = _this.yY;
- prevYZ = _this.yZ;
- let d2 = prevXX * newXX + prevXY * newXY + prevXZ * newXZ;
- if(d2 < -0.999999999) {
- let vX;
- let vY;
- let vZ;
- let x1 = prevXX;
- let y1 = prevXY;
- let z1 = prevXZ;
- let x2 = x1 * x1;
- let y2 = y1 * y1;
- let z2 = z1 * z1;
- let d;
- if(x2 < y2) {
- if(x2 < z2) {
- d = 1 / Math.sqrt(y2 + z2);
- vX = 0;
- vY = z1 * d;
- vZ = -y1 * d;
- } else {
- d = 1 / Math.sqrt(x2 + y2);
- vX = y1 * d;
- vY = -x1 * d;
- vZ = 0;
- }
- } else if(y2 < z2) {
- d = 1 / Math.sqrt(z2 + x2);
- vX = -z1 * d;
- vY = 0;
- vZ = x1 * d;
- } else {
- d = 1 / Math.sqrt(x2 + y2);
- vX = y1 * d;
- vY = -x1 * d;
- vZ = 0;
- }
- slerpQX = vX;
- slerpQY = vY;
- slerpQZ = vZ;
- slerpQW = 0;
- } else {
- let cX;
- let cY;
- let cZ;
- cX = prevXY * newXZ - prevXZ * newXY;
- cY = prevXZ * newXX - prevXX * newXZ;
- cZ = prevXX * newXY - prevXY * newXX;
- let w = Math.sqrt((1 + d2) * 0.5);
- d2 = 0.5 / w;
- cX *= d2;
- cY *= d2;
- cZ *= d2;
- slerpQX = cX;
- slerpQY = cY;
- slerpQZ = cZ;
- slerpQW = w;
- }
- let x1 = slerpQX;
- let y1 = slerpQY;
- let z1 = slerpQZ;
- let w1 = slerpQW;
- let x21 = 2 * x1;
- let y21 = 2 * y1;
- let z21 = 2 * z1;
- let xx1 = x1 * x21;
- let yy1 = y1 * y21;
- let zz1 = z1 * z21;
- let xy1 = x1 * y21;
- let yz1 = y1 * z21;
- let xz1 = x1 * z21;
- let wx1 = w1 * x21;
- let wy1 = w1 * y21;
- let wz1 = w1 * z21;
- slerpM00 = 1 - yy1 - zz1;
- slerpM01 = xy1 - wz1;
- slerpM02 = xz1 + wy1;
- slerpM10 = xy1 + wz1;
- slerpM11 = 1 - xx1 - zz1;
- slerpM12 = yz1 - wx1;
- slerpM20 = xz1 - wy1;
- slerpM21 = yz1 + wx1;
- slerpM22 = 1 - xx1 - yy1;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = slerpM00 * prevYX + slerpM01 * prevYY + slerpM02 * prevYZ;
- __tmp__Y1 = slerpM10 * prevYX + slerpM11 * prevYY + slerpM12 * prevYZ;
- __tmp__Z1 = slerpM20 * prevYX + slerpM21 * prevYY + slerpM22 * prevYZ;
- newYX = __tmp__X1;
- newYY = __tmp__Y1;
- newYZ = __tmp__Z1;
- newZX = newXY * newYZ - newXZ * newYY;
- newZY = newXZ * newYX - newXX * newYZ;
- newZZ = newXX * newYY - newXY * newYX;
- if(newZX * newZX + newZY * newZY + newZZ * newZZ > 1e-6) {
- let l = newZX * newZX + newZY * newZY + newZZ * newZZ;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- newZX *= l;
- newZY *= l;
- newZZ *= l;
- } else {
- let x1 = newXX;
- let y1 = newXY;
- let z1 = newXZ;
- let x2 = x1 * x1;
- let y2 = y1 * y1;
- let z2 = z1 * z1;
- let d;
- if(x2 < y2) {
- if(x2 < z2) {
- d = 1 / Math.sqrt(y2 + z2);
- newZX = 0;
- newZY = z1 * d;
- newZZ = -y1 * d;
- } else {
- d = 1 / Math.sqrt(x2 + y2);
- newZX = y1 * d;
- newZY = -x1 * d;
- newZZ = 0;
- }
- } else if(y2 < z2) {
- d = 1 / Math.sqrt(z2 + x2);
- newZX = -z1 * d;
- newZY = 0;
- newZZ = x1 * d;
- } else {
- d = 1 / Math.sqrt(x2 + y2);
- newZX = y1 * d;
- newZY = -x1 * d;
- newZZ = 0;
- }
- }
- newYX = newZY * newXZ - newZZ * newXY;
- newYY = newZZ * newXX - newZX * newXZ;
- newYZ = newZX * newXY - newZY * newXX;
- _this.xX = newXX;
- _this.xY = newXY;
- _this.xZ = newXZ;
- _this.yX = newYX;
- _this.yY = newYY;
- _this.yZ = newYZ;
- _this.zX = newZX;
- _this.zY = newZY;
- _this.zZ = newZZ;
- let angErrorX;
- let angErrorY;
- let angErrorZ;
- angErrorX = this._basisX1Y * this._basisX2Z - this._basisX1Z * this._basisX2Y;
- angErrorY = this._basisX1Z * this._basisX2X - this._basisX1X * this._basisX2Z;
- angErrorZ = this._basisX1X * this._basisX2Y - this._basisX1Y * this._basisX2X;
- let cos = this._basisX1X * this._basisX2X + this._basisX1Y * this._basisX2Y + this._basisX1Z * this._basisX2Z;
- let theta = cos <= -1 ? 3.14159265358979 : cos >= 1 ? 0 : Math.acos(cos);
- let l = angErrorX * angErrorX + angErrorY * angErrorY + angErrorZ * angErrorZ;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- angErrorX *= l;
- angErrorY *= l;
- angErrorZ *= l;
- angErrorX *= theta;
- angErrorY *= theta;
- angErrorZ *= theta;
- this.angularErrorY = angErrorX * this._basis.yX + angErrorY * this._basis.yY + angErrorZ * this._basis.yZ;
- this.angularErrorZ = angErrorX * this._basis.zX + angErrorY * this._basis.zY + angErrorZ * this._basis.zZ;
- let perpCrossX;
- let perpCrossY;
- let perpCrossZ;
- perpCrossX = this._basisY1Y * this._basisY2Z - this._basisY1Z * this._basisY2Y;
- perpCrossY = this._basisY1Z * this._basisY2X - this._basisY1X * this._basisY2Z;
- perpCrossZ = this._basisY1X * this._basisY2Y - this._basisY1Y * this._basisY2X;
- cos = this._basisY1X * this._basisY2X + this._basisY1Y * this._basisY2Y + this._basisY1Z * this._basisY2Z;
- this.angle = cos <= -1 ? 3.14159265358979 : cos >= 1 ? 0 : Math.acos(cos);
- if(perpCrossX * this._basis.xX + perpCrossY * this._basis.xY + perpCrossZ * this._basis.xZ < 0) {
- this.angle = -this.angle;
- }
- let anchorDiffX;
- let anchorDiffY;
- let anchorDiffZ;
- anchorDiffX = this._anchor2X - this._anchor1X;
- anchorDiffY = this._anchor2Y - this._anchor1Y;
- anchorDiffZ = this._anchor2Z - this._anchor1Z;
- this.translation = anchorDiffX * this._basis.xX + anchorDiffY * this._basis.xY + anchorDiffZ * this._basis.xZ;
- this.linearErrorY = anchorDiffX * this._basis.yX + anchorDiffY * this._basis.yY + anchorDiffZ * this._basis.yZ;
- this.linearErrorZ = anchorDiffX * this._basis.zX + anchorDiffY * this._basis.zY + anchorDiffZ * this._basis.zZ;
- }
- _getVelocitySolverInfo(timeStep,info) {
- super._getVelocitySolverInfo(timeStep,info);
- this.getInfo(info,timeStep,false);
- }
- _getPositionSolverInfo(info) {
- super._getPositionSolverInfo(info);
- this.getInfo(info,null,true);
- }
- getAxis1() {
- let v = new oimo.common.Vec3();
- v.x = this._basisX1X;
- v.y = this._basisX1Y;
- v.z = this._basisX1Z;
- return v;
- }
- getAxis2() {
- let v = new oimo.common.Vec3();
- v.x = this._basisX2X;
- v.y = this._basisX2Y;
- v.z = this._basisX2Z;
- return v;
- }
- getAxis1To(axis) {
- axis.x = this._basisX1X;
- axis.y = this._basisX1Y;
- axis.z = this._basisX1Z;
- }
- getAxis2To(axis) {
- axis.x = this._basisX2X;
- axis.y = this._basisX2Y;
- axis.z = this._basisX2Z;
- }
- getLocalAxis1() {
- let v = new oimo.common.Vec3();
- v.x = this._localBasisX1X;
- v.y = this._localBasisX1Y;
- v.z = this._localBasisX1Z;
- return v;
- }
- getLocalAxis2() {
- let v = new oimo.common.Vec3();
- v.x = this._localBasisX2X;
- v.y = this._localBasisX2Y;
- v.z = this._localBasisX2Z;
- return v;
- }
- getLocalAxis1To(axis) {
- axis.x = this._localBasisX1X;
- axis.y = this._localBasisX1Y;
- axis.z = this._localBasisX1Z;
- }
- getLocalAxis2To(axis) {
- axis.x = this._localBasisX2X;
- axis.y = this._localBasisX2Y;
- axis.z = this._localBasisX2Z;
- }
- getTranslationalSpringDamper() {
- return this._translSd;
- }
- getRotationalSpringDamper() {
- return this._rotSd;
- }
- getTranslationalLimitMotor() {
- return this._translLm;
- }
- getRotationalLimitMotor() {
- return this._rotLm;
- }
- getAngle() {
- return this.angle;
- }
- getTranslation() {
- return this.translation;
- }
- }
- oimo.dynamics.constraint.joint.JointConfig = class oimo_dynamics_constraint_joint_JointConfig {
- constructor() {
- this.rigidBody1 = null;
- this.rigidBody2 = null;
- this.localAnchor1 = new oimo.common.Vec3();
- this.localAnchor2 = new oimo.common.Vec3();
- this.allowCollision = false;
- this.solverType = oimo.common.Setting.defaultJointConstraintSolverType;
- this.positionCorrectionAlgorithm = oimo.common.Setting.defaultJointPositionCorrectionAlgorithm;
- this.breakForce = 0;
- this.breakTorque = 0;
- }
- _init(rb1,rb2,worldAnchor) {
- this.rigidBody1 = rb1;
- this.rigidBody2 = rb2;
- let _this = this.rigidBody1;
- let localPoint = this.localAnchor1;
- let vX;
- let vY;
- let vZ;
- vX = worldAnchor.x;
- vY = worldAnchor.y;
- vZ = worldAnchor.z;
- vX -= _this._transform._positionX;
- vY -= _this._transform._positionY;
- vZ -= _this._transform._positionZ;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = _this._transform._rotation00 * vX + _this._transform._rotation10 * vY + _this._transform._rotation20 * vZ;
- __tmp__Y = _this._transform._rotation01 * vX + _this._transform._rotation11 * vY + _this._transform._rotation21 * vZ;
- __tmp__Z = _this._transform._rotation02 * vX + _this._transform._rotation12 * vY + _this._transform._rotation22 * vZ;
- vX = __tmp__X;
- vY = __tmp__Y;
- vZ = __tmp__Z;
- localPoint.x = vX;
- localPoint.y = vY;
- localPoint.z = vZ;
- let _this1 = this.rigidBody2;
- let localPoint1 = this.localAnchor2;
- let vX1;
- let vY1;
- let vZ1;
- vX1 = worldAnchor.x;
- vY1 = worldAnchor.y;
- vZ1 = worldAnchor.z;
- vX1 -= _this1._transform._positionX;
- vY1 -= _this1._transform._positionY;
- vZ1 -= _this1._transform._positionZ;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = _this1._transform._rotation00 * vX1 + _this1._transform._rotation10 * vY1 + _this1._transform._rotation20 * vZ1;
- __tmp__Y1 = _this1._transform._rotation01 * vX1 + _this1._transform._rotation11 * vY1 + _this1._transform._rotation21 * vZ1;
- __tmp__Z1 = _this1._transform._rotation02 * vX1 + _this1._transform._rotation12 * vY1 + _this1._transform._rotation22 * vZ1;
- vX1 = __tmp__X1;
- vY1 = __tmp__Y1;
- vZ1 = __tmp__Z1;
- localPoint1.x = vX1;
- localPoint1.y = vY1;
- localPoint1.z = vZ1;
- }
- }
- oimo.dynamics.constraint.joint.CylindricalJointConfig = class oimo_dynamics_constraint_joint_CylindricalJointConfig extends oimo.dynamics.constraint.joint.JointConfig {
- constructor() {
- super();
- this.localAxis1 = new oimo.common.Vec3(1,0,0);
- this.localAxis2 = new oimo.common.Vec3(1,0,0);
- this.translationalLimitMotor = new oimo.dynamics.constraint.joint.TranslationalLimitMotor();
- this.translationalSpringDamper = new oimo.dynamics.constraint.joint.SpringDamper();
- this.rotationalLimitMotor = new oimo.dynamics.constraint.joint.RotationalLimitMotor();
- this.rotationalSpringDamper = new oimo.dynamics.constraint.joint.SpringDamper();
- }
- init(rigidBody1,rigidBody2,worldAnchor,worldAxis) {
- this._init(rigidBody1,rigidBody2,worldAnchor);
- let localVector = this.localAxis1;
- let vX;
- let vY;
- let vZ;
- vX = worldAxis.x;
- vY = worldAxis.y;
- vZ = worldAxis.z;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = rigidBody1._transform._rotation00 * vX + rigidBody1._transform._rotation10 * vY + rigidBody1._transform._rotation20 * vZ;
- __tmp__Y = rigidBody1._transform._rotation01 * vX + rigidBody1._transform._rotation11 * vY + rigidBody1._transform._rotation21 * vZ;
- __tmp__Z = rigidBody1._transform._rotation02 * vX + rigidBody1._transform._rotation12 * vY + rigidBody1._transform._rotation22 * vZ;
- vX = __tmp__X;
- vY = __tmp__Y;
- vZ = __tmp__Z;
- localVector.x = vX;
- localVector.y = vY;
- localVector.z = vZ;
- let localVector1 = this.localAxis2;
- let vX1;
- let vY1;
- let vZ1;
- vX1 = worldAxis.x;
- vY1 = worldAxis.y;
- vZ1 = worldAxis.z;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = rigidBody2._transform._rotation00 * vX1 + rigidBody2._transform._rotation10 * vY1 + rigidBody2._transform._rotation20 * vZ1;
- __tmp__Y1 = rigidBody2._transform._rotation01 * vX1 + rigidBody2._transform._rotation11 * vY1 + rigidBody2._transform._rotation21 * vZ1;
- __tmp__Z1 = rigidBody2._transform._rotation02 * vX1 + rigidBody2._transform._rotation12 * vY1 + rigidBody2._transform._rotation22 * vZ1;
- vX1 = __tmp__X1;
- vY1 = __tmp__Y1;
- vZ1 = __tmp__Z1;
- localVector1.x = vX1;
- localVector1.y = vY1;
- localVector1.z = vZ1;
- return this;
- }
- }
- oimo.dynamics.constraint.joint.GenericJoint = class oimo_dynamics_constraint_joint_GenericJoint extends oimo.dynamics.constraint.joint.Joint {
- constructor(config) {
- super(config,oimo.dynamics.constraint.joint.JointType.GENERIC);
- let tmp;
- let _this = config.localBasis1;
- if(!(_this.e00 * (_this.e11 * _this.e22 - _this.e12 * _this.e21) - _this.e01 * (_this.e10 * _this.e22 - _this.e12 * _this.e20) + _this.e02 * (_this.e10 * _this.e21 - _this.e11 * _this.e20) < 0)) {
- let _this = config.localBasis2;
- tmp = _this.e00 * (_this.e11 * _this.e22 - _this.e12 * _this.e21) - _this.e01 * (_this.e10 * _this.e22 - _this.e12 * _this.e20) + _this.e02 * (_this.e10 * _this.e21 - _this.e11 * _this.e20) < 0;
- } else {
- tmp = true;
- }
- if(tmp) {
- console.log("src/oimo/dynamics/constraint/joint/GenericJoint.hx:50:","[warning] joint basis must be right handed");
- }
- let lb100;
- let lb101;
- let lb102;
- let lb110;
- let lb111;
- let lb112;
- let lb120;
- let lb121;
- let lb122;
- let lb200;
- let lb201;
- let lb202;
- let lb210;
- let lb211;
- let lb212;
- let lb220;
- let lb221;
- let lb222;
- let m = config.localBasis1;
- lb100 = m.e00;
- lb101 = m.e01;
- lb102 = m.e02;
- lb110 = m.e10;
- lb111 = m.e11;
- lb112 = m.e12;
- lb120 = m.e20;
- lb121 = m.e21;
- lb122 = m.e22;
- let m1 = config.localBasis2;
- lb200 = m1.e00;
- lb201 = m1.e01;
- lb202 = m1.e02;
- lb210 = m1.e10;
- lb211 = m1.e11;
- lb212 = m1.e12;
- lb220 = m1.e20;
- lb221 = m1.e21;
- lb222 = m1.e22;
- this._localBasisX1X = lb100;
- this._localBasisX1Y = lb110;
- this._localBasisX1Z = lb120;
- this._localBasisY1X = lb101;
- this._localBasisY1Y = lb111;
- this._localBasisY1Z = lb121;
- this._localBasisZ1X = lb102;
- this._localBasisZ1Y = lb112;
- this._localBasisZ1Z = lb122;
- this._localBasisX2X = lb200;
- this._localBasisX2Y = lb210;
- this._localBasisX2Z = lb220;
- this._localBasisY2X = lb201;
- this._localBasisY2Y = lb211;
- this._localBasisY2Z = lb221;
- this._localBasisZ2X = lb202;
- this._localBasisZ2Y = lb212;
- this._localBasisZ2Z = lb222;
- this._angleX = 0;
- this._angleY = 0;
- this._angleZ = 0;
- this.translationX = 0;
- this.translationY = 0;
- this.translationZ = 0;
- this.xSingular = false;
- this.ySingular = false;
- this.zSingular = false;
- this._translLms = new Array(3);
- this._translSds = new Array(3);
- this._rotLms = new Array(3);
- this._rotSds = new Array(3);
- this._translLms[0] = config.translationalLimitMotors[0].clone();
- this._translLms[1] = config.translationalLimitMotors[1].clone();
- this._translLms[2] = config.translationalLimitMotors[2].clone();
- this._translSds[0] = config.translationalSpringDampers[0].clone();
- this._translSds[1] = config.translationalSpringDampers[1].clone();
- this._translSds[2] = config.translationalSpringDampers[2].clone();
- this._rotLms[0] = config.rotationalLimitMotors[0].clone();
- this._rotLms[1] = config.rotationalLimitMotors[1].clone();
- this._rotLms[2] = config.rotationalLimitMotors[2].clone();
- this._rotSds[0] = config.rotationalSpringDampers[0].clone();
- this._rotSds[1] = config.rotationalSpringDampers[1].clone();
- this._rotSds[2] = config.rotationalSpringDampers[2].clone();
- }
- getInfo(info,timeStep,isPositionPart) {
- let j;
- let translMotorMass = 1 / (this._b1._invMass + this._b2._invMass);
- let motorMassX = this.computeEffectiveInertiaMoment(this._axisXX,this._axisXY,this._axisXZ);
- let motorMassY = this.computeEffectiveInertiaMoment(this._axisYX,this._axisYY,this._axisYZ);
- let motorMassZ = this.computeEffectiveInertiaMoment(this._axisZX,this._axisZY,this._axisZZ);
- if(this._translSds[0].frequency <= 0 || !isPositionPart) {
- let impulse = this._impulses[0];
- let row = info.rows[info.numRows++];
- let _this = row.jacobian;
- _this.lin1X = 0;
- _this.lin1Y = 0;
- _this.lin1Z = 0;
- _this.lin2X = 0;
- _this.lin2Y = 0;
- _this.lin2Z = 0;
- _this.ang1X = 0;
- _this.ang1Y = 0;
- _this.ang1Z = 0;
- _this.ang2X = 0;
- _this.ang2Y = 0;
- _this.ang2Z = 0;
- row.rhs = 0;
- row.cfm = 0;
- row.minImpulse = 0;
- row.maxImpulse = 0;
- row.motorSpeed = 0;
- row.motorMaxImpulse = 0;
- row.impulse = null;
- row.impulse = impulse;
- this.setSolverInfoRowLinear(row,this.translationX,this._translLms[0],translMotorMass,this._translSds[0],timeStep,isPositionPart);
- j = row.jacobian;
- j.lin1X = this._basisX1X;
- j.lin1Y = this._basisX1Y;
- j.lin1Z = this._basisX1Z;
- j.lin2X = this._basisX1X;
- j.lin2Y = this._basisX1Y;
- j.lin2Z = this._basisX1Z;
- j.ang1X = this._relativeAnchor1Y * this._basisX1Z - this._relativeAnchor1Z * this._basisX1Y;
- j.ang1Y = this._relativeAnchor1Z * this._basisX1X - this._relativeAnchor1X * this._basisX1Z;
- j.ang1Z = this._relativeAnchor1X * this._basisX1Y - this._relativeAnchor1Y * this._basisX1X;
- j.ang2X = this._relativeAnchor2Y * this._basisX1Z - this._relativeAnchor2Z * this._basisX1Y;
- j.ang2Y = this._relativeAnchor2Z * this._basisX1X - this._relativeAnchor2X * this._basisX1Z;
- j.ang2Z = this._relativeAnchor2X * this._basisX1Y - this._relativeAnchor2Y * this._basisX1X;
- }
- if(this._translSds[1].frequency <= 0 || !isPositionPart) {
- let impulse = this._impulses[1];
- let row = info.rows[info.numRows++];
- let _this = row.jacobian;
- _this.lin1X = 0;
- _this.lin1Y = 0;
- _this.lin1Z = 0;
- _this.lin2X = 0;
- _this.lin2Y = 0;
- _this.lin2Z = 0;
- _this.ang1X = 0;
- _this.ang1Y = 0;
- _this.ang1Z = 0;
- _this.ang2X = 0;
- _this.ang2Y = 0;
- _this.ang2Z = 0;
- row.rhs = 0;
- row.cfm = 0;
- row.minImpulse = 0;
- row.maxImpulse = 0;
- row.motorSpeed = 0;
- row.motorMaxImpulse = 0;
- row.impulse = null;
- row.impulse = impulse;
- this.setSolverInfoRowLinear(row,this.translationY,this._translLms[1],translMotorMass,this._translSds[1],timeStep,isPositionPart);
- j = row.jacobian;
- j.lin1X = this._basisY1X;
- j.lin1Y = this._basisY1Y;
- j.lin1Z = this._basisY1Z;
- j.lin2X = this._basisY1X;
- j.lin2Y = this._basisY1Y;
- j.lin2Z = this._basisY1Z;
- j.ang1X = this._relativeAnchor1Y * this._basisY1Z - this._relativeAnchor1Z * this._basisY1Y;
- j.ang1Y = this._relativeAnchor1Z * this._basisY1X - this._relativeAnchor1X * this._basisY1Z;
- j.ang1Z = this._relativeAnchor1X * this._basisY1Y - this._relativeAnchor1Y * this._basisY1X;
- j.ang2X = this._relativeAnchor2Y * this._basisY1Z - this._relativeAnchor2Z * this._basisY1Y;
- j.ang2Y = this._relativeAnchor2Z * this._basisY1X - this._relativeAnchor2X * this._basisY1Z;
- j.ang2Z = this._relativeAnchor2X * this._basisY1Y - this._relativeAnchor2Y * this._basisY1X;
- }
- if(this._translSds[2].frequency <= 0 || !isPositionPart) {
- let impulse = this._impulses[2];
- let row = info.rows[info.numRows++];
- let _this = row.jacobian;
- _this.lin1X = 0;
- _this.lin1Y = 0;
- _this.lin1Z = 0;
- _this.lin2X = 0;
- _this.lin2Y = 0;
- _this.lin2Z = 0;
- _this.ang1X = 0;
- _this.ang1Y = 0;
- _this.ang1Z = 0;
- _this.ang2X = 0;
- _this.ang2Y = 0;
- _this.ang2Z = 0;
- row.rhs = 0;
- row.cfm = 0;
- row.minImpulse = 0;
- row.maxImpulse = 0;
- row.motorSpeed = 0;
- row.motorMaxImpulse = 0;
- row.impulse = null;
- row.impulse = impulse;
- this.setSolverInfoRowLinear(row,this.translationZ,this._translLms[2],translMotorMass,this._translSds[2],timeStep,isPositionPart);
- j = row.jacobian;
- j.lin1X = this._basisZ1X;
- j.lin1Y = this._basisZ1Y;
- j.lin1Z = this._basisZ1Z;
- j.lin2X = this._basisZ1X;
- j.lin2Y = this._basisZ1Y;
- j.lin2Z = this._basisZ1Z;
- j.ang1X = this._relativeAnchor1Y * this._basisZ1Z - this._relativeAnchor1Z * this._basisZ1Y;
- j.ang1Y = this._relativeAnchor1Z * this._basisZ1X - this._relativeAnchor1X * this._basisZ1Z;
- j.ang1Z = this._relativeAnchor1X * this._basisZ1Y - this._relativeAnchor1Y * this._basisZ1X;
- j.ang2X = this._relativeAnchor2Y * this._basisZ1Z - this._relativeAnchor2Z * this._basisZ1Y;
- j.ang2Y = this._relativeAnchor2Z * this._basisZ1X - this._relativeAnchor2X * this._basisZ1Z;
- j.ang2Z = this._relativeAnchor2X * this._basisZ1Y - this._relativeAnchor2Y * this._basisZ1X;
- }
- if(!this.xSingular && (this._rotSds[0].frequency <= 0 || !isPositionPart)) {
- let impulse = this._impulses[3];
- let row = info.rows[info.numRows++];
- let _this = row.jacobian;
- _this.lin1X = 0;
- _this.lin1Y = 0;
- _this.lin1Z = 0;
- _this.lin2X = 0;
- _this.lin2Y = 0;
- _this.lin2Z = 0;
- _this.ang1X = 0;
- _this.ang1Y = 0;
- _this.ang1Z = 0;
- _this.ang2X = 0;
- _this.ang2Y = 0;
- _this.ang2Z = 0;
- row.rhs = 0;
- row.cfm = 0;
- row.minImpulse = 0;
- row.maxImpulse = 0;
- row.motorSpeed = 0;
- row.motorMaxImpulse = 0;
- row.impulse = null;
- row.impulse = impulse;
- this.setSolverInfoRowAngular(row,this._angleX,this._rotLms[0],motorMassX,this._rotSds[0],timeStep,isPositionPart);
- j = row.jacobian;
- j.ang1X = this._axisXX;
- j.ang1Y = this._axisXY;
- j.ang1Z = this._axisXZ;
- j.ang2X = this._axisXX;
- j.ang2Y = this._axisXY;
- j.ang2Z = this._axisXZ;
- }
- if(!this.ySingular && (this._rotSds[1].frequency <= 0 || !isPositionPart)) {
- let impulse = this._impulses[4];
- let row = info.rows[info.numRows++];
- let _this = row.jacobian;
- _this.lin1X = 0;
- _this.lin1Y = 0;
- _this.lin1Z = 0;
- _this.lin2X = 0;
- _this.lin2Y = 0;
- _this.lin2Z = 0;
- _this.ang1X = 0;
- _this.ang1Y = 0;
- _this.ang1Z = 0;
- _this.ang2X = 0;
- _this.ang2Y = 0;
- _this.ang2Z = 0;
- row.rhs = 0;
- row.cfm = 0;
- row.minImpulse = 0;
- row.maxImpulse = 0;
- row.motorSpeed = 0;
- row.motorMaxImpulse = 0;
- row.impulse = null;
- row.impulse = impulse;
- this.setSolverInfoRowAngular(row,this._angleY,this._rotLms[1],motorMassY,this._rotSds[1],timeStep,isPositionPart);
- j = row.jacobian;
- j.ang1X = this._axisYX;
- j.ang1Y = this._axisYY;
- j.ang1Z = this._axisYZ;
- j.ang2X = this._axisYX;
- j.ang2Y = this._axisYY;
- j.ang2Z = this._axisYZ;
- }
- if(!this.zSingular && (this._rotSds[2].frequency <= 0 || !isPositionPart)) {
- let impulse = this._impulses[5];
- let row = info.rows[info.numRows++];
- let _this = row.jacobian;
- _this.lin1X = 0;
- _this.lin1Y = 0;
- _this.lin1Z = 0;
- _this.lin2X = 0;
- _this.lin2Y = 0;
- _this.lin2Z = 0;
- _this.ang1X = 0;
- _this.ang1Y = 0;
- _this.ang1Z = 0;
- _this.ang2X = 0;
- _this.ang2Y = 0;
- _this.ang2Z = 0;
- row.rhs = 0;
- row.cfm = 0;
- row.minImpulse = 0;
- row.maxImpulse = 0;
- row.motorSpeed = 0;
- row.motorMaxImpulse = 0;
- row.impulse = null;
- row.impulse = impulse;
- this.setSolverInfoRowAngular(row,this._angleZ,this._rotLms[2],motorMassZ,this._rotSds[2],timeStep,isPositionPart);
- j = row.jacobian;
- j.ang1X = this._axisZX;
- j.ang1Y = this._axisZY;
- j.ang1Z = this._axisZZ;
- j.ang2X = this._axisZX;
- j.ang2Y = this._axisZY;
- j.ang2Z = this._axisZZ;
- }
- }
- _syncAnchors() {
- super._syncAnchors();
- let angleAxisXX;
- let angleAxisXY;
- let angleAxisXZ;
- let angleAxisYX;
- let angleAxisYY;
- let angleAxisYZ;
- let angleAxisZX;
- let angleAxisZY;
- let angleAxisZZ;
- angleAxisXX = this._basisX1X;
- angleAxisXY = this._basisX1Y;
- angleAxisXZ = this._basisX1Z;
- angleAxisZX = this._basisZ2X;
- angleAxisZY = this._basisZ2Y;
- angleAxisZZ = this._basisZ2Z;
- angleAxisYX = angleAxisZY * angleAxisXZ - angleAxisZZ * angleAxisXY;
- angleAxisYY = angleAxisZZ * angleAxisXX - angleAxisZX * angleAxisXZ;
- angleAxisYZ = angleAxisZX * angleAxisXY - angleAxisZY * angleAxisXX;
- this._axisXX = angleAxisYY * angleAxisZZ - angleAxisYZ * angleAxisZY;
- this._axisXY = angleAxisYZ * angleAxisZX - angleAxisYX * angleAxisZZ;
- this._axisXZ = angleAxisYX * angleAxisZY - angleAxisYY * angleAxisZX;
- this._axisYX = angleAxisYX;
- this._axisYY = angleAxisYY;
- this._axisYZ = angleAxisYZ;
- this._axisZX = angleAxisXY * angleAxisYZ - angleAxisXZ * angleAxisYY;
- this._axisZY = angleAxisXZ * angleAxisYX - angleAxisXX * angleAxisYZ;
- this._axisZZ = angleAxisXX * angleAxisYY - angleAxisXY * angleAxisYX;
- let l = this._axisXX * this._axisXX + this._axisXY * this._axisXY + this._axisXZ * this._axisXZ;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- this._axisXX *= l;
- this._axisXY *= l;
- this._axisXZ *= l;
- let l1 = this._axisYX * this._axisYX + this._axisYY * this._axisYY + this._axisYZ * this._axisYZ;
- if(l1 > 0) {
- l1 = 1 / Math.sqrt(l1);
- }
- this._axisYX *= l1;
- this._axisYY *= l1;
- this._axisYZ *= l1;
- let l2 = this._axisZX * this._axisZX + this._axisZY * this._axisZY + this._axisZZ * this._axisZZ;
- if(l2 > 0) {
- l2 = 1 / Math.sqrt(l2);
- }
- this._axisZX *= l2;
- this._axisZY *= l2;
- this._axisZZ *= l2;
- this.xSingular = this._axisXX * this._axisXX + this._axisXY * this._axisXY + this._axisXZ * this._axisXZ == 0;
- this.ySingular = this._axisYX * this._axisYX + this._axisYY * this._axisYY + this._axisYZ * this._axisYZ == 0;
- this.zSingular = this._axisZX * this._axisZX + this._axisZY * this._axisZY + this._axisZZ * this._axisZZ == 0;
- let rot100;
- let rot101;
- let rot102;
- let rot110;
- let rot111;
- let rot112;
- let rot120;
- let rot121;
- let rot122;
- let rot200;
- let rot201;
- let rot202;
- let rot210;
- let rot211;
- let rot212;
- let rot220;
- let rot221;
- let rot222;
- rot100 = this._basisX1X;
- rot101 = this._basisY1X;
- rot102 = this._basisZ1X;
- rot110 = this._basisX1Y;
- rot111 = this._basisY1Y;
- rot112 = this._basisZ1Y;
- rot120 = this._basisX1Z;
- rot121 = this._basisY1Z;
- rot122 = this._basisZ1Z;
- rot200 = this._basisX2X;
- rot201 = this._basisY2X;
- rot202 = this._basisZ2X;
- rot210 = this._basisX2Y;
- rot211 = this._basisY2Y;
- rot212 = this._basisZ2Y;
- rot220 = this._basisX2Z;
- rot221 = this._basisY2Z;
- rot222 = this._basisZ2Z;
- let relRot00;
- let relRot01;
- let relRot02;
- let relRot11;
- let relRot12;
- let relRot21;
- let relRot22;
- let __tmp__00;
- let __tmp__01;
- let __tmp__02;
- let __tmp__11;
- let __tmp__12;
- let __tmp__21;
- let __tmp__22;
- __tmp__00 = rot100 * rot200 + rot110 * rot210 + rot120 * rot220;
- __tmp__01 = rot100 * rot201 + rot110 * rot211 + rot120 * rot221;
- __tmp__02 = rot100 * rot202 + rot110 * rot212 + rot120 * rot222;
- __tmp__11 = rot101 * rot201 + rot111 * rot211 + rot121 * rot221;
- __tmp__12 = rot101 * rot202 + rot111 * rot212 + rot121 * rot222;
- __tmp__21 = rot102 * rot201 + rot112 * rot211 + rot122 * rot221;
- __tmp__22 = rot102 * rot202 + rot112 * rot212 + rot122 * rot222;
- relRot00 = __tmp__00;
- relRot01 = __tmp__01;
- relRot02 = __tmp__02;
- relRot11 = __tmp__11;
- relRot12 = __tmp__12;
- relRot21 = __tmp__21;
- relRot22 = __tmp__22;
- let anglesX;
- let anglesY;
- let anglesZ;
- let sy = relRot02;
- if(sy <= -1) {
- let xSubZ = Math.atan2(relRot21,relRot11);
- anglesX = xSubZ * 0.5;
- anglesY = -1.570796326794895;
- anglesZ = -xSubZ * 0.5;
- } else if(sy >= 1) {
- let xAddZ = Math.atan2(relRot21,relRot11);
- anglesX = xAddZ * 0.5;
- anglesY = 1.570796326794895;
- anglesZ = xAddZ * 0.5;
- } else {
- anglesX = Math.atan2(-relRot12,relRot22);
- anglesY = Math.asin(sy);
- anglesZ = Math.atan2(-relRot01,relRot00);
- }
- this._angleX = anglesX;
- this._angleY = anglesY;
- this._angleZ = anglesZ;
- let anchorDiffX;
- let anchorDiffY;
- let anchorDiffZ;
- anchorDiffX = this._anchor2X - this._anchor1X;
- anchorDiffY = this._anchor2Y - this._anchor1Y;
- anchorDiffZ = this._anchor2Z - this._anchor1Z;
- this.translationX = anchorDiffX * this._basisX1X + anchorDiffY * this._basisX1Y + anchorDiffZ * this._basisX1Z;
- this.translationY = anchorDiffX * this._basisY1X + anchorDiffY * this._basisY1Y + anchorDiffZ * this._basisY1Z;
- this.translationZ = anchorDiffX * this._basisZ1X + anchorDiffY * this._basisZ1Y + anchorDiffZ * this._basisZ1Z;
- }
- _getVelocitySolverInfo(timeStep,info) {
- super._getVelocitySolverInfo(timeStep,info);
- this.getInfo(info,timeStep,false);
- }
- _getPositionSolverInfo(info) {
- super._getPositionSolverInfo(info);
- this.getInfo(info,null,true);
- }
- getAxisX() {
- let v = new oimo.common.Vec3();
- v.x = this._basisX1X;
- v.y = this._basisX1Y;
- v.z = this._basisX1Z;
- return v;
- }
- getAxisY() {
- let v = new oimo.common.Vec3();
- v.x = this._axisYX;
- v.y = this._axisYY;
- v.z = this._axisYZ;
- return v;
- }
- getAxisZ() {
- let v = new oimo.common.Vec3();
- v.x = this._basisZ2X;
- v.y = this._basisZ2Y;
- v.z = this._basisZ2Z;
- return v;
- }
- getTranslationalSpringDampers() {
- return this._translSds.slice(0);
- }
- getRotationalSpringDampers() {
- return this._translSds.slice(0);
- }
- getTranslationalLimitMotors() {
- return this._translLms.slice(0);
- }
- getRotationalLimitMotors() {
- return this._rotLms.slice(0);
- }
- getAngles() {
- return new oimo.common.Vec3(this._angleX,this._angleY,this._angleZ);
- }
- getTranslations() {
- return new oimo.common.Vec3(this.translationX,this.translationY,this.translationZ);
- }
- }
- oimo.dynamics.constraint.joint.GenericJointConfig = class oimo_dynamics_constraint_joint_GenericJointConfig extends oimo.dynamics.constraint.joint.JointConfig {
- constructor() {
- super();
- this.localBasis1 = new oimo.common.Mat3();
- this.localBasis2 = new oimo.common.Mat3();
- let _g = [];
- _g.push(new oimo.dynamics.constraint.joint.TranslationalLimitMotor().setLimits(0,0));
- _g.push(new oimo.dynamics.constraint.joint.TranslationalLimitMotor().setLimits(0,0));
- _g.push(new oimo.dynamics.constraint.joint.TranslationalLimitMotor().setLimits(0,0));
- this.translationalLimitMotors = _g;
- let _g1 = [];
- _g1.push(new oimo.dynamics.constraint.joint.RotationalLimitMotor().setLimits(0,0));
- _g1.push(new oimo.dynamics.constraint.joint.RotationalLimitMotor().setLimits(0,0));
- _g1.push(new oimo.dynamics.constraint.joint.RotationalLimitMotor().setLimits(0,0));
- this.rotationalLimitMotors = _g1;
- this.translationalSpringDampers = [new oimo.dynamics.constraint.joint.SpringDamper(),new oimo.dynamics.constraint.joint.SpringDamper(),new oimo.dynamics.constraint.joint.SpringDamper()];
- this.rotationalSpringDampers = [new oimo.dynamics.constraint.joint.SpringDamper(),new oimo.dynamics.constraint.joint.SpringDamper(),new oimo.dynamics.constraint.joint.SpringDamper()];
- }
- init(rigidBody1,rigidBody2,worldAnchor,worldBasis1,worldBasis2) {
- this._init(rigidBody1,rigidBody2,worldAnchor);
- let tf1 = rigidBody1._transform;
- let tf2 = rigidBody2._transform;
- let wb100;
- let wb101;
- let wb102;
- let wb110;
- let wb111;
- let wb112;
- let wb120;
- let wb121;
- let wb122;
- let wb200;
- let wb201;
- let wb202;
- let wb210;
- let wb211;
- let wb212;
- let wb220;
- let wb221;
- let wb222;
- let lb100;
- let lb101;
- let lb102;
- let lb110;
- let lb111;
- let lb112;
- let lb120;
- let lb121;
- let lb122;
- let lb200;
- let lb201;
- let lb202;
- let lb210;
- let lb211;
- let lb212;
- let lb220;
- let lb221;
- let lb222;
- wb100 = worldBasis1.e00;
- wb101 = worldBasis1.e01;
- wb102 = worldBasis1.e02;
- wb110 = worldBasis1.e10;
- wb111 = worldBasis1.e11;
- wb112 = worldBasis1.e12;
- wb120 = worldBasis1.e20;
- wb121 = worldBasis1.e21;
- wb122 = worldBasis1.e22;
- wb200 = worldBasis2.e00;
- wb201 = worldBasis2.e01;
- wb202 = worldBasis2.e02;
- wb210 = worldBasis2.e10;
- wb211 = worldBasis2.e11;
- wb212 = worldBasis2.e12;
- wb220 = worldBasis2.e20;
- wb221 = worldBasis2.e21;
- wb222 = worldBasis2.e22;
- let __tmp__00;
- let __tmp__01;
- let __tmp__02;
- let __tmp__10;
- let __tmp__11;
- let __tmp__12;
- let __tmp__20;
- let __tmp__21;
- let __tmp__22;
- __tmp__00 = tf1._rotation00 * wb100 + tf1._rotation10 * wb110 + tf1._rotation20 * wb120;
- __tmp__01 = tf1._rotation00 * wb101 + tf1._rotation10 * wb111 + tf1._rotation20 * wb121;
- __tmp__02 = tf1._rotation00 * wb102 + tf1._rotation10 * wb112 + tf1._rotation20 * wb122;
- __tmp__10 = tf1._rotation01 * wb100 + tf1._rotation11 * wb110 + tf1._rotation21 * wb120;
- __tmp__11 = tf1._rotation01 * wb101 + tf1._rotation11 * wb111 + tf1._rotation21 * wb121;
- __tmp__12 = tf1._rotation01 * wb102 + tf1._rotation11 * wb112 + tf1._rotation21 * wb122;
- __tmp__20 = tf1._rotation02 * wb100 + tf1._rotation12 * wb110 + tf1._rotation22 * wb120;
- __tmp__21 = tf1._rotation02 * wb101 + tf1._rotation12 * wb111 + tf1._rotation22 * wb121;
- __tmp__22 = tf1._rotation02 * wb102 + tf1._rotation12 * wb112 + tf1._rotation22 * wb122;
- lb100 = __tmp__00;
- lb101 = __tmp__01;
- lb102 = __tmp__02;
- lb110 = __tmp__10;
- lb111 = __tmp__11;
- lb112 = __tmp__12;
- lb120 = __tmp__20;
- lb121 = __tmp__21;
- lb122 = __tmp__22;
- let __tmp__001;
- let __tmp__011;
- let __tmp__021;
- let __tmp__101;
- let __tmp__111;
- let __tmp__121;
- let __tmp__201;
- let __tmp__211;
- let __tmp__221;
- __tmp__001 = tf2._rotation00 * wb200 + tf2._rotation10 * wb210 + tf2._rotation20 * wb220;
- __tmp__011 = tf2._rotation00 * wb201 + tf2._rotation10 * wb211 + tf2._rotation20 * wb221;
- __tmp__021 = tf2._rotation00 * wb202 + tf2._rotation10 * wb212 + tf2._rotation20 * wb222;
- __tmp__101 = tf2._rotation01 * wb200 + tf2._rotation11 * wb210 + tf2._rotation21 * wb220;
- __tmp__111 = tf2._rotation01 * wb201 + tf2._rotation11 * wb211 + tf2._rotation21 * wb221;
- __tmp__121 = tf2._rotation01 * wb202 + tf2._rotation11 * wb212 + tf2._rotation21 * wb222;
- __tmp__201 = tf2._rotation02 * wb200 + tf2._rotation12 * wb210 + tf2._rotation22 * wb220;
- __tmp__211 = tf2._rotation02 * wb201 + tf2._rotation12 * wb211 + tf2._rotation22 * wb221;
- __tmp__221 = tf2._rotation02 * wb202 + tf2._rotation12 * wb212 + tf2._rotation22 * wb222;
- lb200 = __tmp__001;
- lb201 = __tmp__011;
- lb202 = __tmp__021;
- lb210 = __tmp__101;
- lb211 = __tmp__111;
- lb212 = __tmp__121;
- lb220 = __tmp__201;
- lb221 = __tmp__211;
- lb222 = __tmp__221;
- let m = this.localBasis1;
- m.e00 = lb100;
- m.e01 = lb101;
- m.e02 = lb102;
- m.e10 = lb110;
- m.e11 = lb111;
- m.e12 = lb112;
- m.e20 = lb120;
- m.e21 = lb121;
- m.e22 = lb122;
- let m1 = this.localBasis2;
- m1.e00 = lb200;
- m1.e01 = lb201;
- m1.e02 = lb202;
- m1.e10 = lb210;
- m1.e11 = lb211;
- m1.e12 = lb212;
- m1.e20 = lb220;
- m1.e21 = lb221;
- m1.e22 = lb222;
- return this;
- }
- }
- oimo.dynamics.constraint.joint.JointImpulse = class oimo_dynamics_constraint_joint_JointImpulse {
- constructor() {
- this.impulse = 0;
- this.impulseM = 0;
- this.impulseP = 0;
- }
- }
- oimo.dynamics.constraint.joint.JointLink = class oimo_dynamics_constraint_joint_JointLink {
- constructor(joint) {
- this._joint = joint;
- }
- getContact() {
- return this._joint;
- }
- getOther() {
- return this._other;
- }
- getPrev() {
- return this._prev;
- }
- getNext() {
- return this._next;
- }
- }
- oimo.dynamics.constraint.joint.JointMacro = class oimo_dynamics_constraint_joint_JointMacro {
- }
- oimo.dynamics.constraint.joint.JointType = class oimo_dynamics_constraint_joint_JointType {
- }
- oimo.dynamics.constraint.joint.PrismaticJoint = class oimo_dynamics_constraint_joint_PrismaticJoint extends oimo.dynamics.constraint.joint.Joint {
- constructor(config) {
- super(config,oimo.dynamics.constraint.joint.JointType.PRISMATIC);
- let v = config.localAxis1;
- this._localBasisX1X = v.x;
- this._localBasisX1Y = v.y;
- this._localBasisX1Z = v.z;
- let v1 = config.localAxis2;
- this._localBasisX2X = v1.x;
- this._localBasisX2Y = v1.y;
- this._localBasisX2Z = v1.z;
- this.buildLocalBasesFromX();
- this._basis = new oimo.dynamics.constraint.joint.BasisTracker(this);
- this.translation = 0;
- this.linearErrorY = 0;
- this.linearErrorZ = 0;
- this.angularErrorX = 0;
- this.angularErrorY = 0;
- this.angularErrorZ = 0;
- this._sd = config.springDamper.clone();
- this._lm = config.limitMotor.clone();
- }
- getInfo(info,timeStep,isPositionPart) {
- let erp = this.getErp(timeStep,isPositionPart);
- let linRhsY = this.linearErrorY * erp;
- let linRhsZ = this.linearErrorZ * erp;
- let angRhsX = this.angularErrorX * erp;
- let angRhsY = this.angularErrorY * erp;
- let angRhsZ = this.angularErrorZ * erp;
- let j;
- if(this._sd.frequency <= 0 || !isPositionPart) {
- let impulse = this._impulses[0];
- let row = info.rows[info.numRows++];
- let _this = row.jacobian;
- _this.lin1X = 0;
- _this.lin1Y = 0;
- _this.lin1Z = 0;
- _this.lin2X = 0;
- _this.lin2Y = 0;
- _this.lin2Z = 0;
- _this.ang1X = 0;
- _this.ang1Y = 0;
- _this.ang1Z = 0;
- _this.ang2X = 0;
- _this.ang2Y = 0;
- _this.ang2Z = 0;
- row.rhs = 0;
- row.cfm = 0;
- row.minImpulse = 0;
- row.maxImpulse = 0;
- row.motorSpeed = 0;
- row.motorMaxImpulse = 0;
- row.impulse = null;
- row.impulse = impulse;
- this.setSolverInfoRowLinear(row,this.translation,this._lm,1 / (this._b1._invMass + this._b2._invMass),this._sd,timeStep,isPositionPart);
- j = row.jacobian;
- j.lin1X = this._basis.xX;
- j.lin1Y = this._basis.xY;
- j.lin1Z = this._basis.xZ;
- j.lin2X = this._basis.xX;
- j.lin2Y = this._basis.xY;
- j.lin2Z = this._basis.xZ;
- j.ang1X = this._relativeAnchor1Y * this._basis.xZ - this._relativeAnchor1Z * this._basis.xY;
- j.ang1Y = this._relativeAnchor1Z * this._basis.xX - this._relativeAnchor1X * this._basis.xZ;
- j.ang1Z = this._relativeAnchor1X * this._basis.xY - this._relativeAnchor1Y * this._basis.xX;
- j.ang2X = this._relativeAnchor2Y * this._basis.xZ - this._relativeAnchor2Z * this._basis.xY;
- j.ang2Y = this._relativeAnchor2Z * this._basis.xX - this._relativeAnchor2X * this._basis.xZ;
- j.ang2Z = this._relativeAnchor2X * this._basis.xY - this._relativeAnchor2Y * this._basis.xX;
- }
- let impulse = this._impulses[1];
- let row = info.rows[info.numRows++];
- let _this = row.jacobian;
- _this.lin1X = 0;
- _this.lin1Y = 0;
- _this.lin1Z = 0;
- _this.lin2X = 0;
- _this.lin2Y = 0;
- _this.lin2Z = 0;
- _this.ang1X = 0;
- _this.ang1Y = 0;
- _this.ang1Z = 0;
- _this.ang2X = 0;
- _this.ang2Y = 0;
- _this.ang2Z = 0;
- row.rhs = 0;
- row.cfm = 0;
- row.minImpulse = 0;
- row.maxImpulse = 0;
- row.motorSpeed = 0;
- row.motorMaxImpulse = 0;
- row.impulse = null;
- row.impulse = impulse;
- row.rhs = linRhsY;
- row.cfm = 0;
- row.minImpulse = -1e65536;
- row.maxImpulse = 1e65536;
- j = row.jacobian;
- j.lin1X = this._basis.yX;
- j.lin1Y = this._basis.yY;
- j.lin1Z = this._basis.yZ;
- j.lin2X = this._basis.yX;
- j.lin2Y = this._basis.yY;
- j.lin2Z = this._basis.yZ;
- j.ang1X = this._relativeAnchor1Y * this._basis.yZ - this._relativeAnchor1Z * this._basis.yY;
- j.ang1Y = this._relativeAnchor1Z * this._basis.yX - this._relativeAnchor1X * this._basis.yZ;
- j.ang1Z = this._relativeAnchor1X * this._basis.yY - this._relativeAnchor1Y * this._basis.yX;
- j.ang2X = this._relativeAnchor2Y * this._basis.yZ - this._relativeAnchor2Z * this._basis.yY;
- j.ang2Y = this._relativeAnchor2Z * this._basis.yX - this._relativeAnchor2X * this._basis.yZ;
- j.ang2Z = this._relativeAnchor2X * this._basis.yY - this._relativeAnchor2Y * this._basis.yX;
- let impulse1 = this._impulses[2];
- let row1 = info.rows[info.numRows++];
- let _this1 = row1.jacobian;
- _this1.lin1X = 0;
- _this1.lin1Y = 0;
- _this1.lin1Z = 0;
- _this1.lin2X = 0;
- _this1.lin2Y = 0;
- _this1.lin2Z = 0;
- _this1.ang1X = 0;
- _this1.ang1Y = 0;
- _this1.ang1Z = 0;
- _this1.ang2X = 0;
- _this1.ang2Y = 0;
- _this1.ang2Z = 0;
- row1.rhs = 0;
- row1.cfm = 0;
- row1.minImpulse = 0;
- row1.maxImpulse = 0;
- row1.motorSpeed = 0;
- row1.motorMaxImpulse = 0;
- row1.impulse = null;
- row1.impulse = impulse1;
- row1.rhs = linRhsZ;
- row1.cfm = 0;
- row1.minImpulse = -1e65536;
- row1.maxImpulse = 1e65536;
- j = row1.jacobian;
- j.lin1X = this._basis.zX;
- j.lin1Y = this._basis.zY;
- j.lin1Z = this._basis.zZ;
- j.lin2X = this._basis.zX;
- j.lin2Y = this._basis.zY;
- j.lin2Z = this._basis.zZ;
- j.ang1X = this._relativeAnchor1Y * this._basis.zZ - this._relativeAnchor1Z * this._basis.zY;
- j.ang1Y = this._relativeAnchor1Z * this._basis.zX - this._relativeAnchor1X * this._basis.zZ;
- j.ang1Z = this._relativeAnchor1X * this._basis.zY - this._relativeAnchor1Y * this._basis.zX;
- j.ang2X = this._relativeAnchor2Y * this._basis.zZ - this._relativeAnchor2Z * this._basis.zY;
- j.ang2Y = this._relativeAnchor2Z * this._basis.zX - this._relativeAnchor2X * this._basis.zZ;
- j.ang2Z = this._relativeAnchor2X * this._basis.zY - this._relativeAnchor2Y * this._basis.zX;
- let impulse2 = this._impulses[3];
- let row2 = info.rows[info.numRows++];
- let _this2 = row2.jacobian;
- _this2.lin1X = 0;
- _this2.lin1Y = 0;
- _this2.lin1Z = 0;
- _this2.lin2X = 0;
- _this2.lin2Y = 0;
- _this2.lin2Z = 0;
- _this2.ang1X = 0;
- _this2.ang1Y = 0;
- _this2.ang1Z = 0;
- _this2.ang2X = 0;
- _this2.ang2Y = 0;
- _this2.ang2Z = 0;
- row2.rhs = 0;
- row2.cfm = 0;
- row2.minImpulse = 0;
- row2.maxImpulse = 0;
- row2.motorSpeed = 0;
- row2.motorMaxImpulse = 0;
- row2.impulse = null;
- row2.impulse = impulse2;
- row2.rhs = angRhsX;
- row2.cfm = 0;
- row2.minImpulse = -1e65536;
- row2.maxImpulse = 1e65536;
- j = row2.jacobian;
- j.ang1X = 1;
- j.ang1Y = 0;
- j.ang1Z = 0;
- j.ang2X = 1;
- j.ang2Y = 0;
- j.ang2Z = 0;
- let impulse3 = this._impulses[4];
- let row3 = info.rows[info.numRows++];
- let _this3 = row3.jacobian;
- _this3.lin1X = 0;
- _this3.lin1Y = 0;
- _this3.lin1Z = 0;
- _this3.lin2X = 0;
- _this3.lin2Y = 0;
- _this3.lin2Z = 0;
- _this3.ang1X = 0;
- _this3.ang1Y = 0;
- _this3.ang1Z = 0;
- _this3.ang2X = 0;
- _this3.ang2Y = 0;
- _this3.ang2Z = 0;
- row3.rhs = 0;
- row3.cfm = 0;
- row3.minImpulse = 0;
- row3.maxImpulse = 0;
- row3.motorSpeed = 0;
- row3.motorMaxImpulse = 0;
- row3.impulse = null;
- row3.impulse = impulse3;
- row3.rhs = angRhsY;
- row3.cfm = 0;
- row3.minImpulse = -1e65536;
- row3.maxImpulse = 1e65536;
- j = row3.jacobian;
- j.ang1X = 0;
- j.ang1Y = 1;
- j.ang1Z = 0;
- j.ang2X = 0;
- j.ang2Y = 1;
- j.ang2Z = 0;
- let impulse4 = this._impulses[5];
- let row4 = info.rows[info.numRows++];
- let _this4 = row4.jacobian;
- _this4.lin1X = 0;
- _this4.lin1Y = 0;
- _this4.lin1Z = 0;
- _this4.lin2X = 0;
- _this4.lin2Y = 0;
- _this4.lin2Z = 0;
- _this4.ang1X = 0;
- _this4.ang1Y = 0;
- _this4.ang1Z = 0;
- _this4.ang2X = 0;
- _this4.ang2Y = 0;
- _this4.ang2Z = 0;
- row4.rhs = 0;
- row4.cfm = 0;
- row4.minImpulse = 0;
- row4.maxImpulse = 0;
- row4.motorSpeed = 0;
- row4.motorMaxImpulse = 0;
- row4.impulse = null;
- row4.impulse = impulse4;
- row4.rhs = angRhsZ;
- row4.cfm = 0;
- row4.minImpulse = -1e65536;
- row4.maxImpulse = 1e65536;
- j = row4.jacobian;
- j.ang1X = 0;
- j.ang1Y = 0;
- j.ang1Z = 1;
- j.ang2X = 0;
- j.ang2Y = 0;
- j.ang2Z = 1;
- }
- _syncAnchors() {
- super._syncAnchors();
- let _this = this._basis;
- let invM1 = _this.joint._b1._invMass;
- let invM2 = _this.joint._b2._invMass;
- let qX;
- let qY;
- let qZ;
- let qW;
- let idQX;
- let idQY;
- let idQZ;
- let idQW;
- let slerpQX;
- let slerpQY;
- let slerpQZ;
- let slerpQW;
- let slerpM00;
- let slerpM01;
- let slerpM02;
- let slerpM10;
- let slerpM11;
- let slerpM12;
- let slerpM20;
- let slerpM21;
- let slerpM22;
- let newXX;
- let newXY;
- let newXZ;
- let newYX;
- let newYY;
- let newYZ;
- let newZX;
- let newZY;
- let newZZ;
- let prevXX;
- let prevXY;
- let prevXZ;
- let prevYX;
- let prevYY;
- let prevYZ;
- let d = _this.joint._basisX1X * _this.joint._basisX2X + _this.joint._basisX1Y * _this.joint._basisX2Y + _this.joint._basisX1Z * _this.joint._basisX2Z;
- if(d < -0.999999999) {
- let vX;
- let vY;
- let vZ;
- let x1 = _this.joint._basisX1X;
- let y1 = _this.joint._basisX1Y;
- let z1 = _this.joint._basisX1Z;
- let x2 = x1 * x1;
- let y2 = y1 * y1;
- let z2 = z1 * z1;
- let d;
- if(x2 < y2) {
- if(x2 < z2) {
- d = 1 / Math.sqrt(y2 + z2);
- vX = 0;
- vY = z1 * d;
- vZ = -y1 * d;
- } else {
- d = 1 / Math.sqrt(x2 + y2);
- vX = y1 * d;
- vY = -x1 * d;
- vZ = 0;
- }
- } else if(y2 < z2) {
- d = 1 / Math.sqrt(z2 + x2);
- vX = -z1 * d;
- vY = 0;
- vZ = x1 * d;
- } else {
- d = 1 / Math.sqrt(x2 + y2);
- vX = y1 * d;
- vY = -x1 * d;
- vZ = 0;
- }
- qX = vX;
- qY = vY;
- qZ = vZ;
- qW = 0;
- } else {
- let cX;
- let cY;
- let cZ;
- cX = _this.joint._basisX1Y * _this.joint._basisX2Z - _this.joint._basisX1Z * _this.joint._basisX2Y;
- cY = _this.joint._basisX1Z * _this.joint._basisX2X - _this.joint._basisX1X * _this.joint._basisX2Z;
- cZ = _this.joint._basisX1X * _this.joint._basisX2Y - _this.joint._basisX1Y * _this.joint._basisX2X;
- let w = Math.sqrt((1 + d) * 0.5);
- d = 0.5 / w;
- cX *= d;
- cY *= d;
- cZ *= d;
- qX = cX;
- qY = cY;
- qZ = cZ;
- qW = w;
- }
- idQX = 0;
- idQY = 0;
- idQZ = 0;
- idQW = 1;
- let q1X;
- let q1Y;
- let q1Z;
- let q1W;
- let q2X;
- let q2Y;
- let q2Z;
- let q2W;
- q1X = idQX;
- q1Y = idQY;
- q1Z = idQZ;
- q1W = idQW;
- q2X = qX;
- q2Y = qY;
- q2Z = qZ;
- q2W = qW;
- let d1 = q1X * q2X + q1Y * q2Y + q1Z * q2Z + q1W * q2W;
- if(d1 < 0) {
- d1 = -d1;
- q2X = -q2X;
- q2Y = -q2Y;
- q2Z = -q2Z;
- q2W = -q2W;
- }
- if(d1 > 0.999999) {
- let dqX;
- let dqY;
- let dqZ;
- let dqW;
- dqX = q2X - q1X;
- dqY = q2Y - q1Y;
- dqZ = q2Z - q1Z;
- dqW = q2W - q1W;
- q2X = q1X + dqX * (invM1 / (invM1 + invM2));
- q2Y = q1Y + dqY * (invM1 / (invM1 + invM2));
- q2Z = q1Z + dqZ * (invM1 / (invM1 + invM2));
- q2W = q1W + dqW * (invM1 / (invM1 + invM2));
- let l = q2X * q2X + q2Y * q2Y + q2Z * q2Z + q2W * q2W;
- if(l > 1e-32) {
- l = 1 / Math.sqrt(l);
- }
- slerpQX = q2X * l;
- slerpQY = q2Y * l;
- slerpQZ = q2Z * l;
- slerpQW = q2W * l;
- } else {
- let theta = invM1 / (invM1 + invM2) * Math.acos(d1);
- q2X += q1X * -d1;
- q2Y += q1Y * -d1;
- q2Z += q1Z * -d1;
- q2W += q1W * -d1;
- let l = q2X * q2X + q2Y * q2Y + q2Z * q2Z + q2W * q2W;
- if(l > 1e-32) {
- l = 1 / Math.sqrt(l);
- }
- q2X *= l;
- q2Y *= l;
- q2Z *= l;
- q2W *= l;
- let sin = Math.sin(theta);
- let cos = Math.cos(theta);
- q1X *= cos;
- q1Y *= cos;
- q1Z *= cos;
- q1W *= cos;
- slerpQX = q1X + q2X * sin;
- slerpQY = q1Y + q2Y * sin;
- slerpQZ = q1Z + q2Z * sin;
- slerpQW = q1W + q2W * sin;
- }
- let x = slerpQX;
- let y = slerpQY;
- let z = slerpQZ;
- let w = slerpQW;
- let x2 = 2 * x;
- let y2 = 2 * y;
- let z2 = 2 * z;
- let xx = x * x2;
- let yy = y * y2;
- let zz = z * z2;
- let xy = x * y2;
- let yz = y * z2;
- let xz = x * z2;
- let wx = w * x2;
- let wy = w * y2;
- let wz = w * z2;
- slerpM00 = 1 - yy - zz;
- slerpM01 = xy - wz;
- slerpM02 = xz + wy;
- slerpM10 = xy + wz;
- slerpM11 = 1 - xx - zz;
- slerpM12 = yz - wx;
- slerpM20 = xz - wy;
- slerpM21 = yz + wx;
- slerpM22 = 1 - xx - yy;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = slerpM00 * _this.joint._basisX1X + slerpM01 * _this.joint._basisX1Y + slerpM02 * _this.joint._basisX1Z;
- __tmp__Y = slerpM10 * _this.joint._basisX1X + slerpM11 * _this.joint._basisX1Y + slerpM12 * _this.joint._basisX1Z;
- __tmp__Z = slerpM20 * _this.joint._basisX1X + slerpM21 * _this.joint._basisX1Y + slerpM22 * _this.joint._basisX1Z;
- newXX = __tmp__X;
- newXY = __tmp__Y;
- newXZ = __tmp__Z;
- prevXX = _this.xX;
- prevXY = _this.xY;
- prevXZ = _this.xZ;
- prevYX = _this.yX;
- prevYY = _this.yY;
- prevYZ = _this.yZ;
- let d2 = prevXX * newXX + prevXY * newXY + prevXZ * newXZ;
- if(d2 < -0.999999999) {
- let vX;
- let vY;
- let vZ;
- let x1 = prevXX;
- let y1 = prevXY;
- let z1 = prevXZ;
- let x2 = x1 * x1;
- let y2 = y1 * y1;
- let z2 = z1 * z1;
- let d;
- if(x2 < y2) {
- if(x2 < z2) {
- d = 1 / Math.sqrt(y2 + z2);
- vX = 0;
- vY = z1 * d;
- vZ = -y1 * d;
- } else {
- d = 1 / Math.sqrt(x2 + y2);
- vX = y1 * d;
- vY = -x1 * d;
- vZ = 0;
- }
- } else if(y2 < z2) {
- d = 1 / Math.sqrt(z2 + x2);
- vX = -z1 * d;
- vY = 0;
- vZ = x1 * d;
- } else {
- d = 1 / Math.sqrt(x2 + y2);
- vX = y1 * d;
- vY = -x1 * d;
- vZ = 0;
- }
- slerpQX = vX;
- slerpQY = vY;
- slerpQZ = vZ;
- slerpQW = 0;
- } else {
- let cX;
- let cY;
- let cZ;
- cX = prevXY * newXZ - prevXZ * newXY;
- cY = prevXZ * newXX - prevXX * newXZ;
- cZ = prevXX * newXY - prevXY * newXX;
- let w = Math.sqrt((1 + d2) * 0.5);
- d2 = 0.5 / w;
- cX *= d2;
- cY *= d2;
- cZ *= d2;
- slerpQX = cX;
- slerpQY = cY;
- slerpQZ = cZ;
- slerpQW = w;
- }
- let x1 = slerpQX;
- let y1 = slerpQY;
- let z1 = slerpQZ;
- let w1 = slerpQW;
- let x21 = 2 * x1;
- let y21 = 2 * y1;
- let z21 = 2 * z1;
- let xx1 = x1 * x21;
- let yy1 = y1 * y21;
- let zz1 = z1 * z21;
- let xy1 = x1 * y21;
- let yz1 = y1 * z21;
- let xz1 = x1 * z21;
- let wx1 = w1 * x21;
- let wy1 = w1 * y21;
- let wz1 = w1 * z21;
- slerpM00 = 1 - yy1 - zz1;
- slerpM01 = xy1 - wz1;
- slerpM02 = xz1 + wy1;
- slerpM10 = xy1 + wz1;
- slerpM11 = 1 - xx1 - zz1;
- slerpM12 = yz1 - wx1;
- slerpM20 = xz1 - wy1;
- slerpM21 = yz1 + wx1;
- slerpM22 = 1 - xx1 - yy1;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = slerpM00 * prevYX + slerpM01 * prevYY + slerpM02 * prevYZ;
- __tmp__Y1 = slerpM10 * prevYX + slerpM11 * prevYY + slerpM12 * prevYZ;
- __tmp__Z1 = slerpM20 * prevYX + slerpM21 * prevYY + slerpM22 * prevYZ;
- newYX = __tmp__X1;
- newYY = __tmp__Y1;
- newYZ = __tmp__Z1;
- newZX = newXY * newYZ - newXZ * newYY;
- newZY = newXZ * newYX - newXX * newYZ;
- newZZ = newXX * newYY - newXY * newYX;
- if(newZX * newZX + newZY * newZY + newZZ * newZZ > 1e-6) {
- let l = newZX * newZX + newZY * newZY + newZZ * newZZ;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- newZX *= l;
- newZY *= l;
- newZZ *= l;
- } else {
- let x1 = newXX;
- let y1 = newXY;
- let z1 = newXZ;
- let x2 = x1 * x1;
- let y2 = y1 * y1;
- let z2 = z1 * z1;
- let d;
- if(x2 < y2) {
- if(x2 < z2) {
- d = 1 / Math.sqrt(y2 + z2);
- newZX = 0;
- newZY = z1 * d;
- newZZ = -y1 * d;
- } else {
- d = 1 / Math.sqrt(x2 + y2);
- newZX = y1 * d;
- newZY = -x1 * d;
- newZZ = 0;
- }
- } else if(y2 < z2) {
- d = 1 / Math.sqrt(z2 + x2);
- newZX = -z1 * d;
- newZY = 0;
- newZZ = x1 * d;
- } else {
- d = 1 / Math.sqrt(x2 + y2);
- newZX = y1 * d;
- newZY = -x1 * d;
- newZZ = 0;
- }
- }
- newYX = newZY * newXZ - newZZ * newXY;
- newYY = newZZ * newXX - newZX * newXZ;
- newYZ = newZX * newXY - newZY * newXX;
- _this.xX = newXX;
- _this.xY = newXY;
- _this.xZ = newXZ;
- _this.yX = newYX;
- _this.yY = newYY;
- _this.yZ = newYZ;
- _this.zX = newZX;
- _this.zY = newZY;
- _this.zZ = newZZ;
- let rot100;
- let rot101;
- let rot102;
- let rot110;
- let rot111;
- let rot112;
- let rot120;
- let rot121;
- let rot122;
- let rot200;
- let rot201;
- let rot202;
- let rot210;
- let rot211;
- let rot212;
- let rot220;
- let rot221;
- let rot222;
- rot100 = this._basisX1X;
- rot101 = this._basisY1X;
- rot102 = this._basisZ1X;
- rot110 = this._basisX1Y;
- rot111 = this._basisY1Y;
- rot112 = this._basisZ1Y;
- rot120 = this._basisX1Z;
- rot121 = this._basisY1Z;
- rot122 = this._basisZ1Z;
- rot200 = this._basisX2X;
- rot201 = this._basisY2X;
- rot202 = this._basisZ2X;
- rot210 = this._basisX2Y;
- rot211 = this._basisY2Y;
- rot212 = this._basisZ2Y;
- rot220 = this._basisX2Z;
- rot221 = this._basisY2Z;
- rot222 = this._basisZ2Z;
- let relRot00;
- let relRot01;
- let relRot02;
- let relRot10;
- let relRot11;
- let relRot12;
- let relRot20;
- let relRot21;
- let relRot22;
- let __tmp__00;
- let __tmp__01;
- let __tmp__02;
- let __tmp__10;
- let __tmp__11;
- let __tmp__12;
- let __tmp__20;
- let __tmp__21;
- let __tmp__22;
- __tmp__00 = rot200 * rot100 + rot201 * rot101 + rot202 * rot102;
- __tmp__01 = rot200 * rot110 + rot201 * rot111 + rot202 * rot112;
- __tmp__02 = rot200 * rot120 + rot201 * rot121 + rot202 * rot122;
- __tmp__10 = rot210 * rot100 + rot211 * rot101 + rot212 * rot102;
- __tmp__11 = rot210 * rot110 + rot211 * rot111 + rot212 * rot112;
- __tmp__12 = rot210 * rot120 + rot211 * rot121 + rot212 * rot122;
- __tmp__20 = rot220 * rot100 + rot221 * rot101 + rot222 * rot102;
- __tmp__21 = rot220 * rot110 + rot221 * rot111 + rot222 * rot112;
- __tmp__22 = rot220 * rot120 + rot221 * rot121 + rot222 * rot122;
- relRot00 = __tmp__00;
- relRot01 = __tmp__01;
- relRot02 = __tmp__02;
- relRot10 = __tmp__10;
- relRot11 = __tmp__11;
- relRot12 = __tmp__12;
- relRot20 = __tmp__20;
- relRot21 = __tmp__21;
- relRot22 = __tmp__22;
- let relQX;
- let relQY;
- let relQZ;
- let relQW;
- let e00 = relRot00;
- let e11 = relRot11;
- let e22 = relRot22;
- let t = e00 + e11 + e22;
- let s;
- if(t > 0) {
- s = Math.sqrt(t + 1);
- relQW = 0.5 * s;
- s = 0.5 / s;
- relQX = (relRot21 - relRot12) * s;
- relQY = (relRot02 - relRot20) * s;
- relQZ = (relRot10 - relRot01) * s;
- } else if(e00 > e11) {
- if(e00 > e22) {
- s = Math.sqrt(e00 - e11 - e22 + 1);
- relQX = 0.5 * s;
- s = 0.5 / s;
- relQY = (relRot01 + relRot10) * s;
- relQZ = (relRot02 + relRot20) * s;
- relQW = (relRot21 - relRot12) * s;
- } else {
- s = Math.sqrt(e22 - e00 - e11 + 1);
- relQZ = 0.5 * s;
- s = 0.5 / s;
- relQX = (relRot02 + relRot20) * s;
- relQY = (relRot12 + relRot21) * s;
- relQW = (relRot10 - relRot01) * s;
- }
- } else if(e11 > e22) {
- s = Math.sqrt(e11 - e22 - e00 + 1);
- relQY = 0.5 * s;
- s = 0.5 / s;
- relQX = (relRot01 + relRot10) * s;
- relQZ = (relRot12 + relRot21) * s;
- relQW = (relRot02 - relRot20) * s;
- } else {
- s = Math.sqrt(e22 - e00 - e11 + 1);
- relQZ = 0.5 * s;
- s = 0.5 / s;
- relQX = (relRot02 + relRot20) * s;
- relQY = (relRot12 + relRot21) * s;
- relQW = (relRot10 - relRot01) * s;
- }
- let cosHalfTheta = relQW;
- let theta = (cosHalfTheta <= -1 ? 3.14159265358979 : cosHalfTheta >= 1 ? 0 : Math.acos(cosHalfTheta)) * 2;
- this.angularErrorX = relQX;
- this.angularErrorY = relQY;
- this.angularErrorZ = relQZ;
- let l = this.angularErrorX * this.angularErrorX + this.angularErrorY * this.angularErrorY + this.angularErrorZ * this.angularErrorZ;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- this.angularErrorX *= l;
- this.angularErrorY *= l;
- this.angularErrorZ *= l;
- this.angularErrorX *= theta;
- this.angularErrorY *= theta;
- this.angularErrorZ *= theta;
- let anchorDiffX;
- let anchorDiffY;
- let anchorDiffZ;
- anchorDiffX = this._anchor2X - this._anchor1X;
- anchorDiffY = this._anchor2Y - this._anchor1Y;
- anchorDiffZ = this._anchor2Z - this._anchor1Z;
- this.translation = anchorDiffX * this._basis.xX + anchorDiffY * this._basis.xY + anchorDiffZ * this._basis.xZ;
- this.linearErrorY = anchorDiffX * this._basis.yX + anchorDiffY * this._basis.yY + anchorDiffZ * this._basis.yZ;
- this.linearErrorZ = anchorDiffX * this._basis.zX + anchorDiffY * this._basis.zY + anchorDiffZ * this._basis.zZ;
- }
- _getVelocitySolverInfo(timeStep,info) {
- super._getVelocitySolverInfo(timeStep,info);
- this.getInfo(info,timeStep,false);
- }
- _getPositionSolverInfo(info) {
- super._getPositionSolverInfo(info);
- this.getInfo(info,null,true);
- }
- getAxis1() {
- let v = new oimo.common.Vec3();
- v.x = this._basisX1X;
- v.y = this._basisX1Y;
- v.z = this._basisX1Z;
- return v;
- }
- getAxis2() {
- let v = new oimo.common.Vec3();
- v.x = this._basisX2X;
- v.y = this._basisX2Y;
- v.z = this._basisX2Z;
- return v;
- }
- getAxis1To(axis) {
- axis.x = this._basisX1X;
- axis.y = this._basisX1Y;
- axis.z = this._basisX1Z;
- }
- getAxis2To(axis) {
- axis.x = this._basisX2X;
- axis.y = this._basisX2Y;
- axis.z = this._basisX2Z;
- }
- getLocalAxis1() {
- let v = new oimo.common.Vec3();
- v.x = this._localBasisX1X;
- v.y = this._localBasisX1Y;
- v.z = this._localBasisX1Z;
- return v;
- }
- getLocalAxis2() {
- let v = new oimo.common.Vec3();
- v.x = this._localBasisX2X;
- v.y = this._localBasisX2Y;
- v.z = this._localBasisX2Z;
- return v;
- }
- getLocalAxis1To(axis) {
- axis.x = this._localBasisX1X;
- axis.y = this._localBasisX1Y;
- axis.z = this._localBasisX1Z;
- }
- getLocalAxis2To(axis) {
- axis.x = this._localBasisX2X;
- axis.y = this._localBasisX2Y;
- axis.z = this._localBasisX2Z;
- }
- getSpringDamper() {
- return this._sd;
- }
- getLimitMotor() {
- return this._lm;
- }
- getTranslation() {
- return this.translation;
- }
- }
- oimo.dynamics.constraint.joint.PrismaticJointConfig = class oimo_dynamics_constraint_joint_PrismaticJointConfig extends oimo.dynamics.constraint.joint.JointConfig {
- constructor() {
- super();
- this.localAxis1 = new oimo.common.Vec3(1,0,0);
- this.localAxis2 = new oimo.common.Vec3(1,0,0);
- this.limitMotor = new oimo.dynamics.constraint.joint.TranslationalLimitMotor();
- this.springDamper = new oimo.dynamics.constraint.joint.SpringDamper();
- }
- init(rigidBody1,rigidBody2,worldAnchor,worldAxis) {
- this._init(rigidBody1,rigidBody2,worldAnchor);
- let localVector = this.localAxis1;
- let vX;
- let vY;
- let vZ;
- vX = worldAxis.x;
- vY = worldAxis.y;
- vZ = worldAxis.z;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = rigidBody1._transform._rotation00 * vX + rigidBody1._transform._rotation10 * vY + rigidBody1._transform._rotation20 * vZ;
- __tmp__Y = rigidBody1._transform._rotation01 * vX + rigidBody1._transform._rotation11 * vY + rigidBody1._transform._rotation21 * vZ;
- __tmp__Z = rigidBody1._transform._rotation02 * vX + rigidBody1._transform._rotation12 * vY + rigidBody1._transform._rotation22 * vZ;
- vX = __tmp__X;
- vY = __tmp__Y;
- vZ = __tmp__Z;
- localVector.x = vX;
- localVector.y = vY;
- localVector.z = vZ;
- let localVector1 = this.localAxis2;
- let vX1;
- let vY1;
- let vZ1;
- vX1 = worldAxis.x;
- vY1 = worldAxis.y;
- vZ1 = worldAxis.z;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = rigidBody2._transform._rotation00 * vX1 + rigidBody2._transform._rotation10 * vY1 + rigidBody2._transform._rotation20 * vZ1;
- __tmp__Y1 = rigidBody2._transform._rotation01 * vX1 + rigidBody2._transform._rotation11 * vY1 + rigidBody2._transform._rotation21 * vZ1;
- __tmp__Z1 = rigidBody2._transform._rotation02 * vX1 + rigidBody2._transform._rotation12 * vY1 + rigidBody2._transform._rotation22 * vZ1;
- vX1 = __tmp__X1;
- vY1 = __tmp__Y1;
- vZ1 = __tmp__Z1;
- localVector1.x = vX1;
- localVector1.y = vY1;
- localVector1.z = vZ1;
- return this;
- }
- }
- oimo.dynamics.constraint.joint.RagdollJoint = class oimo_dynamics_constraint_joint_RagdollJoint extends oimo.dynamics.constraint.joint.Joint {
- constructor(config) {
- super(config,oimo.dynamics.constraint.joint.JointType.RAGDOLL);
- let v = config.localTwistAxis1;
- this._localBasisX1X = v.x;
- this._localBasisX1Y = v.y;
- this._localBasisX1Z = v.z;
- let v1 = config.localSwingAxis1;
- this._localBasisY1X = v1.x;
- this._localBasisY1Y = v1.y;
- this._localBasisY1Z = v1.z;
- let v2 = config.localTwistAxis2;
- this._localBasisX2X = v2.x;
- this._localBasisX2Y = v2.y;
- this._localBasisX2Z = v2.z;
- this.buildLocalBasesFromXY1X2();
- this._twistSd = config.twistSpringDamper.clone();
- this._twistLm = config.twistLimitMotor.clone();
- this._swingSd = config.swingSpringDamper.clone();
- this._maxSwingAngle1 = config.maxSwingAngle1;
- this._maxSwingAngle2 = config.maxSwingAngle2;
- if(this._maxSwingAngle1 < oimo.common.Setting.minRagdollMaxSwingAngle) {
- this._maxSwingAngle1 = oimo.common.Setting.minRagdollMaxSwingAngle;
- }
- if(this._maxSwingAngle2 < oimo.common.Setting.minRagdollMaxSwingAngle) {
- this._maxSwingAngle2 = oimo.common.Setting.minRagdollMaxSwingAngle;
- }
- this.dummySwingLm = new oimo.dynamics.constraint.joint.RotationalLimitMotor();
- this.dummySwingLm.lowerLimit = -1;
- this.dummySwingLm.upperLimit = 0;
- this._swingAngle = 0;
- this._twistAngle = 0;
- this.swingError = 0;
- this.swingAxisX = 0;
- this.swingAxisY = 0;
- this.swingAxisZ = 0;
- this.twistAxisX = 0;
- this.twistAxisY = 0;
- this.twistAxisZ = 0;
- }
- getInfo(info,timeStep,isPositionPart) {
- let erp = this.getErp(timeStep,isPositionPart);
- let linearRhsX;
- let linearRhsY;
- let linearRhsZ;
- linearRhsX = this.linearErrorX * erp;
- linearRhsY = this.linearErrorY * erp;
- linearRhsZ = this.linearErrorZ * erp;
- let crossR100;
- let crossR101;
- let crossR102;
- let crossR110;
- let crossR111;
- let crossR112;
- let crossR120;
- let crossR121;
- let crossR122;
- let crossR200;
- let crossR201;
- let crossR202;
- let crossR210;
- let crossR211;
- let crossR212;
- let crossR220;
- let crossR221;
- let crossR222;
- crossR100 = 0;
- crossR101 = -this._relativeAnchor1Z;
- crossR102 = this._relativeAnchor1Y;
- crossR110 = this._relativeAnchor1Z;
- crossR111 = 0;
- crossR112 = -this._relativeAnchor1X;
- crossR120 = -this._relativeAnchor1Y;
- crossR121 = this._relativeAnchor1X;
- crossR122 = 0;
- crossR200 = 0;
- crossR201 = -this._relativeAnchor2Z;
- crossR202 = this._relativeAnchor2Y;
- crossR210 = this._relativeAnchor2Z;
- crossR211 = 0;
- crossR212 = -this._relativeAnchor2X;
- crossR220 = -this._relativeAnchor2Y;
- crossR221 = this._relativeAnchor2X;
- crossR222 = 0;
- crossR100 = -crossR100;
- crossR101 = -crossR101;
- crossR102 = -crossR102;
- crossR110 = -crossR110;
- crossR111 = -crossR111;
- crossR112 = -crossR112;
- crossR120 = -crossR120;
- crossR121 = -crossR121;
- crossR122 = -crossR122;
- crossR200 = -crossR200;
- crossR201 = -crossR201;
- crossR202 = -crossR202;
- crossR210 = -crossR210;
- crossR211 = -crossR211;
- crossR212 = -crossR212;
- crossR220 = -crossR220;
- crossR221 = -crossR221;
- crossR222 = -crossR222;
- let swingMass = this.computeEffectiveInertiaMoment(this.swingAxisX,this.swingAxisY,this.swingAxisZ);
- let twistMass = this.computeEffectiveInertiaMoment(this._basisX2X,this._basisX2Y,this._basisX2Z);
- let impulse = this._impulses[0];
- let row = info.rows[info.numRows++];
- let _this = row.jacobian;
- _this.lin1X = 0;
- _this.lin1Y = 0;
- _this.lin1Z = 0;
- _this.lin2X = 0;
- _this.lin2Y = 0;
- _this.lin2Z = 0;
- _this.ang1X = 0;
- _this.ang1Y = 0;
- _this.ang1Z = 0;
- _this.ang2X = 0;
- _this.ang2Y = 0;
- _this.ang2Z = 0;
- row.rhs = 0;
- row.cfm = 0;
- row.minImpulse = 0;
- row.maxImpulse = 0;
- row.motorSpeed = 0;
- row.motorMaxImpulse = 0;
- row.impulse = null;
- row.impulse = impulse;
- row.rhs = linearRhsX;
- row.cfm = 0;
- row.minImpulse = -1e65536;
- row.maxImpulse = 1e65536;
- let j = row.jacobian;
- j.lin1X = 1;
- j.lin1Y = 0;
- j.lin1Z = 0;
- j.lin2X = 1;
- j.lin2Y = 0;
- j.lin2Z = 0;
- j.ang1X = crossR100;
- j.ang1Y = crossR101;
- j.ang1Z = crossR102;
- j.ang2X = crossR200;
- j.ang2Y = crossR201;
- j.ang2Z = crossR202;
- let impulse1 = this._impulses[1];
- let row1 = info.rows[info.numRows++];
- let _this1 = row1.jacobian;
- _this1.lin1X = 0;
- _this1.lin1Y = 0;
- _this1.lin1Z = 0;
- _this1.lin2X = 0;
- _this1.lin2Y = 0;
- _this1.lin2Z = 0;
- _this1.ang1X = 0;
- _this1.ang1Y = 0;
- _this1.ang1Z = 0;
- _this1.ang2X = 0;
- _this1.ang2Y = 0;
- _this1.ang2Z = 0;
- row1.rhs = 0;
- row1.cfm = 0;
- row1.minImpulse = 0;
- row1.maxImpulse = 0;
- row1.motorSpeed = 0;
- row1.motorMaxImpulse = 0;
- row1.impulse = null;
- row1.impulse = impulse1;
- row1.rhs = linearRhsY;
- row1.cfm = 0;
- row1.minImpulse = -1e65536;
- row1.maxImpulse = 1e65536;
- j = row1.jacobian;
- j.lin1X = 0;
- j.lin1Y = 1;
- j.lin1Z = 0;
- j.lin2X = 0;
- j.lin2Y = 1;
- j.lin2Z = 0;
- j.ang1X = crossR110;
- j.ang1Y = crossR111;
- j.ang1Z = crossR112;
- j.ang2X = crossR210;
- j.ang2Y = crossR211;
- j.ang2Z = crossR212;
- let impulse2 = this._impulses[2];
- let row2 = info.rows[info.numRows++];
- let _this2 = row2.jacobian;
- _this2.lin1X = 0;
- _this2.lin1Y = 0;
- _this2.lin1Z = 0;
- _this2.lin2X = 0;
- _this2.lin2Y = 0;
- _this2.lin2Z = 0;
- _this2.ang1X = 0;
- _this2.ang1Y = 0;
- _this2.ang1Z = 0;
- _this2.ang2X = 0;
- _this2.ang2Y = 0;
- _this2.ang2Z = 0;
- row2.rhs = 0;
- row2.cfm = 0;
- row2.minImpulse = 0;
- row2.maxImpulse = 0;
- row2.motorSpeed = 0;
- row2.motorMaxImpulse = 0;
- row2.impulse = null;
- row2.impulse = impulse2;
- row2.rhs = linearRhsZ;
- row2.cfm = 0;
- row2.minImpulse = -1e65536;
- row2.maxImpulse = 1e65536;
- j = row2.jacobian;
- j.lin1X = 0;
- j.lin1Y = 0;
- j.lin1Z = 1;
- j.lin2X = 0;
- j.lin2Y = 0;
- j.lin2Z = 1;
- j.ang1X = crossR120;
- j.ang1Y = crossR121;
- j.ang1Z = crossR122;
- j.ang2X = crossR220;
- j.ang2Y = crossR221;
- j.ang2Z = crossR222;
- if(this.swingError > 0 && (this._swingSd.frequency <= 0 || !isPositionPart)) {
- let impulse = this._impulses[3];
- let row = info.rows[info.numRows++];
- let _this = row.jacobian;
- _this.lin1X = 0;
- _this.lin1Y = 0;
- _this.lin1Z = 0;
- _this.lin2X = 0;
- _this.lin2Y = 0;
- _this.lin2Z = 0;
- _this.ang1X = 0;
- _this.ang1Y = 0;
- _this.ang1Z = 0;
- _this.ang2X = 0;
- _this.ang2Y = 0;
- _this.ang2Z = 0;
- row.rhs = 0;
- row.cfm = 0;
- row.minImpulse = 0;
- row.maxImpulse = 0;
- row.motorSpeed = 0;
- row.motorMaxImpulse = 0;
- row.impulse = null;
- row.impulse = impulse;
- this.setSolverInfoRowAngular(row,this.swingError,this.dummySwingLm,swingMass,this._swingSd,timeStep,isPositionPart);
- j = row.jacobian;
- j.ang1X = this.swingAxisX;
- j.ang1Y = this.swingAxisY;
- j.ang1Z = this.swingAxisZ;
- j.ang2X = this.swingAxisX;
- j.ang2Y = this.swingAxisY;
- j.ang2Z = this.swingAxisZ;
- }
- if(this._twistSd.frequency <= 0 || !isPositionPart) {
- let impulse = this._impulses[4];
- let row = info.rows[info.numRows++];
- let _this = row.jacobian;
- _this.lin1X = 0;
- _this.lin1Y = 0;
- _this.lin1Z = 0;
- _this.lin2X = 0;
- _this.lin2Y = 0;
- _this.lin2Z = 0;
- _this.ang1X = 0;
- _this.ang1Y = 0;
- _this.ang1Z = 0;
- _this.ang2X = 0;
- _this.ang2Y = 0;
- _this.ang2Z = 0;
- row.rhs = 0;
- row.cfm = 0;
- row.minImpulse = 0;
- row.maxImpulse = 0;
- row.motorSpeed = 0;
- row.motorMaxImpulse = 0;
- row.impulse = null;
- row.impulse = impulse;
- this.setSolverInfoRowAngular(row,this._twistAngle,this._twistLm,twistMass,this._twistSd,timeStep,isPositionPart);
- j = row.jacobian;
- j.ang1X = this.twistAxisX;
- j.ang1Y = this.twistAxisY;
- j.ang1Z = this.twistAxisZ;
- j.ang2X = this.twistAxisX;
- j.ang2Y = this.twistAxisY;
- j.ang2Z = this.twistAxisZ;
- }
- }
- _syncAnchors() {
- super._syncAnchors();
- let axis1X;
- let axis1Y;
- let axis1Z;
- let axis2X;
- let axis2Y;
- let axis2Z;
- axis1X = this._basisX1X;
- axis1Y = this._basisX1Y;
- axis1Z = this._basisX1Z;
- axis2X = this._basisX2X;
- axis2Y = this._basisX2Y;
- axis2Z = this._basisX2Z;
- let basis1Mat00;
- let basis1Mat01;
- let basis1Mat02;
- let basis1Mat10;
- let basis1Mat11;
- let basis1Mat12;
- let basis1Mat20;
- let basis1Mat21;
- let basis1Mat22;
- basis1Mat00 = this._basisX1X;
- basis1Mat01 = this._basisY1X;
- basis1Mat02 = this._basisZ1X;
- basis1Mat10 = this._basisX1Y;
- basis1Mat11 = this._basisY1Y;
- basis1Mat12 = this._basisZ1Y;
- basis1Mat20 = this._basisX1Z;
- basis1Mat21 = this._basisY1Z;
- basis1Mat22 = this._basisZ1Z;
- let swingQX;
- let swingQY;
- let swingQZ;
- let swingQW;
- let swingM00;
- let swingM01;
- let swingM02;
- let swingM10;
- let swingM11;
- let swingM12;
- let swingM20;
- let swingM21;
- let swingM22;
- let swingVX;
- let swingVY;
- let swingVZ;
- let d = axis1X * axis2X + axis1Y * axis2Y + axis1Z * axis2Z;
- if(d < -0.999999999) {
- let vX;
- let vY;
- let vZ;
- let x1 = axis1X;
- let y1 = axis1Y;
- let z1 = axis1Z;
- let x2 = x1 * x1;
- let y2 = y1 * y1;
- let z2 = z1 * z1;
- let d;
- if(x2 < y2) {
- if(x2 < z2) {
- d = 1 / Math.sqrt(y2 + z2);
- vX = 0;
- vY = z1 * d;
- vZ = -y1 * d;
- } else {
- d = 1 / Math.sqrt(x2 + y2);
- vX = y1 * d;
- vY = -x1 * d;
- vZ = 0;
- }
- } else if(y2 < z2) {
- d = 1 / Math.sqrt(z2 + x2);
- vX = -z1 * d;
- vY = 0;
- vZ = x1 * d;
- } else {
- d = 1 / Math.sqrt(x2 + y2);
- vX = y1 * d;
- vY = -x1 * d;
- vZ = 0;
- }
- swingQX = vX;
- swingQY = vY;
- swingQZ = vZ;
- swingQW = 0;
- } else {
- let cX;
- let cY;
- let cZ;
- cX = axis1Y * axis2Z - axis1Z * axis2Y;
- cY = axis1Z * axis2X - axis1X * axis2Z;
- cZ = axis1X * axis2Y - axis1Y * axis2X;
- let w = Math.sqrt((1 + d) * 0.5);
- d = 0.5 / w;
- cX *= d;
- cY *= d;
- cZ *= d;
- swingQX = cX;
- swingQY = cY;
- swingQZ = cZ;
- swingQW = w;
- }
- let x = swingQX;
- let y = swingQY;
- let z = swingQZ;
- let w = swingQW;
- let x2 = 2 * x;
- let y2 = 2 * y;
- let z2 = 2 * z;
- let xx = x * x2;
- let yy = y * y2;
- let zz = z * z2;
- let xy = x * y2;
- let yz = y * z2;
- let xz = x * z2;
- let wx = w * x2;
- let wy = w * y2;
- let wz = w * z2;
- swingM00 = 1 - yy - zz;
- swingM01 = xy - wz;
- swingM02 = xz + wy;
- swingM10 = xy + wz;
- swingM11 = 1 - xx - zz;
- swingM12 = yz - wx;
- swingM20 = xz - wy;
- swingM21 = yz + wx;
- swingM22 = 1 - xx - yy;
- this._swingAngle = (swingQW <= -1 ? 3.14159265358979 : swingQW >= 1 ? 0 : Math.acos(swingQW)) * 2;
- swingVX = swingQX;
- swingVY = swingQY;
- swingVZ = swingQZ;
- let basisY2In1X;
- let basisY2In1Y;
- let basisY2In1Z;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = swingM00 * this._basisY2X + swingM10 * this._basisY2Y + swingM20 * this._basisY2Z;
- __tmp__Y = swingM01 * this._basisY2X + swingM11 * this._basisY2Y + swingM21 * this._basisY2Z;
- __tmp__Z = swingM02 * this._basisY2X + swingM12 * this._basisY2Y + swingM22 * this._basisY2Z;
- basisY2In1X = __tmp__X;
- basisY2In1Y = __tmp__Y;
- basisY2In1Z = __tmp__Z;
- this._twistAngle = Math.atan2(this._basisZ1X * basisY2In1X + this._basisZ1Y * basisY2In1Y + this._basisZ1Z * basisY2In1Z,this._basisY1X * basisY2In1X + this._basisY1Y * basisY2In1Y + this._basisY1Z * basisY2In1Z);
- this.twistAxisX = this._basisX1X + this._basisX2X;
- this.twistAxisY = this._basisX1Y + this._basisX2Y;
- this.twistAxisZ = this._basisX1Z + this._basisX2Z;
- let l = this.twistAxisX * this.twistAxisX + this.twistAxisY * this.twistAxisY + this.twistAxisZ * this.twistAxisZ;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- this.twistAxisX *= l;
- this.twistAxisY *= l;
- this.twistAxisZ *= l;
- let invLen = Math.sqrt(swingVX * swingVX + swingVY * swingVY + swingVZ * swingVZ);
- if(invLen > 0) {
- invLen = 1 / invLen;
- }
- swingVX *= invLen * this._swingAngle;
- swingVY *= invLen * this._swingAngle;
- swingVZ *= invLen * this._swingAngle;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__Y1 = basis1Mat01 * swingVX + basis1Mat11 * swingVY + basis1Mat21 * swingVZ;
- __tmp__Z1 = basis1Mat02 * swingVX + basis1Mat12 * swingVY + basis1Mat22 * swingVZ;
- swingVY = __tmp__Y1;
- swingVZ = __tmp__Z1;
- let x1 = swingVY;
- let y1 = swingVZ;
- let a = this._maxSwingAngle1;
- let b = this._maxSwingAngle2;
- let invA2 = 1 / (a * a);
- let invB2 = 1 / (b * b);
- let w1 = x1 * x1 * invA2 + y1 * y1 * invB2;
- if(w1 == 0) {
- this.swingAxisX = 0;
- this.swingAxisY = 0;
- this.swingAxisZ = 0;
- this.swingError = 0;
- } else {
- let t = Math.sqrt(1 / w1);
- let x0 = x1 * t;
- let y0 = y1 * t;
- let nx = x0 * invA2;
- let ny = y0 * invB2;
- invLen = 1 / Math.sqrt(nx * nx + ny * ny);
- nx *= invLen;
- ny *= invLen;
- let depth = (x1 - x0) * nx + (y1 - y0) * ny;
- if(depth > 0) {
- this.swingError = depth;
- this.swingAxisX = 0;
- this.swingAxisY = nx;
- this.swingAxisZ = ny;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = basis1Mat00 * this.swingAxisX + basis1Mat01 * this.swingAxisY + basis1Mat02 * this.swingAxisZ;
- __tmp__Y = basis1Mat10 * this.swingAxisX + basis1Mat11 * this.swingAxisY + basis1Mat12 * this.swingAxisZ;
- __tmp__Z = basis1Mat20 * this.swingAxisX + basis1Mat21 * this.swingAxisY + basis1Mat22 * this.swingAxisZ;
- this.swingAxisX = __tmp__X;
- this.swingAxisY = __tmp__Y;
- this.swingAxisZ = __tmp__Z;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = swingM00 * this.swingAxisX + swingM01 * this.swingAxisY + swingM02 * this.swingAxisZ;
- __tmp__Y1 = swingM10 * this.swingAxisX + swingM11 * this.swingAxisY + swingM12 * this.swingAxisZ;
- __tmp__Z1 = swingM20 * this.swingAxisX + swingM21 * this.swingAxisY + swingM22 * this.swingAxisZ;
- this.swingAxisX = __tmp__X1;
- this.swingAxisY = __tmp__Y1;
- this.swingAxisZ = __tmp__Z1;
- } else {
- this.swingError = 0;
- }
- }
- this.linearErrorX = this._anchor2X - this._anchor1X;
- this.linearErrorY = this._anchor2Y - this._anchor1Y;
- this.linearErrorZ = this._anchor2Z - this._anchor1Z;
- }
- _getVelocitySolverInfo(timeStep,info) {
- super._getVelocitySolverInfo(timeStep,info);
- this.getInfo(info,timeStep,false);
- }
- _getPositionSolverInfo(info) {
- super._getPositionSolverInfo(info);
- this.getInfo(info,null,true);
- }
- getAxis1() {
- let v = new oimo.common.Vec3();
- v.x = this._basisX1X;
- v.y = this._basisX1Y;
- v.z = this._basisX1Z;
- return v;
- }
- getAxis2() {
- let v = new oimo.common.Vec3();
- v.x = this._basisX2X;
- v.y = this._basisX2Y;
- v.z = this._basisX2Z;
- return v;
- }
- getAxis1To(axis) {
- axis.x = this._basisX1X;
- axis.y = this._basisX1Y;
- axis.z = this._basisX1Z;
- }
- getAxis2To(axis) {
- axis.x = this._basisX2X;
- axis.y = this._basisX2Y;
- axis.z = this._basisX2Z;
- }
- getLocalAxis1() {
- let v = new oimo.common.Vec3();
- v.x = this._localBasisX1X;
- v.y = this._localBasisX1Y;
- v.z = this._localBasisX1Z;
- return v;
- }
- getLocalAxis2() {
- let v = new oimo.common.Vec3();
- v.x = this._localBasisX2X;
- v.y = this._localBasisX2Y;
- v.z = this._localBasisX2Z;
- return v;
- }
- getLocalAxis1To(axis) {
- axis.x = this._localBasisX1X;
- axis.y = this._localBasisX1Y;
- axis.z = this._localBasisX1Z;
- }
- getLocalAxis2To(axis) {
- axis.x = this._localBasisX2X;
- axis.y = this._localBasisX2Y;
- axis.z = this._localBasisX2Z;
- }
- getTwistSpringDamper() {
- return this._twistSd;
- }
- getTwistLimitMotor() {
- return this._twistLm;
- }
- getSwingSpringDamper() {
- return this._swingSd;
- }
- getSwingAxis() {
- let v = new oimo.common.Vec3();
- v.x = this.swingAxisX;
- v.y = this.swingAxisY;
- v.z = this.swingAxisZ;
- return v;
- }
- getSwingAxisTo(axis) {
- axis.x = this.swingAxisX;
- axis.y = this.swingAxisY;
- axis.z = this.swingAxisZ;
- }
- getSwingAngle() {
- return this._swingAngle;
- }
- getTwistAngle() {
- return this._twistAngle;
- }
- }
- oimo.dynamics.constraint.joint.RagdollJointConfig = class oimo_dynamics_constraint_joint_RagdollJointConfig extends oimo.dynamics.constraint.joint.JointConfig {
- constructor() {
- super();
- this.localTwistAxis1 = new oimo.common.Vec3(1,0,0);
- this.localTwistAxis2 = new oimo.common.Vec3(1,0,0);
- this.localSwingAxis1 = new oimo.common.Vec3(0,1,0);
- this.twistSpringDamper = new oimo.dynamics.constraint.joint.SpringDamper();
- this.swingSpringDamper = new oimo.dynamics.constraint.joint.SpringDamper();
- this.twistLimitMotor = new oimo.dynamics.constraint.joint.RotationalLimitMotor();
- this.maxSwingAngle1 = 3.14159265358979;
- this.maxSwingAngle2 = 3.14159265358979;
- }
- init(rigidBody1,rigidBody2,worldAnchor,worldTwistAxis,worldSwingAxis) {
- this._init(rigidBody1,rigidBody2,worldAnchor);
- let localVector = this.localTwistAxis1;
- let vX;
- let vY;
- let vZ;
- vX = worldTwistAxis.x;
- vY = worldTwistAxis.y;
- vZ = worldTwistAxis.z;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = rigidBody1._transform._rotation00 * vX + rigidBody1._transform._rotation10 * vY + rigidBody1._transform._rotation20 * vZ;
- __tmp__Y = rigidBody1._transform._rotation01 * vX + rigidBody1._transform._rotation11 * vY + rigidBody1._transform._rotation21 * vZ;
- __tmp__Z = rigidBody1._transform._rotation02 * vX + rigidBody1._transform._rotation12 * vY + rigidBody1._transform._rotation22 * vZ;
- vX = __tmp__X;
- vY = __tmp__Y;
- vZ = __tmp__Z;
- localVector.x = vX;
- localVector.y = vY;
- localVector.z = vZ;
- let localVector1 = this.localTwistAxis2;
- let vX1;
- let vY1;
- let vZ1;
- vX1 = worldTwistAxis.x;
- vY1 = worldTwistAxis.y;
- vZ1 = worldTwistAxis.z;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = rigidBody2._transform._rotation00 * vX1 + rigidBody2._transform._rotation10 * vY1 + rigidBody2._transform._rotation20 * vZ1;
- __tmp__Y1 = rigidBody2._transform._rotation01 * vX1 + rigidBody2._transform._rotation11 * vY1 + rigidBody2._transform._rotation21 * vZ1;
- __tmp__Z1 = rigidBody2._transform._rotation02 * vX1 + rigidBody2._transform._rotation12 * vY1 + rigidBody2._transform._rotation22 * vZ1;
- vX1 = __tmp__X1;
- vY1 = __tmp__Y1;
- vZ1 = __tmp__Z1;
- localVector1.x = vX1;
- localVector1.y = vY1;
- localVector1.z = vZ1;
- let localVector2 = this.localSwingAxis1;
- let vX2;
- let vY2;
- let vZ2;
- vX2 = worldSwingAxis.x;
- vY2 = worldSwingAxis.y;
- vZ2 = worldSwingAxis.z;
- let __tmp__X2;
- let __tmp__Y2;
- let __tmp__Z2;
- __tmp__X2 = rigidBody1._transform._rotation00 * vX2 + rigidBody1._transform._rotation10 * vY2 + rigidBody1._transform._rotation20 * vZ2;
- __tmp__Y2 = rigidBody1._transform._rotation01 * vX2 + rigidBody1._transform._rotation11 * vY2 + rigidBody1._transform._rotation21 * vZ2;
- __tmp__Z2 = rigidBody1._transform._rotation02 * vX2 + rigidBody1._transform._rotation12 * vY2 + rigidBody1._transform._rotation22 * vZ2;
- vX2 = __tmp__X2;
- vY2 = __tmp__Y2;
- vZ2 = __tmp__Z2;
- localVector2.x = vX2;
- localVector2.y = vY2;
- localVector2.z = vZ2;
- return this;
- }
- }
- oimo.dynamics.constraint.joint.RevoluteJoint = class oimo_dynamics_constraint_joint_RevoluteJoint extends oimo.dynamics.constraint.joint.Joint {
- constructor(config) {
- super(config,1);
- let v = config.localAxis1;
- this._localBasisX1X = v.x;
- this._localBasisX1Y = v.y;
- this._localBasisX1Z = v.z;
- let v1 = config.localAxis2;
- this._localBasisX2X = v1.x;
- this._localBasisX2Y = v1.y;
- this._localBasisX2Z = v1.z;
- this.buildLocalBasesFromX();
- this.angle = 0;
- this.angularErrorY = 0;
- this.angularErrorZ = 0;
- this._basis = new oimo.dynamics.constraint.joint.BasisTracker(this);
- this._sd = config.springDamper.clone();
- this._lm = config.limitMotor.clone();
- }
- getInfo(info,timeStep,isPositionPart) {
- let erp = this.getErp(timeStep,isPositionPart);
- let linearRhsX;
- let linearRhsY;
- let linearRhsZ;
- linearRhsX = this.linearErrorX * erp;
- linearRhsY = this.linearErrorY * erp;
- linearRhsZ = this.linearErrorZ * erp;
- let angRhsY = this.angularErrorY * erp;
- let angRhsZ = this.angularErrorZ * erp;
- let crossR100;
- let crossR101;
- let crossR102;
- let crossR110;
- let crossR111;
- let crossR112;
- let crossR120;
- let crossR121;
- let crossR122;
- let crossR200;
- let crossR201;
- let crossR202;
- let crossR210;
- let crossR211;
- let crossR212;
- let crossR220;
- let crossR221;
- let crossR222;
- crossR100 = 0;
- crossR101 = -this._relativeAnchor1Z;
- crossR102 = this._relativeAnchor1Y;
- crossR110 = this._relativeAnchor1Z;
- crossR111 = 0;
- crossR112 = -this._relativeAnchor1X;
- crossR120 = -this._relativeAnchor1Y;
- crossR121 = this._relativeAnchor1X;
- crossR122 = 0;
- crossR200 = 0;
- crossR201 = -this._relativeAnchor2Z;
- crossR202 = this._relativeAnchor2Y;
- crossR210 = this._relativeAnchor2Z;
- crossR211 = 0;
- crossR212 = -this._relativeAnchor2X;
- crossR220 = -this._relativeAnchor2Y;
- crossR221 = this._relativeAnchor2X;
- crossR222 = 0;
- crossR100 = -crossR100;
- crossR101 = -crossR101;
- crossR102 = -crossR102;
- crossR110 = -crossR110;
- crossR111 = -crossR111;
- crossR112 = -crossR112;
- crossR120 = -crossR120;
- crossR121 = -crossR121;
- crossR122 = -crossR122;
- crossR200 = -crossR200;
- crossR201 = -crossR201;
- crossR202 = -crossR202;
- crossR210 = -crossR210;
- crossR211 = -crossR211;
- crossR212 = -crossR212;
- crossR220 = -crossR220;
- crossR221 = -crossR221;
- crossR222 = -crossR222;
- let motorMass = this.computeEffectiveInertiaMoment(this._basis.xX,this._basis.xY,this._basis.xZ);
- let impulse = this._impulses[0];
- let row = info.rows[info.numRows++];
- let _this = row.jacobian;
- _this.lin1X = 0;
- _this.lin1Y = 0;
- _this.lin1Z = 0;
- _this.lin2X = 0;
- _this.lin2Y = 0;
- _this.lin2Z = 0;
- _this.ang1X = 0;
- _this.ang1Y = 0;
- _this.ang1Z = 0;
- _this.ang2X = 0;
- _this.ang2Y = 0;
- _this.ang2Z = 0;
- row.rhs = 0;
- row.cfm = 0;
- row.minImpulse = 0;
- row.maxImpulse = 0;
- row.motorSpeed = 0;
- row.motorMaxImpulse = 0;
- row.impulse = null;
- row.impulse = impulse;
- row.rhs = linearRhsX;
- row.cfm = 0;
- row.minImpulse = -1e65536;
- row.maxImpulse = 1e65536;
- let j = row.jacobian;
- j.lin1X = 1;
- j.lin1Y = 0;
- j.lin1Z = 0;
- j.lin2X = 1;
- j.lin2Y = 0;
- j.lin2Z = 0;
- j.ang1X = crossR100;
- j.ang1Y = crossR101;
- j.ang1Z = crossR102;
- j.ang2X = crossR200;
- j.ang2Y = crossR201;
- j.ang2Z = crossR202;
- let impulse1 = this._impulses[1];
- let row1 = info.rows[info.numRows++];
- let _this1 = row1.jacobian;
- _this1.lin1X = 0;
- _this1.lin1Y = 0;
- _this1.lin1Z = 0;
- _this1.lin2X = 0;
- _this1.lin2Y = 0;
- _this1.lin2Z = 0;
- _this1.ang1X = 0;
- _this1.ang1Y = 0;
- _this1.ang1Z = 0;
- _this1.ang2X = 0;
- _this1.ang2Y = 0;
- _this1.ang2Z = 0;
- row1.rhs = 0;
- row1.cfm = 0;
- row1.minImpulse = 0;
- row1.maxImpulse = 0;
- row1.motorSpeed = 0;
- row1.motorMaxImpulse = 0;
- row1.impulse = null;
- row1.impulse = impulse1;
- row1.rhs = linearRhsY;
- row1.cfm = 0;
- row1.minImpulse = -1e65536;
- row1.maxImpulse = 1e65536;
- j = row1.jacobian;
- j.lin1X = 0;
- j.lin1Y = 1;
- j.lin1Z = 0;
- j.lin2X = 0;
- j.lin2Y = 1;
- j.lin2Z = 0;
- j.ang1X = crossR110;
- j.ang1Y = crossR111;
- j.ang1Z = crossR112;
- j.ang2X = crossR210;
- j.ang2Y = crossR211;
- j.ang2Z = crossR212;
- let impulse2 = this._impulses[2];
- let row2 = info.rows[info.numRows++];
- let _this2 = row2.jacobian;
- _this2.lin1X = 0;
- _this2.lin1Y = 0;
- _this2.lin1Z = 0;
- _this2.lin2X = 0;
- _this2.lin2Y = 0;
- _this2.lin2Z = 0;
- _this2.ang1X = 0;
- _this2.ang1Y = 0;
- _this2.ang1Z = 0;
- _this2.ang2X = 0;
- _this2.ang2Y = 0;
- _this2.ang2Z = 0;
- row2.rhs = 0;
- row2.cfm = 0;
- row2.minImpulse = 0;
- row2.maxImpulse = 0;
- row2.motorSpeed = 0;
- row2.motorMaxImpulse = 0;
- row2.impulse = null;
- row2.impulse = impulse2;
- row2.rhs = linearRhsZ;
- row2.cfm = 0;
- row2.minImpulse = -1e65536;
- row2.maxImpulse = 1e65536;
- j = row2.jacobian;
- j.lin1X = 0;
- j.lin1Y = 0;
- j.lin1Z = 1;
- j.lin2X = 0;
- j.lin2Y = 0;
- j.lin2Z = 1;
- j.ang1X = crossR120;
- j.ang1Y = crossR121;
- j.ang1Z = crossR122;
- j.ang2X = crossR220;
- j.ang2Y = crossR221;
- j.ang2Z = crossR222;
- if(this._sd.frequency <= 0 || !isPositionPart) {
- let impulse = this._impulses[3];
- let row = info.rows[info.numRows++];
- let _this = row.jacobian;
- _this.lin1X = 0;
- _this.lin1Y = 0;
- _this.lin1Z = 0;
- _this.lin2X = 0;
- _this.lin2Y = 0;
- _this.lin2Z = 0;
- _this.ang1X = 0;
- _this.ang1Y = 0;
- _this.ang1Z = 0;
- _this.ang2X = 0;
- _this.ang2Y = 0;
- _this.ang2Z = 0;
- row.rhs = 0;
- row.cfm = 0;
- row.minImpulse = 0;
- row.maxImpulse = 0;
- row.motorSpeed = 0;
- row.motorMaxImpulse = 0;
- row.impulse = null;
- row.impulse = impulse;
- this.setSolverInfoRowAngular(row,this.angle,this._lm,motorMass,this._sd,timeStep,isPositionPart);
- j = row.jacobian;
- j.ang1X = this._basis.xX;
- j.ang1Y = this._basis.xY;
- j.ang1Z = this._basis.xZ;
- j.ang2X = this._basis.xX;
- j.ang2Y = this._basis.xY;
- j.ang2Z = this._basis.xZ;
- }
- let impulse3 = this._impulses[4];
- let row3 = info.rows[info.numRows++];
- let _this3 = row3.jacobian;
- _this3.lin1X = 0;
- _this3.lin1Y = 0;
- _this3.lin1Z = 0;
- _this3.lin2X = 0;
- _this3.lin2Y = 0;
- _this3.lin2Z = 0;
- _this3.ang1X = 0;
- _this3.ang1Y = 0;
- _this3.ang1Z = 0;
- _this3.ang2X = 0;
- _this3.ang2Y = 0;
- _this3.ang2Z = 0;
- row3.rhs = 0;
- row3.cfm = 0;
- row3.minImpulse = 0;
- row3.maxImpulse = 0;
- row3.motorSpeed = 0;
- row3.motorMaxImpulse = 0;
- row3.impulse = null;
- row3.impulse = impulse3;
- row3.rhs = angRhsY;
- row3.cfm = 0;
- row3.minImpulse = -1e65536;
- row3.maxImpulse = 1e65536;
- j = row3.jacobian;
- j.ang1X = this._basis.yX;
- j.ang1Y = this._basis.yY;
- j.ang1Z = this._basis.yZ;
- j.ang2X = this._basis.yX;
- j.ang2Y = this._basis.yY;
- j.ang2Z = this._basis.yZ;
- let impulse4 = this._impulses[5];
- let row4 = info.rows[info.numRows++];
- let _this4 = row4.jacobian;
- _this4.lin1X = 0;
- _this4.lin1Y = 0;
- _this4.lin1Z = 0;
- _this4.lin2X = 0;
- _this4.lin2Y = 0;
- _this4.lin2Z = 0;
- _this4.ang1X = 0;
- _this4.ang1Y = 0;
- _this4.ang1Z = 0;
- _this4.ang2X = 0;
- _this4.ang2Y = 0;
- _this4.ang2Z = 0;
- row4.rhs = 0;
- row4.cfm = 0;
- row4.minImpulse = 0;
- row4.maxImpulse = 0;
- row4.motorSpeed = 0;
- row4.motorMaxImpulse = 0;
- row4.impulse = null;
- row4.impulse = impulse4;
- row4.rhs = angRhsZ;
- row4.cfm = 0;
- row4.minImpulse = -1e65536;
- row4.maxImpulse = 1e65536;
- j = row4.jacobian;
- j.ang1X = this._basis.zX;
- j.ang1Y = this._basis.zY;
- j.ang1Z = this._basis.zZ;
- j.ang2X = this._basis.zX;
- j.ang2Y = this._basis.zY;
- j.ang2Z = this._basis.zZ;
- }
- _syncAnchors() {
- super._syncAnchors();
- let _this = this._basis;
- let invM1 = _this.joint._b1._invMass;
- let invM2 = _this.joint._b2._invMass;
- let qX;
- let qY;
- let qZ;
- let qW;
- let idQX;
- let idQY;
- let idQZ;
- let idQW;
- let slerpQX;
- let slerpQY;
- let slerpQZ;
- let slerpQW;
- let slerpM00;
- let slerpM01;
- let slerpM02;
- let slerpM10;
- let slerpM11;
- let slerpM12;
- let slerpM20;
- let slerpM21;
- let slerpM22;
- let newXX;
- let newXY;
- let newXZ;
- let newYX;
- let newYY;
- let newYZ;
- let newZX;
- let newZY;
- let newZZ;
- let prevXX;
- let prevXY;
- let prevXZ;
- let prevYX;
- let prevYY;
- let prevYZ;
- let d = _this.joint._basisX1X * _this.joint._basisX2X + _this.joint._basisX1Y * _this.joint._basisX2Y + _this.joint._basisX1Z * _this.joint._basisX2Z;
- if(d < -0.999999999) {
- let vX;
- let vY;
- let vZ;
- let x1 = _this.joint._basisX1X;
- let y1 = _this.joint._basisX1Y;
- let z1 = _this.joint._basisX1Z;
- let x2 = x1 * x1;
- let y2 = y1 * y1;
- let z2 = z1 * z1;
- let d;
- if(x2 < y2) {
- if(x2 < z2) {
- d = 1 / Math.sqrt(y2 + z2);
- vX = 0;
- vY = z1 * d;
- vZ = -y1 * d;
- } else {
- d = 1 / Math.sqrt(x2 + y2);
- vX = y1 * d;
- vY = -x1 * d;
- vZ = 0;
- }
- } else if(y2 < z2) {
- d = 1 / Math.sqrt(z2 + x2);
- vX = -z1 * d;
- vY = 0;
- vZ = x1 * d;
- } else {
- d = 1 / Math.sqrt(x2 + y2);
- vX = y1 * d;
- vY = -x1 * d;
- vZ = 0;
- }
- qX = vX;
- qY = vY;
- qZ = vZ;
- qW = 0;
- } else {
- let cX;
- let cY;
- let cZ;
- cX = _this.joint._basisX1Y * _this.joint._basisX2Z - _this.joint._basisX1Z * _this.joint._basisX2Y;
- cY = _this.joint._basisX1Z * _this.joint._basisX2X - _this.joint._basisX1X * _this.joint._basisX2Z;
- cZ = _this.joint._basisX1X * _this.joint._basisX2Y - _this.joint._basisX1Y * _this.joint._basisX2X;
- let w = Math.sqrt((1 + d) * 0.5);
- d = 0.5 / w;
- cX *= d;
- cY *= d;
- cZ *= d;
- qX = cX;
- qY = cY;
- qZ = cZ;
- qW = w;
- }
- idQX = 0;
- idQY = 0;
- idQZ = 0;
- idQW = 1;
- let q1X;
- let q1Y;
- let q1Z;
- let q1W;
- let q2X;
- let q2Y;
- let q2Z;
- let q2W;
- q1X = idQX;
- q1Y = idQY;
- q1Z = idQZ;
- q1W = idQW;
- q2X = qX;
- q2Y = qY;
- q2Z = qZ;
- q2W = qW;
- let d1 = q1X * q2X + q1Y * q2Y + q1Z * q2Z + q1W * q2W;
- if(d1 < 0) {
- d1 = -d1;
- q2X = -q2X;
- q2Y = -q2Y;
- q2Z = -q2Z;
- q2W = -q2W;
- }
- if(d1 > 0.999999) {
- let dqX;
- let dqY;
- let dqZ;
- let dqW;
- dqX = q2X - q1X;
- dqY = q2Y - q1Y;
- dqZ = q2Z - q1Z;
- dqW = q2W - q1W;
- q2X = q1X + dqX * (invM1 / (invM1 + invM2));
- q2Y = q1Y + dqY * (invM1 / (invM1 + invM2));
- q2Z = q1Z + dqZ * (invM1 / (invM1 + invM2));
- q2W = q1W + dqW * (invM1 / (invM1 + invM2));
- let l = q2X * q2X + q2Y * q2Y + q2Z * q2Z + q2W * q2W;
- if(l > 1e-32) {
- l = 1 / Math.sqrt(l);
- }
- slerpQX = q2X * l;
- slerpQY = q2Y * l;
- slerpQZ = q2Z * l;
- slerpQW = q2W * l;
- } else {
- let theta = invM1 / (invM1 + invM2) * Math.acos(d1);
- q2X += q1X * -d1;
- q2Y += q1Y * -d1;
- q2Z += q1Z * -d1;
- q2W += q1W * -d1;
- let l = q2X * q2X + q2Y * q2Y + q2Z * q2Z + q2W * q2W;
- if(l > 1e-32) {
- l = 1 / Math.sqrt(l);
- }
- q2X *= l;
- q2Y *= l;
- q2Z *= l;
- q2W *= l;
- let sin = Math.sin(theta);
- let cos = Math.cos(theta);
- q1X *= cos;
- q1Y *= cos;
- q1Z *= cos;
- q1W *= cos;
- slerpQX = q1X + q2X * sin;
- slerpQY = q1Y + q2Y * sin;
- slerpQZ = q1Z + q2Z * sin;
- slerpQW = q1W + q2W * sin;
- }
- let x = slerpQX;
- let y = slerpQY;
- let z = slerpQZ;
- let w = slerpQW;
- let x2 = 2 * x;
- let y2 = 2 * y;
- let z2 = 2 * z;
- let xx = x * x2;
- let yy = y * y2;
- let zz = z * z2;
- let xy = x * y2;
- let yz = y * z2;
- let xz = x * z2;
- let wx = w * x2;
- let wy = w * y2;
- let wz = w * z2;
- slerpM00 = 1 - yy - zz;
- slerpM01 = xy - wz;
- slerpM02 = xz + wy;
- slerpM10 = xy + wz;
- slerpM11 = 1 - xx - zz;
- slerpM12 = yz - wx;
- slerpM20 = xz - wy;
- slerpM21 = yz + wx;
- slerpM22 = 1 - xx - yy;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = slerpM00 * _this.joint._basisX1X + slerpM01 * _this.joint._basisX1Y + slerpM02 * _this.joint._basisX1Z;
- __tmp__Y = slerpM10 * _this.joint._basisX1X + slerpM11 * _this.joint._basisX1Y + slerpM12 * _this.joint._basisX1Z;
- __tmp__Z = slerpM20 * _this.joint._basisX1X + slerpM21 * _this.joint._basisX1Y + slerpM22 * _this.joint._basisX1Z;
- newXX = __tmp__X;
- newXY = __tmp__Y;
- newXZ = __tmp__Z;
- prevXX = _this.xX;
- prevXY = _this.xY;
- prevXZ = _this.xZ;
- prevYX = _this.yX;
- prevYY = _this.yY;
- prevYZ = _this.yZ;
- let d2 = prevXX * newXX + prevXY * newXY + prevXZ * newXZ;
- if(d2 < -0.999999999) {
- let vX;
- let vY;
- let vZ;
- let x1 = prevXX;
- let y1 = prevXY;
- let z1 = prevXZ;
- let x2 = x1 * x1;
- let y2 = y1 * y1;
- let z2 = z1 * z1;
- let d;
- if(x2 < y2) {
- if(x2 < z2) {
- d = 1 / Math.sqrt(y2 + z2);
- vX = 0;
- vY = z1 * d;
- vZ = -y1 * d;
- } else {
- d = 1 / Math.sqrt(x2 + y2);
- vX = y1 * d;
- vY = -x1 * d;
- vZ = 0;
- }
- } else if(y2 < z2) {
- d = 1 / Math.sqrt(z2 + x2);
- vX = -z1 * d;
- vY = 0;
- vZ = x1 * d;
- } else {
- d = 1 / Math.sqrt(x2 + y2);
- vX = y1 * d;
- vY = -x1 * d;
- vZ = 0;
- }
- slerpQX = vX;
- slerpQY = vY;
- slerpQZ = vZ;
- slerpQW = 0;
- } else {
- let cX;
- let cY;
- let cZ;
- cX = prevXY * newXZ - prevXZ * newXY;
- cY = prevXZ * newXX - prevXX * newXZ;
- cZ = prevXX * newXY - prevXY * newXX;
- let w = Math.sqrt((1 + d2) * 0.5);
- d2 = 0.5 / w;
- cX *= d2;
- cY *= d2;
- cZ *= d2;
- slerpQX = cX;
- slerpQY = cY;
- slerpQZ = cZ;
- slerpQW = w;
- }
- let x1 = slerpQX;
- let y1 = slerpQY;
- let z1 = slerpQZ;
- let w1 = slerpQW;
- let x21 = 2 * x1;
- let y21 = 2 * y1;
- let z21 = 2 * z1;
- let xx1 = x1 * x21;
- let yy1 = y1 * y21;
- let zz1 = z1 * z21;
- let xy1 = x1 * y21;
- let yz1 = y1 * z21;
- let xz1 = x1 * z21;
- let wx1 = w1 * x21;
- let wy1 = w1 * y21;
- let wz1 = w1 * z21;
- slerpM00 = 1 - yy1 - zz1;
- slerpM01 = xy1 - wz1;
- slerpM02 = xz1 + wy1;
- slerpM10 = xy1 + wz1;
- slerpM11 = 1 - xx1 - zz1;
- slerpM12 = yz1 - wx1;
- slerpM20 = xz1 - wy1;
- slerpM21 = yz1 + wx1;
- slerpM22 = 1 - xx1 - yy1;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = slerpM00 * prevYX + slerpM01 * prevYY + slerpM02 * prevYZ;
- __tmp__Y1 = slerpM10 * prevYX + slerpM11 * prevYY + slerpM12 * prevYZ;
- __tmp__Z1 = slerpM20 * prevYX + slerpM21 * prevYY + slerpM22 * prevYZ;
- newYX = __tmp__X1;
- newYY = __tmp__Y1;
- newYZ = __tmp__Z1;
- newZX = newXY * newYZ - newXZ * newYY;
- newZY = newXZ * newYX - newXX * newYZ;
- newZZ = newXX * newYY - newXY * newYX;
- if(newZX * newZX + newZY * newZY + newZZ * newZZ > 1e-6) {
- let l = newZX * newZX + newZY * newZY + newZZ * newZZ;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- newZX *= l;
- newZY *= l;
- newZZ *= l;
- } else {
- let x1 = newXX;
- let y1 = newXY;
- let z1 = newXZ;
- let x2 = x1 * x1;
- let y2 = y1 * y1;
- let z2 = z1 * z1;
- let d;
- if(x2 < y2) {
- if(x2 < z2) {
- d = 1 / Math.sqrt(y2 + z2);
- newZX = 0;
- newZY = z1 * d;
- newZZ = -y1 * d;
- } else {
- d = 1 / Math.sqrt(x2 + y2);
- newZX = y1 * d;
- newZY = -x1 * d;
- newZZ = 0;
- }
- } else if(y2 < z2) {
- d = 1 / Math.sqrt(z2 + x2);
- newZX = -z1 * d;
- newZY = 0;
- newZZ = x1 * d;
- } else {
- d = 1 / Math.sqrt(x2 + y2);
- newZX = y1 * d;
- newZY = -x1 * d;
- newZZ = 0;
- }
- }
- newYX = newZY * newXZ - newZZ * newXY;
- newYY = newZZ * newXX - newZX * newXZ;
- newYZ = newZX * newXY - newZY * newXX;
- _this.xX = newXX;
- _this.xY = newXY;
- _this.xZ = newXZ;
- _this.yX = newYX;
- _this.yY = newYY;
- _this.yZ = newYZ;
- _this.zX = newZX;
- _this.zY = newZY;
- _this.zZ = newZZ;
- let angErrorX;
- let angErrorY;
- let angErrorZ;
- angErrorX = this._basisX1Y * this._basisX2Z - this._basisX1Z * this._basisX2Y;
- angErrorY = this._basisX1Z * this._basisX2X - this._basisX1X * this._basisX2Z;
- angErrorZ = this._basisX1X * this._basisX2Y - this._basisX1Y * this._basisX2X;
- let cos = this._basisX1X * this._basisX2X + this._basisX1Y * this._basisX2Y + this._basisX1Z * this._basisX2Z;
- let theta = cos <= -1 ? 3.14159265358979 : cos >= 1 ? 0 : Math.acos(cos);
- let l = angErrorX * angErrorX + angErrorY * angErrorY + angErrorZ * angErrorZ;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- angErrorX *= l;
- angErrorY *= l;
- angErrorZ *= l;
- angErrorX *= theta;
- angErrorY *= theta;
- angErrorZ *= theta;
- this.angularErrorY = angErrorX * this._basis.yX + angErrorY * this._basis.yY + angErrorZ * this._basis.yZ;
- this.angularErrorZ = angErrorX * this._basis.zX + angErrorY * this._basis.zY + angErrorZ * this._basis.zZ;
- let perpCrossX;
- let perpCrossY;
- let perpCrossZ;
- perpCrossX = this._basisY1Y * this._basisY2Z - this._basisY1Z * this._basisY2Y;
- perpCrossY = this._basisY1Z * this._basisY2X - this._basisY1X * this._basisY2Z;
- perpCrossZ = this._basisY1X * this._basisY2Y - this._basisY1Y * this._basisY2X;
- cos = this._basisY1X * this._basisY2X + this._basisY1Y * this._basisY2Y + this._basisY1Z * this._basisY2Z;
- this.angle = cos <= -1 ? 3.14159265358979 : cos >= 1 ? 0 : Math.acos(cos);
- if(perpCrossX * this._basis.xX + perpCrossY * this._basis.xY + perpCrossZ * this._basis.xZ < 0) {
- this.angle = -this.angle;
- }
- this.linearErrorX = this._anchor2X - this._anchor1X;
- this.linearErrorY = this._anchor2Y - this._anchor1Y;
- this.linearErrorZ = this._anchor2Z - this._anchor1Z;
- }
- _getVelocitySolverInfo(timeStep,info) {
- super._getVelocitySolverInfo(timeStep,info);
- this.getInfo(info,timeStep,false);
- }
- _getPositionSolverInfo(info) {
- super._getPositionSolverInfo(info);
- this.getInfo(info,null,true);
- }
- getAxis1() {
- let v = new oimo.common.Vec3();
- v.x = this._basisX1X;
- v.y = this._basisX1Y;
- v.z = this._basisX1Z;
- return v;
- }
- getAxis2() {
- let v = new oimo.common.Vec3();
- v.x = this._basisX2X;
- v.y = this._basisX2Y;
- v.z = this._basisX2Z;
- return v;
- }
- getAxis1To(axis) {
- axis.x = this._basisX1X;
- axis.y = this._basisX1Y;
- axis.z = this._basisX1Z;
- }
- getAxis2To(axis) {
- axis.x = this._basisX2X;
- axis.y = this._basisX2Y;
- axis.z = this._basisX2Z;
- }
- getLocalAxis1() {
- let v = new oimo.common.Vec3();
- v.x = this._localBasisX1X;
- v.y = this._localBasisX1Y;
- v.z = this._localBasisX1Z;
- return v;
- }
- getLocalAxis2() {
- let v = new oimo.common.Vec3();
- v.x = this._localBasisX2X;
- v.y = this._localBasisX2Y;
- v.z = this._localBasisX2Z;
- return v;
- }
- getLocalAxis1To(axis) {
- axis.x = this._localBasisX1X;
- axis.y = this._localBasisX1Y;
- axis.z = this._localBasisX1Z;
- }
- getLocalAxis2To(axis) {
- axis.x = this._localBasisX2X;
- axis.y = this._localBasisX2Y;
- axis.z = this._localBasisX2Z;
- }
- getSpringDamper() {
- return this._sd;
- }
- getLimitMotor() {
- return this._lm;
- }
- getAngle() {
- return this.angle;
- }
- }
- oimo.dynamics.constraint.joint.RevoluteJointConfig = class oimo_dynamics_constraint_joint_RevoluteJointConfig extends oimo.dynamics.constraint.joint.JointConfig {
- constructor() {
- super();
- this.localAxis1 = new oimo.common.Vec3(1,0,0);
- this.localAxis2 = new oimo.common.Vec3(1,0,0);
- this.springDamper = new oimo.dynamics.constraint.joint.SpringDamper();
- this.limitMotor = new oimo.dynamics.constraint.joint.RotationalLimitMotor();
- }
- init(rigidBody1,rigidBody2,worldAnchor,worldAxis) {
- this._init(rigidBody1,rigidBody2,worldAnchor);
- let localVector = this.localAxis1;
- let vX;
- let vY;
- let vZ;
- vX = worldAxis.x;
- vY = worldAxis.y;
- vZ = worldAxis.z;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = rigidBody1._transform._rotation00 * vX + rigidBody1._transform._rotation10 * vY + rigidBody1._transform._rotation20 * vZ;
- __tmp__Y = rigidBody1._transform._rotation01 * vX + rigidBody1._transform._rotation11 * vY + rigidBody1._transform._rotation21 * vZ;
- __tmp__Z = rigidBody1._transform._rotation02 * vX + rigidBody1._transform._rotation12 * vY + rigidBody1._transform._rotation22 * vZ;
- vX = __tmp__X;
- vY = __tmp__Y;
- vZ = __tmp__Z;
- localVector.x = vX;
- localVector.y = vY;
- localVector.z = vZ;
- let localVector1 = this.localAxis2;
- let vX1;
- let vY1;
- let vZ1;
- vX1 = worldAxis.x;
- vY1 = worldAxis.y;
- vZ1 = worldAxis.z;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = rigidBody2._transform._rotation00 * vX1 + rigidBody2._transform._rotation10 * vY1 + rigidBody2._transform._rotation20 * vZ1;
- __tmp__Y1 = rigidBody2._transform._rotation01 * vX1 + rigidBody2._transform._rotation11 * vY1 + rigidBody2._transform._rotation21 * vZ1;
- __tmp__Z1 = rigidBody2._transform._rotation02 * vX1 + rigidBody2._transform._rotation12 * vY1 + rigidBody2._transform._rotation22 * vZ1;
- vX1 = __tmp__X1;
- vY1 = __tmp__Y1;
- vZ1 = __tmp__Z1;
- localVector1.x = vX1;
- localVector1.y = vY1;
- localVector1.z = vZ1;
- return this;
- }
- }
- oimo.dynamics.constraint.joint.RotationalLimitMotor = class oimo_dynamics_constraint_joint_RotationalLimitMotor {
- constructor() {
- this.lowerLimit = 1;
- this.upperLimit = 0;
- this.motorTorque = 0;
- }
- setLimits(lower,upper) {
- this.lowerLimit = lower;
- this.upperLimit = upper;
- return this;
- }
- setMotor(speed,torque) {
- this.motorSpeed = speed;
- this.motorTorque = torque;
- return this;
- }
- clone() {
- let lm = new oimo.dynamics.constraint.joint.RotationalLimitMotor();
- lm.lowerLimit = this.lowerLimit;
- lm.upperLimit = this.upperLimit;
- lm.motorSpeed = this.motorSpeed;
- lm.motorTorque = this.motorTorque;
- return lm;
- }
- }
- oimo.dynamics.constraint.joint.SphericalJoint = class oimo_dynamics_constraint_joint_SphericalJoint extends oimo.dynamics.constraint.joint.Joint {
- constructor(config) {
- super(config,0);
- this._sd = config.springDamper.clone();
- }
- getInfo(info,timeStep,isPositionPart) {
- if(this._sd.frequency > 0 && isPositionPart) {
- return;
- }
- let errorX;
- let errorY;
- let errorZ;
- errorX = this._anchor2X - this._anchor1X;
- errorY = this._anchor2Y - this._anchor1Y;
- errorZ = this._anchor2Z - this._anchor1Z;
- let cfm;
- let erp;
- if(this._sd.frequency > 0) {
- let omega = 6.28318530717958 * this._sd.frequency;
- let zeta = this._sd.dampingRatio;
- if(zeta < oimo.common.Setting.minSpringDamperDampingRatio) {
- zeta = oimo.common.Setting.minSpringDamperDampingRatio;
- }
- let h = timeStep.dt;
- let c = 2 * zeta * omega;
- let k = omega * omega;
- if(this._sd.useSymplecticEuler) {
- cfm = 1 / (h * c);
- erp = k / c;
- } else {
- cfm = 1 / (h * (h * k + c));
- erp = k / (h * k + c);
- }
- cfm *= this._b1._invMass + this._b2._invMass;
- } else {
- cfm = 0;
- erp = this.getErp(timeStep,isPositionPart);
- }
- let linearRhsX;
- let linearRhsY;
- let linearRhsZ;
- linearRhsX = errorX * erp;
- linearRhsY = errorY * erp;
- linearRhsZ = errorZ * erp;
- let crossR100;
- let crossR101;
- let crossR102;
- let crossR110;
- let crossR111;
- let crossR112;
- let crossR120;
- let crossR121;
- let crossR122;
- let crossR200;
- let crossR201;
- let crossR202;
- let crossR210;
- let crossR211;
- let crossR212;
- let crossR220;
- let crossR221;
- let crossR222;
- crossR100 = 0;
- crossR101 = -this._relativeAnchor1Z;
- crossR102 = this._relativeAnchor1Y;
- crossR110 = this._relativeAnchor1Z;
- crossR111 = 0;
- crossR112 = -this._relativeAnchor1X;
- crossR120 = -this._relativeAnchor1Y;
- crossR121 = this._relativeAnchor1X;
- crossR122 = 0;
- crossR200 = 0;
- crossR201 = -this._relativeAnchor2Z;
- crossR202 = this._relativeAnchor2Y;
- crossR210 = this._relativeAnchor2Z;
- crossR211 = 0;
- crossR212 = -this._relativeAnchor2X;
- crossR220 = -this._relativeAnchor2Y;
- crossR221 = this._relativeAnchor2X;
- crossR222 = 0;
- crossR100 = -crossR100;
- crossR101 = -crossR101;
- crossR102 = -crossR102;
- crossR110 = -crossR110;
- crossR111 = -crossR111;
- crossR112 = -crossR112;
- crossR120 = -crossR120;
- crossR121 = -crossR121;
- crossR122 = -crossR122;
- crossR200 = -crossR200;
- crossR201 = -crossR201;
- crossR202 = -crossR202;
- crossR210 = -crossR210;
- crossR211 = -crossR211;
- crossR212 = -crossR212;
- crossR220 = -crossR220;
- crossR221 = -crossR221;
- crossR222 = -crossR222;
- let impulse = this._impulses[0];
- let row = info.rows[info.numRows++];
- let _this = row.jacobian;
- _this.lin1X = 0;
- _this.lin1Y = 0;
- _this.lin1Z = 0;
- _this.lin2X = 0;
- _this.lin2Y = 0;
- _this.lin2Z = 0;
- _this.ang1X = 0;
- _this.ang1Y = 0;
- _this.ang1Z = 0;
- _this.ang2X = 0;
- _this.ang2Y = 0;
- _this.ang2Z = 0;
- row.rhs = 0;
- row.cfm = 0;
- row.minImpulse = 0;
- row.maxImpulse = 0;
- row.motorSpeed = 0;
- row.motorMaxImpulse = 0;
- row.impulse = null;
- row.impulse = impulse;
- row.rhs = linearRhsX;
- row.cfm = cfm;
- row.minImpulse = -1e65536;
- row.maxImpulse = 1e65536;
- let j = row.jacobian;
- j.lin1X = 1;
- j.lin1Y = 0;
- j.lin1Z = 0;
- j.lin2X = 1;
- j.lin2Y = 0;
- j.lin2Z = 0;
- j.ang1X = crossR100;
- j.ang1Y = crossR101;
- j.ang1Z = crossR102;
- j.ang2X = crossR200;
- j.ang2Y = crossR201;
- j.ang2Z = crossR202;
- let impulse1 = this._impulses[1];
- let row1 = info.rows[info.numRows++];
- let _this1 = row1.jacobian;
- _this1.lin1X = 0;
- _this1.lin1Y = 0;
- _this1.lin1Z = 0;
- _this1.lin2X = 0;
- _this1.lin2Y = 0;
- _this1.lin2Z = 0;
- _this1.ang1X = 0;
- _this1.ang1Y = 0;
- _this1.ang1Z = 0;
- _this1.ang2X = 0;
- _this1.ang2Y = 0;
- _this1.ang2Z = 0;
- row1.rhs = 0;
- row1.cfm = 0;
- row1.minImpulse = 0;
- row1.maxImpulse = 0;
- row1.motorSpeed = 0;
- row1.motorMaxImpulse = 0;
- row1.impulse = null;
- row1.impulse = impulse1;
- row1.rhs = linearRhsY;
- row1.cfm = cfm;
- row1.minImpulse = -1e65536;
- row1.maxImpulse = 1e65536;
- j = row1.jacobian;
- j.lin1X = 0;
- j.lin1Y = 1;
- j.lin1Z = 0;
- j.lin2X = 0;
- j.lin2Y = 1;
- j.lin2Z = 0;
- j.ang1X = crossR110;
- j.ang1Y = crossR111;
- j.ang1Z = crossR112;
- j.ang2X = crossR210;
- j.ang2Y = crossR211;
- j.ang2Z = crossR212;
- let impulse2 = this._impulses[2];
- let row2 = info.rows[info.numRows++];
- let _this2 = row2.jacobian;
- _this2.lin1X = 0;
- _this2.lin1Y = 0;
- _this2.lin1Z = 0;
- _this2.lin2X = 0;
- _this2.lin2Y = 0;
- _this2.lin2Z = 0;
- _this2.ang1X = 0;
- _this2.ang1Y = 0;
- _this2.ang1Z = 0;
- _this2.ang2X = 0;
- _this2.ang2Y = 0;
- _this2.ang2Z = 0;
- row2.rhs = 0;
- row2.cfm = 0;
- row2.minImpulse = 0;
- row2.maxImpulse = 0;
- row2.motorSpeed = 0;
- row2.motorMaxImpulse = 0;
- row2.impulse = null;
- row2.impulse = impulse2;
- row2.rhs = linearRhsZ;
- row2.cfm = cfm;
- row2.minImpulse = -1e65536;
- row2.maxImpulse = 1e65536;
- j = row2.jacobian;
- j.lin1X = 0;
- j.lin1Y = 0;
- j.lin1Z = 1;
- j.lin2X = 0;
- j.lin2Y = 0;
- j.lin2Z = 1;
- j.ang1X = crossR120;
- j.ang1Y = crossR121;
- j.ang1Z = crossR122;
- j.ang2X = crossR220;
- j.ang2Y = crossR221;
- j.ang2Z = crossR222;
- }
- _getVelocitySolverInfo(timeStep,info) {
- super._getVelocitySolverInfo(timeStep,info);
- this.getInfo(info,timeStep,false);
- }
- _getPositionSolverInfo(info) {
- super._getPositionSolverInfo(info);
- this.getInfo(info,null,true);
- }
- getSpringDamper() {
- return this._sd;
- }
- }
- oimo.dynamics.constraint.joint.SphericalJointConfig = class oimo_dynamics_constraint_joint_SphericalJointConfig extends oimo.dynamics.constraint.joint.JointConfig {
- constructor() {
- super();
- this.springDamper = new oimo.dynamics.constraint.joint.SpringDamper();
- }
- init(rigidBody1,rigidBody2,worldAnchor) {
- this._init(rigidBody1,rigidBody2,worldAnchor);
- return this;
- }
- }
- oimo.dynamics.constraint.joint.SpringDamper = class oimo_dynamics_constraint_joint_SpringDamper {
- constructor() {
- this.frequency = 0;
- this.dampingRatio = 0;
- this.useSymplecticEuler = false;
- }
- setSpring(frequency,dampingRatio) {
- this.frequency = frequency;
- this.dampingRatio = dampingRatio;
- return this;
- }
- setSymplecticEuler(useSymplecticEuler) {
- this.useSymplecticEuler = useSymplecticEuler;
- return this;
- }
- clone() {
- let sd = new oimo.dynamics.constraint.joint.SpringDamper();
- sd.frequency = this.frequency;
- sd.dampingRatio = this.dampingRatio;
- sd.useSymplecticEuler = this.useSymplecticEuler;
- return sd;
- }
- }
- oimo.dynamics.constraint.joint.TranslationalLimitMotor = class oimo_dynamics_constraint_joint_TranslationalLimitMotor {
- constructor() {
- this.lowerLimit = 1;
- this.upperLimit = 0;
- this.motorForce = 0;
- }
- setLimits(lower,upper) {
- this.lowerLimit = lower;
- this.upperLimit = upper;
- return this;
- }
- setMotor(speed,force) {
- this.motorSpeed = speed;
- this.motorForce = force;
- return this;
- }
- clone() {
- let lm = new oimo.dynamics.constraint.joint.TranslationalLimitMotor();
- lm.lowerLimit = this.lowerLimit;
- lm.upperLimit = this.upperLimit;
- lm.motorSpeed = this.motorSpeed;
- lm.motorForce = this.motorForce;
- return lm;
- }
- }
- oimo.dynamics.constraint.joint.UniversalJoint = class oimo_dynamics_constraint_joint_UniversalJoint extends oimo.dynamics.constraint.joint.Joint {
- constructor(config) {
- super(config,oimo.dynamics.constraint.joint.JointType.UNIVERSAL);
- let v = config.localAxis1;
- this._localBasisX1X = v.x;
- this._localBasisX1Y = v.y;
- this._localBasisX1Z = v.z;
- let v1 = config.localAxis2;
- this._localBasisZ2X = v1.x;
- this._localBasisZ2Y = v1.y;
- this._localBasisZ2Z = v1.z;
- this.buildLocalBasesFromX1Z2();
- this._angleX = 0;
- this._angleY = 0;
- this._angleZ = 0;
- this.xSingular = false;
- this.ySingular = false;
- this.zSingular = false;
- this._sd1 = config.springDamper1.clone();
- this._sd2 = config.springDamper2.clone();
- this._lm1 = config.limitMotor1.clone();
- this._lm2 = config.limitMotor2.clone();
- }
- getInfo(info,timeStep,isPositionPart) {
- let erp = this.getErp(timeStep,isPositionPart);
- let linearRhsX;
- let linearRhsY;
- let linearRhsZ;
- linearRhsX = this.linearErrorX * erp;
- linearRhsY = this.linearErrorY * erp;
- linearRhsZ = this.linearErrorZ * erp;
- let angRhsY = this._angleY * erp;
- let crossR100;
- let crossR101;
- let crossR102;
- let crossR110;
- let crossR111;
- let crossR112;
- let crossR120;
- let crossR121;
- let crossR122;
- let crossR200;
- let crossR201;
- let crossR202;
- let crossR210;
- let crossR211;
- let crossR212;
- let crossR220;
- let crossR221;
- let crossR222;
- crossR100 = 0;
- crossR101 = -this._relativeAnchor1Z;
- crossR102 = this._relativeAnchor1Y;
- crossR110 = this._relativeAnchor1Z;
- crossR111 = 0;
- crossR112 = -this._relativeAnchor1X;
- crossR120 = -this._relativeAnchor1Y;
- crossR121 = this._relativeAnchor1X;
- crossR122 = 0;
- crossR200 = 0;
- crossR201 = -this._relativeAnchor2Z;
- crossR202 = this._relativeAnchor2Y;
- crossR210 = this._relativeAnchor2Z;
- crossR211 = 0;
- crossR212 = -this._relativeAnchor2X;
- crossR220 = -this._relativeAnchor2Y;
- crossR221 = this._relativeAnchor2X;
- crossR222 = 0;
- crossR100 = -crossR100;
- crossR101 = -crossR101;
- crossR102 = -crossR102;
- crossR110 = -crossR110;
- crossR111 = -crossR111;
- crossR112 = -crossR112;
- crossR120 = -crossR120;
- crossR121 = -crossR121;
- crossR122 = -crossR122;
- crossR200 = -crossR200;
- crossR201 = -crossR201;
- crossR202 = -crossR202;
- crossR210 = -crossR210;
- crossR211 = -crossR211;
- crossR212 = -crossR212;
- crossR220 = -crossR220;
- crossR221 = -crossR221;
- crossR222 = -crossR222;
- let motorMassX = this.computeEffectiveInertiaMoment(this._axisXX,this._axisXY,this._axisXZ);
- let motorMassZ = this.computeEffectiveInertiaMoment(this._axisZX,this._axisZY,this._axisZZ);
- let impulse = this._impulses[0];
- let row = info.rows[info.numRows++];
- let _this = row.jacobian;
- _this.lin1X = 0;
- _this.lin1Y = 0;
- _this.lin1Z = 0;
- _this.lin2X = 0;
- _this.lin2Y = 0;
- _this.lin2Z = 0;
- _this.ang1X = 0;
- _this.ang1Y = 0;
- _this.ang1Z = 0;
- _this.ang2X = 0;
- _this.ang2Y = 0;
- _this.ang2Z = 0;
- row.rhs = 0;
- row.cfm = 0;
- row.minImpulse = 0;
- row.maxImpulse = 0;
- row.motorSpeed = 0;
- row.motorMaxImpulse = 0;
- row.impulse = null;
- row.impulse = impulse;
- row.rhs = linearRhsX;
- row.cfm = 0;
- row.minImpulse = -1e65536;
- row.maxImpulse = 1e65536;
- let j = row.jacobian;
- j.lin1X = 1;
- j.lin1Y = 0;
- j.lin1Z = 0;
- j.lin2X = 1;
- j.lin2Y = 0;
- j.lin2Z = 0;
- j.ang1X = crossR100;
- j.ang1Y = crossR101;
- j.ang1Z = crossR102;
- j.ang2X = crossR200;
- j.ang2Y = crossR201;
- j.ang2Z = crossR202;
- let impulse1 = this._impulses[1];
- let row1 = info.rows[info.numRows++];
- let _this1 = row1.jacobian;
- _this1.lin1X = 0;
- _this1.lin1Y = 0;
- _this1.lin1Z = 0;
- _this1.lin2X = 0;
- _this1.lin2Y = 0;
- _this1.lin2Z = 0;
- _this1.ang1X = 0;
- _this1.ang1Y = 0;
- _this1.ang1Z = 0;
- _this1.ang2X = 0;
- _this1.ang2Y = 0;
- _this1.ang2Z = 0;
- row1.rhs = 0;
- row1.cfm = 0;
- row1.minImpulse = 0;
- row1.maxImpulse = 0;
- row1.motorSpeed = 0;
- row1.motorMaxImpulse = 0;
- row1.impulse = null;
- row1.impulse = impulse1;
- row1.rhs = linearRhsY;
- row1.cfm = 0;
- row1.minImpulse = -1e65536;
- row1.maxImpulse = 1e65536;
- j = row1.jacobian;
- j.lin1X = 0;
- j.lin1Y = 1;
- j.lin1Z = 0;
- j.lin2X = 0;
- j.lin2Y = 1;
- j.lin2Z = 0;
- j.ang1X = crossR110;
- j.ang1Y = crossR111;
- j.ang1Z = crossR112;
- j.ang2X = crossR210;
- j.ang2Y = crossR211;
- j.ang2Z = crossR212;
- let impulse2 = this._impulses[2];
- let row2 = info.rows[info.numRows++];
- let _this2 = row2.jacobian;
- _this2.lin1X = 0;
- _this2.lin1Y = 0;
- _this2.lin1Z = 0;
- _this2.lin2X = 0;
- _this2.lin2Y = 0;
- _this2.lin2Z = 0;
- _this2.ang1X = 0;
- _this2.ang1Y = 0;
- _this2.ang1Z = 0;
- _this2.ang2X = 0;
- _this2.ang2Y = 0;
- _this2.ang2Z = 0;
- row2.rhs = 0;
- row2.cfm = 0;
- row2.minImpulse = 0;
- row2.maxImpulse = 0;
- row2.motorSpeed = 0;
- row2.motorMaxImpulse = 0;
- row2.impulse = null;
- row2.impulse = impulse2;
- row2.rhs = linearRhsZ;
- row2.cfm = 0;
- row2.minImpulse = -1e65536;
- row2.maxImpulse = 1e65536;
- j = row2.jacobian;
- j.lin1X = 0;
- j.lin1Y = 0;
- j.lin1Z = 1;
- j.lin2X = 0;
- j.lin2Y = 0;
- j.lin2Z = 1;
- j.ang1X = crossR120;
- j.ang1Y = crossR121;
- j.ang1Z = crossR122;
- j.ang2X = crossR220;
- j.ang2Y = crossR221;
- j.ang2Z = crossR222;
- if(!this.xSingular && (this._sd1.frequency <= 0 || !isPositionPart)) {
- let impulse = this._impulses[3];
- let row = info.rows[info.numRows++];
- let _this = row.jacobian;
- _this.lin1X = 0;
- _this.lin1Y = 0;
- _this.lin1Z = 0;
- _this.lin2X = 0;
- _this.lin2Y = 0;
- _this.lin2Z = 0;
- _this.ang1X = 0;
- _this.ang1Y = 0;
- _this.ang1Z = 0;
- _this.ang2X = 0;
- _this.ang2Y = 0;
- _this.ang2Z = 0;
- row.rhs = 0;
- row.cfm = 0;
- row.minImpulse = 0;
- row.maxImpulse = 0;
- row.motorSpeed = 0;
- row.motorMaxImpulse = 0;
- row.impulse = null;
- row.impulse = impulse;
- this.setSolverInfoRowAngular(row,this._angleX,this._lm1,motorMassX,this._sd1,timeStep,isPositionPart);
- j = row.jacobian;
- j.ang1X = this._axisXX;
- j.ang1Y = this._axisXY;
- j.ang1Z = this._axisXZ;
- j.ang2X = this._axisXX;
- j.ang2Y = this._axisXY;
- j.ang2Z = this._axisXZ;
- }
- if(!this.ySingular) {
- let impulse = this._impulses[4];
- let row = info.rows[info.numRows++];
- let _this = row.jacobian;
- _this.lin1X = 0;
- _this.lin1Y = 0;
- _this.lin1Z = 0;
- _this.lin2X = 0;
- _this.lin2Y = 0;
- _this.lin2Z = 0;
- _this.ang1X = 0;
- _this.ang1Y = 0;
- _this.ang1Z = 0;
- _this.ang2X = 0;
- _this.ang2Y = 0;
- _this.ang2Z = 0;
- row.rhs = 0;
- row.cfm = 0;
- row.minImpulse = 0;
- row.maxImpulse = 0;
- row.motorSpeed = 0;
- row.motorMaxImpulse = 0;
- row.impulse = null;
- row.impulse = impulse;
- row.rhs = angRhsY;
- row.cfm = 0;
- row.minImpulse = -1e65536;
- row.maxImpulse = 1e65536;
- j = row.jacobian;
- j.ang1X = this._axisYX;
- j.ang1Y = this._axisYY;
- j.ang1Z = this._axisYZ;
- j.ang2X = this._axisYX;
- j.ang2Y = this._axisYY;
- j.ang2Z = this._axisYZ;
- }
- if(!this.zSingular && (this._sd2.frequency <= 0 || !isPositionPart)) {
- let impulse = this._impulses[5];
- let row = info.rows[info.numRows++];
- let _this = row.jacobian;
- _this.lin1X = 0;
- _this.lin1Y = 0;
- _this.lin1Z = 0;
- _this.lin2X = 0;
- _this.lin2Y = 0;
- _this.lin2Z = 0;
- _this.ang1X = 0;
- _this.ang1Y = 0;
- _this.ang1Z = 0;
- _this.ang2X = 0;
- _this.ang2Y = 0;
- _this.ang2Z = 0;
- row.rhs = 0;
- row.cfm = 0;
- row.minImpulse = 0;
- row.maxImpulse = 0;
- row.motorSpeed = 0;
- row.motorMaxImpulse = 0;
- row.impulse = null;
- row.impulse = impulse;
- this.setSolverInfoRowAngular(row,this._angleZ,this._lm2,motorMassZ,this._sd2,timeStep,isPositionPart);
- j = row.jacobian;
- j.ang1X = this._axisZX;
- j.ang1Y = this._axisZY;
- j.ang1Z = this._axisZZ;
- j.ang2X = this._axisZX;
- j.ang2Y = this._axisZY;
- j.ang2Z = this._axisZZ;
- }
- }
- _syncAnchors() {
- super._syncAnchors();
- let angleAxisXX;
- let angleAxisXY;
- let angleAxisXZ;
- let angleAxisYX;
- let angleAxisYY;
- let angleAxisYZ;
- let angleAxisZX;
- let angleAxisZY;
- let angleAxisZZ;
- angleAxisXX = this._basisX1X;
- angleAxisXY = this._basisX1Y;
- angleAxisXZ = this._basisX1Z;
- angleAxisZX = this._basisZ2X;
- angleAxisZY = this._basisZ2Y;
- angleAxisZZ = this._basisZ2Z;
- angleAxisYX = angleAxisZY * angleAxisXZ - angleAxisZZ * angleAxisXY;
- angleAxisYY = angleAxisZZ * angleAxisXX - angleAxisZX * angleAxisXZ;
- angleAxisYZ = angleAxisZX * angleAxisXY - angleAxisZY * angleAxisXX;
- this._axisXX = angleAxisYY * angleAxisZZ - angleAxisYZ * angleAxisZY;
- this._axisXY = angleAxisYZ * angleAxisZX - angleAxisYX * angleAxisZZ;
- this._axisXZ = angleAxisYX * angleAxisZY - angleAxisYY * angleAxisZX;
- this._axisYX = angleAxisYX;
- this._axisYY = angleAxisYY;
- this._axisYZ = angleAxisYZ;
- this._axisZX = angleAxisXY * angleAxisYZ - angleAxisXZ * angleAxisYY;
- this._axisZY = angleAxisXZ * angleAxisYX - angleAxisXX * angleAxisYZ;
- this._axisZZ = angleAxisXX * angleAxisYY - angleAxisXY * angleAxisYX;
- let l = this._axisXX * this._axisXX + this._axisXY * this._axisXY + this._axisXZ * this._axisXZ;
- if(l > 0) {
- l = 1 / Math.sqrt(l);
- }
- this._axisXX *= l;
- this._axisXY *= l;
- this._axisXZ *= l;
- let l1 = this._axisYX * this._axisYX + this._axisYY * this._axisYY + this._axisYZ * this._axisYZ;
- if(l1 > 0) {
- l1 = 1 / Math.sqrt(l1);
- }
- this._axisYX *= l1;
- this._axisYY *= l1;
- this._axisYZ *= l1;
- let l2 = this._axisZX * this._axisZX + this._axisZY * this._axisZY + this._axisZZ * this._axisZZ;
- if(l2 > 0) {
- l2 = 1 / Math.sqrt(l2);
- }
- this._axisZX *= l2;
- this._axisZY *= l2;
- this._axisZZ *= l2;
- this.xSingular = this._axisXX * this._axisXX + this._axisXY * this._axisXY + this._axisXZ * this._axisXZ == 0;
- this.ySingular = this._axisYX * this._axisYX + this._axisYY * this._axisYY + this._axisYZ * this._axisYZ == 0;
- this.zSingular = this._axisZX * this._axisZX + this._axisZY * this._axisZY + this._axisZZ * this._axisZZ == 0;
- let rot100;
- let rot101;
- let rot102;
- let rot110;
- let rot111;
- let rot112;
- let rot120;
- let rot121;
- let rot122;
- let rot200;
- let rot201;
- let rot202;
- let rot210;
- let rot211;
- let rot212;
- let rot220;
- let rot221;
- let rot222;
- rot100 = this._basisX1X;
- rot101 = this._basisY1X;
- rot102 = this._basisZ1X;
- rot110 = this._basisX1Y;
- rot111 = this._basisY1Y;
- rot112 = this._basisZ1Y;
- rot120 = this._basisX1Z;
- rot121 = this._basisY1Z;
- rot122 = this._basisZ1Z;
- rot200 = this._basisX2X;
- rot201 = this._basisY2X;
- rot202 = this._basisZ2X;
- rot210 = this._basisX2Y;
- rot211 = this._basisY2Y;
- rot212 = this._basisZ2Y;
- rot220 = this._basisX2Z;
- rot221 = this._basisY2Z;
- rot222 = this._basisZ2Z;
- let relRot00;
- let relRot01;
- let relRot02;
- let relRot11;
- let relRot12;
- let relRot21;
- let relRot22;
- let __tmp__00;
- let __tmp__01;
- let __tmp__02;
- let __tmp__11;
- let __tmp__12;
- let __tmp__21;
- let __tmp__22;
- __tmp__00 = rot100 * rot200 + rot110 * rot210 + rot120 * rot220;
- __tmp__01 = rot100 * rot201 + rot110 * rot211 + rot120 * rot221;
- __tmp__02 = rot100 * rot202 + rot110 * rot212 + rot120 * rot222;
- __tmp__11 = rot101 * rot201 + rot111 * rot211 + rot121 * rot221;
- __tmp__12 = rot101 * rot202 + rot111 * rot212 + rot121 * rot222;
- __tmp__21 = rot102 * rot201 + rot112 * rot211 + rot122 * rot221;
- __tmp__22 = rot102 * rot202 + rot112 * rot212 + rot122 * rot222;
- relRot00 = __tmp__00;
- relRot01 = __tmp__01;
- relRot02 = __tmp__02;
- relRot11 = __tmp__11;
- relRot12 = __tmp__12;
- relRot21 = __tmp__21;
- relRot22 = __tmp__22;
- let anglesX;
- let anglesY;
- let anglesZ;
- let sy = relRot02;
- if(sy <= -1) {
- let xSubZ = Math.atan2(relRot21,relRot11);
- anglesX = xSubZ * 0.5;
- anglesY = -1.570796326794895;
- anglesZ = -xSubZ * 0.5;
- } else if(sy >= 1) {
- let xAddZ = Math.atan2(relRot21,relRot11);
- anglesX = xAddZ * 0.5;
- anglesY = 1.570796326794895;
- anglesZ = xAddZ * 0.5;
- } else {
- anglesX = Math.atan2(-relRot12,relRot22);
- anglesY = Math.asin(sy);
- anglesZ = Math.atan2(-relRot01,relRot00);
- }
- this._angleX = anglesX;
- this._angleY = anglesY;
- this._angleZ = anglesZ;
- this.linearErrorX = this._anchor2X - this._anchor1X;
- this.linearErrorY = this._anchor2Y - this._anchor1Y;
- this.linearErrorZ = this._anchor2Z - this._anchor1Z;
- }
- _getVelocitySolverInfo(timeStep,info) {
- super._getVelocitySolverInfo(timeStep,info);
- this.getInfo(info,timeStep,false);
- }
- _getPositionSolverInfo(info) {
- super._getPositionSolverInfo(info);
- this.getInfo(info,null,true);
- }
- getAxis1() {
- let v = new oimo.common.Vec3();
- v.x = this._basisX1X;
- v.y = this._basisX1Y;
- v.z = this._basisX1Z;
- return v;
- }
- getAxis2() {
- let v = new oimo.common.Vec3();
- v.x = this._basisZ2X;
- v.y = this._basisZ2Y;
- v.z = this._basisZ2Z;
- return v;
- }
- getAxis1To(axis) {
- axis.x = this._basisX1X;
- axis.y = this._basisX1Y;
- axis.z = this._basisX1Z;
- }
- getAxis2To(axis) {
- axis.x = this._basisZ2X;
- axis.y = this._basisZ2Y;
- axis.z = this._basisZ2Z;
- }
- getLocalAxis1() {
- let v = new oimo.common.Vec3();
- v.x = this._localBasisX1X;
- v.y = this._localBasisX1Y;
- v.z = this._localBasisX1Z;
- return v;
- }
- getLocalAxis2() {
- let v = new oimo.common.Vec3();
- v.x = this._localBasisZ2X;
- v.y = this._localBasisZ2Y;
- v.z = this._localBasisZ2Z;
- return v;
- }
- getLocalAxis1To(axis) {
- axis.x = this._localBasisX1X;
- axis.y = this._localBasisX1Y;
- axis.z = this._localBasisX1Z;
- }
- getLocalAxis2To(axis) {
- axis.x = this._localBasisZ2X;
- axis.y = this._localBasisZ2Y;
- axis.z = this._localBasisZ2Z;
- }
- getSpringDamper1() {
- return this._sd1;
- }
- getSpringDamper2() {
- return this._sd2;
- }
- getLimitMotor1() {
- return this._lm1;
- }
- getLimitMotor2() {
- return this._lm2;
- }
- getAngle1() {
- return this._angleX;
- }
- getAngle2() {
- return this._angleZ;
- }
- }
- oimo.dynamics.constraint.joint.UniversalJointConfig = class oimo_dynamics_constraint_joint_UniversalJointConfig extends oimo.dynamics.constraint.joint.JointConfig {
- constructor() {
- super();
- this.localAxis1 = new oimo.common.Vec3(1,0,0);
- this.localAxis2 = new oimo.common.Vec3(1,0,0);
- this.springDamper1 = new oimo.dynamics.constraint.joint.SpringDamper();
- this.springDamper2 = new oimo.dynamics.constraint.joint.SpringDamper();
- this.limitMotor1 = new oimo.dynamics.constraint.joint.RotationalLimitMotor();
- this.limitMotor2 = new oimo.dynamics.constraint.joint.RotationalLimitMotor();
- }
- init(rigidBody1,rigidBody2,worldAnchor,worldAxis1,worldAxis2) {
- this._init(rigidBody1,rigidBody2,worldAnchor);
- let localVector = this.localAxis1;
- let vX;
- let vY;
- let vZ;
- vX = worldAxis1.x;
- vY = worldAxis1.y;
- vZ = worldAxis1.z;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = rigidBody1._transform._rotation00 * vX + rigidBody1._transform._rotation10 * vY + rigidBody1._transform._rotation20 * vZ;
- __tmp__Y = rigidBody1._transform._rotation01 * vX + rigidBody1._transform._rotation11 * vY + rigidBody1._transform._rotation21 * vZ;
- __tmp__Z = rigidBody1._transform._rotation02 * vX + rigidBody1._transform._rotation12 * vY + rigidBody1._transform._rotation22 * vZ;
- vX = __tmp__X;
- vY = __tmp__Y;
- vZ = __tmp__Z;
- localVector.x = vX;
- localVector.y = vY;
- localVector.z = vZ;
- let localVector1 = this.localAxis2;
- let vX1;
- let vY1;
- let vZ1;
- vX1 = worldAxis2.x;
- vY1 = worldAxis2.y;
- vZ1 = worldAxis2.z;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = rigidBody2._transform._rotation00 * vX1 + rigidBody2._transform._rotation10 * vY1 + rigidBody2._transform._rotation20 * vZ1;
- __tmp__Y1 = rigidBody2._transform._rotation01 * vX1 + rigidBody2._transform._rotation11 * vY1 + rigidBody2._transform._rotation21 * vZ1;
- __tmp__Z1 = rigidBody2._transform._rotation02 * vX1 + rigidBody2._transform._rotation12 * vY1 + rigidBody2._transform._rotation22 * vZ1;
- vX1 = __tmp__X1;
- vY1 = __tmp__Y1;
- vZ1 = __tmp__Z1;
- localVector1.x = vX1;
- localVector1.y = vY1;
- localVector1.z = vZ1;
- return this;
- }
- }
- if(!oimo.dynamics.constraint.solver) oimo.dynamics.constraint.solver = {};
- oimo.dynamics.constraint.solver.ConstraintSolverType = class oimo_dynamics_constraint_solver_ConstraintSolverType {
- }
- if(!oimo.dynamics.constraint.solver.common) oimo.dynamics.constraint.solver.common = {};
- oimo.dynamics.constraint.solver.common.ContactSolverMassDataRow = class oimo_dynamics_constraint_solver_common_ContactSolverMassDataRow {
- constructor() {
- this.invMLinN1X = 0;
- this.invMLinN1Y = 0;
- this.invMLinN1Z = 0;
- this.invMLinN2X = 0;
- this.invMLinN2Y = 0;
- this.invMLinN2Z = 0;
- this.invMAngN1X = 0;
- this.invMAngN1Y = 0;
- this.invMAngN1Z = 0;
- this.invMAngN2X = 0;
- this.invMAngN2Y = 0;
- this.invMAngN2Z = 0;
- this.invMLinT1X = 0;
- this.invMLinT1Y = 0;
- this.invMLinT1Z = 0;
- this.invMLinT2X = 0;
- this.invMLinT2Y = 0;
- this.invMLinT2Z = 0;
- this.invMAngT1X = 0;
- this.invMAngT1Y = 0;
- this.invMAngT1Z = 0;
- this.invMAngT2X = 0;
- this.invMAngT2Y = 0;
- this.invMAngT2Z = 0;
- this.invMLinB1X = 0;
- this.invMLinB1Y = 0;
- this.invMLinB1Z = 0;
- this.invMLinB2X = 0;
- this.invMLinB2Y = 0;
- this.invMLinB2Z = 0;
- this.invMAngB1X = 0;
- this.invMAngB1Y = 0;
- this.invMAngB1Z = 0;
- this.invMAngB2X = 0;
- this.invMAngB2Y = 0;
- this.invMAngB2Z = 0;
- this.massN = 0;
- this.massTB00 = 0;
- this.massTB01 = 0;
- this.massTB10 = 0;
- this.massTB11 = 0;
- }
- }
- oimo.dynamics.constraint.solver.common.JointSolverMassDataRow = class oimo_dynamics_constraint_solver_common_JointSolverMassDataRow {
- constructor() {
- this.invMLin1X = 0;
- this.invMLin1Y = 0;
- this.invMLin1Z = 0;
- this.invMLin2X = 0;
- this.invMLin2Y = 0;
- this.invMLin2Z = 0;
- this.invMAng1X = 0;
- this.invMAng1Y = 0;
- this.invMAng1Z = 0;
- this.invMAng2X = 0;
- this.invMAng2Y = 0;
- this.invMAng2Z = 0;
- this.mass = 0;
- this.massWithoutCfm = 0;
- }
- }
- if(!oimo.dynamics.constraint.solver.direct) oimo.dynamics.constraint.solver.direct = {};
- oimo.dynamics.constraint.solver.direct.Boundary = class oimo_dynamics_constraint_solver_direct_Boundary {
- constructor(maxRows) {
- this.iBounded = new Array(maxRows);
- this.iUnbounded = new Array(maxRows);
- this.signs = new Array(maxRows);
- this.b = new Array(maxRows);
- this.numBounded = 0;
- this.numUnbounded = 0;
- this.matrixId = 0;
- }
- init(buildInfo) {
- this.numBounded = buildInfo.numBounded;
- let _g = 0;
- let _g1 = this.numBounded;
- while(_g < _g1) {
- let i = _g++;
- this.iBounded[i] = buildInfo.iBounded[i];
- this.signs[i] = buildInfo.signs[i];
- }
- this.numUnbounded = buildInfo.numUnbounded;
- this.matrixId = 0;
- let _g2 = 0;
- let _g3 = this.numUnbounded;
- while(_g2 < _g3) {
- let i = _g2++;
- let idx = buildInfo.iUnbounded[i];
- this.iUnbounded[i] = idx;
- this.matrixId |= 1 << idx;
- }
- }
- computeImpulses(info,mass,relVels,impulses,dImpulses,impulseFactor,noCheck) {
- let _g = 0;
- let _g1 = this.numUnbounded;
- while(_g < _g1) {
- let idx = this.iUnbounded[_g++];
- let row = info.rows[idx];
- this.b[idx] = row.rhs * impulseFactor - relVels[idx] - row.cfm * impulses[idx];
- }
- let invMassWithoutCfm = mass._invMassWithoutCfm;
- let _g2 = 0;
- let _g3 = this.numBounded;
- while(_g2 < _g3) {
- let i = _g2++;
- let idx = this.iBounded[i];
- let sign = this.signs[i];
- let row = info.rows[idx];
- let dImpulse = (sign < 0 ? row.minImpulse : sign > 0 ? row.maxImpulse : 0) - impulses[idx];
- dImpulses[idx] = dImpulse;
- if(dImpulse != 0) {
- let _g = 0;
- let _g1 = this.numUnbounded;
- while(_g < _g1) {
- let idx2 = this.iUnbounded[_g++];
- this.b[idx2] -= invMassWithoutCfm[idx][idx2] * dImpulse;
- }
- }
- }
- let indices = this.iUnbounded;
- let n = this.numUnbounded;
- let id = 0;
- let _g4 = 0;
- while(_g4 < n) id |= 1 << indices[_g4++];
- let massMatrix;
- if(mass._cacheComputed[id]) {
- massMatrix = mass._cachedSubmatrices[id];
- } else {
- mass.computeSubmatrix(id,indices,n);
- mass._cacheComputed[id] = true;
- massMatrix = mass._cachedSubmatrices[id];
- }
- let ok = true;
- let _g5 = 0;
- let _g6 = this.numUnbounded;
- while(_g5 < _g6) {
- let i = _g5++;
- let idx = this.iUnbounded[i];
- let row = info.rows[idx];
- let oldImpulse = impulses[idx];
- let impulse = oldImpulse;
- let _g = 0;
- let _g1 = this.numUnbounded;
- while(_g < _g1) {
- let j = _g++;
- impulse += this.b[this.iUnbounded[j]] * massMatrix[i][j];
- }
- if(impulse < row.minImpulse - oimo.common.Setting.directMlcpSolverEps || impulse > row.maxImpulse + oimo.common.Setting.directMlcpSolverEps) {
- ok = false;
- break;
- }
- dImpulses[idx] = impulse - oldImpulse;
- }
- if(noCheck) {
- return true;
- }
- if(!ok) {
- return false;
- }
- let _g7 = 0;
- let _g8 = this.numBounded;
- while(_g7 < _g8) {
- let i = _g7++;
- let idx = this.iBounded[i];
- let row = info.rows[idx];
- let sign = this.signs[i];
- let error = 0;
- let newImpulse = impulses[idx] + dImpulses[idx];
- let relVel = relVels[idx];
- let _g = 0;
- let _g1 = info.numRows;
- while(_g < _g1) {
- let j = _g++;
- relVel += invMassWithoutCfm[idx][j] * dImpulses[j];
- }
- error = row.rhs * impulseFactor - relVel - row.cfm * newImpulse;
- if(sign < 0 && error > oimo.common.Setting.directMlcpSolverEps || sign > 0 && error < -oimo.common.Setting.directMlcpSolverEps) {
- ok = false;
- break;
- }
- }
- return ok;
- }
- }
- oimo.dynamics.constraint.solver.direct.BoundaryBuildInfo = class oimo_dynamics_constraint_solver_direct_BoundaryBuildInfo {
- constructor(size) {
- this.size = size;
- this.numBounded = 0;
- this.iBounded = new Array(size);
- this.signs = new Array(size);
- this.numUnbounded = 0;
- this.iUnbounded = new Array(size);
- }
- }
- oimo.dynamics.constraint.solver.direct.BoundaryBuilder = class oimo_dynamics_constraint_solver_direct_BoundaryBuilder {
- constructor(maxRows) {
- this.maxRows = maxRows;
- this.numBoundaries = 0;
- this.boundaries = new Array(1 << maxRows);
- this.bbInfo = new oimo.dynamics.constraint.solver.direct.BoundaryBuildInfo(maxRows);
- }
- buildBoundariesRecursive(info,i) {
- if(i == info.numRows) {
- if(this.boundaries[this.numBoundaries] == null) {
- this.boundaries[this.numBoundaries] = new oimo.dynamics.constraint.solver.direct.Boundary(this.maxRows);
- }
- this.boundaries[this.numBoundaries++].init(this.bbInfo);
- return;
- }
- let row = info.rows[i];
- let lowerLimitEnabled = row.minImpulse > -1e65536;
- let upperLimitEnabled = row.maxImpulse < 1e65536;
- if(row.minImpulse == 0 && row.maxImpulse == 0) {
- let _this = this.bbInfo;
- _this.iBounded[_this.numBounded] = i;
- _this.signs[_this.numBounded] = 0;
- _this.numBounded++;
- this.buildBoundariesRecursive(info,i + 1);
- this.bbInfo.numBounded--;
- return;
- }
- let _this = this.bbInfo;
- _this.iUnbounded[_this.numUnbounded] = i;
- _this.numUnbounded++;
- this.buildBoundariesRecursive(info,i + 1);
- this.bbInfo.numUnbounded--;
- if(lowerLimitEnabled) {
- let _this = this.bbInfo;
- _this.iBounded[_this.numBounded] = i;
- _this.signs[_this.numBounded] = -1;
- _this.numBounded++;
- this.buildBoundariesRecursive(info,i + 1);
- this.bbInfo.numBounded--;
- }
- if(upperLimitEnabled) {
- let _this = this.bbInfo;
- _this.iBounded[_this.numBounded] = i;
- _this.signs[_this.numBounded] = 1;
- _this.numBounded++;
- this.buildBoundariesRecursive(info,i + 1);
- this.bbInfo.numBounded--;
- }
- }
- buildBoundaries(info) {
- this.numBoundaries = 0;
- let _this = this.bbInfo;
- _this.numBounded = 0;
- _this.numUnbounded = 0;
- this.buildBoundariesRecursive(info,0);
- }
- }
- oimo.dynamics.constraint.solver.direct.BoundarySelector = class oimo_dynamics_constraint_solver_direct_BoundarySelector {
- constructor(n) {
- this.n = n;
- this.indices = new Array(n);
- this.tmpIndices = new Array(n);
- let _g = 0;
- while(_g < n) {
- let i = _g++;
- this.indices[i] = i;
- }
- }
- getIndex(i) {
- return this.indices[i];
- }
- select(index) {
- let i = 0;
- while(this.indices[i] != index) ++i;
- while(i > 0) {
- let tmp = this.indices[i];
- this.indices[i] = this.indices[i - 1];
- this.indices[i - 1] = tmp;
- --i;
- }
- }
- setSize(size) {
- let numSmaller = 0;
- let numGreater = 0;
- let _g = 0;
- let _g1 = this.n;
- while(_g < _g1) {
- let idx = this.indices[_g++];
- if(idx < size) {
- this.tmpIndices[numSmaller] = idx;
- ++numSmaller;
- } else {
- this.tmpIndices[size + numGreater] = idx;
- ++numGreater;
- }
- }
- let tmp = this.indices;
- this.indices = this.tmpIndices;
- this.tmpIndices = tmp;
- }
- }
- oimo.dynamics.constraint.solver.direct.DirectJointConstraintSolver = class oimo_dynamics_constraint_solver_direct_DirectJointConstraintSolver extends oimo.dynamics.constraint.ConstraintSolver {
- constructor(joint) {
- super();
- this.joint = joint;
- this.info = new oimo.dynamics.constraint.info.joint.JointSolverInfo();
- let maxRows = oimo.common.Setting.maxJacobianRows;
- this.massMatrix = new oimo.dynamics.constraint.solver.direct.MassMatrix(maxRows);
- this.boundaryBuilder = new oimo.dynamics.constraint.solver.direct.BoundaryBuilder(maxRows);
- this.massData = new Array(maxRows);
- let _g = 0;
- let _g1 = this.massData.length;
- while(_g < _g1) this.massData[_g++] = new oimo.dynamics.constraint.solver.common.JointSolverMassDataRow();
- let numMaxBoundaries = this.boundaryBuilder.boundaries.length;
- this.velBoundarySelector = new oimo.dynamics.constraint.solver.direct.BoundarySelector(numMaxBoundaries);
- this.posBoundarySelector = new oimo.dynamics.constraint.solver.direct.BoundarySelector(numMaxBoundaries);
- this.relVels = new Array(maxRows);
- this.impulses = new Array(maxRows);
- this.dImpulses = new Array(maxRows);
- this.dTotalImpulses = new Array(maxRows);
- let _g2 = 0;
- while(_g2 < maxRows) {
- let i = _g2++;
- this.relVels[i] = 0;
- this.impulses[i] = 0;
- this.dImpulses[i] = 0;
- this.dTotalImpulses[i] = 0;
- }
- }
- preSolveVelocity(timeStep) {
- this.joint._syncAnchors();
- this.joint._getVelocitySolverInfo(timeStep,this.info);
- this._b1 = this.info.b1;
- this._b2 = this.info.b2;
- this.massMatrix.computeInvMass(this.info,this.massData);
- let _this = this.boundaryBuilder;
- _this.numBoundaries = 0;
- let _this1 = _this.bbInfo;
- _this1.numBounded = 0;
- _this1.numUnbounded = 0;
- _this.buildBoundariesRecursive(this.info,0);
- let _this2 = this.velBoundarySelector;
- let size = this.boundaryBuilder.numBoundaries;
- let numSmaller = 0;
- let numGreater = 0;
- let _g = 0;
- let _g1 = _this2.n;
- while(_g < _g1) {
- let idx = _this2.indices[_g++];
- if(idx < size) {
- _this2.tmpIndices[numSmaller] = idx;
- ++numSmaller;
- } else {
- _this2.tmpIndices[size + numGreater] = idx;
- ++numGreater;
- }
- }
- let tmp = _this2.indices;
- _this2.indices = _this2.tmpIndices;
- _this2.tmpIndices = tmp;
- }
- warmStart(timeStep) {
- let factor = this.joint._positionCorrectionAlgorithm == oimo.dynamics.constraint.PositionCorrectionAlgorithm.BAUMGARTE ? oimo.common.Setting.jointWarmStartingFactorForBaungarte : oimo.common.Setting.jointWarmStartingFactor;
- factor *= timeStep.dtRatio;
- if(factor <= 0) {
- let _g = 0;
- let _g1 = this.info.numRows;
- while(_g < _g1) {
- let _this = this.info.rows[_g++].impulse;
- _this.impulse = 0;
- _this.impulseM = 0;
- _this.impulseP = 0;
- }
- return;
- }
- let _g = 0;
- let _g1 = this.info.numRows;
- while(_g < _g1) {
- let i = _g++;
- let row = this.info.rows[i];
- let imp = row.impulse;
- let impulse = imp.impulse * factor;
- if(impulse < row.minImpulse) {
- impulse = row.minImpulse;
- } else if(impulse > row.maxImpulse) {
- impulse = row.maxImpulse;
- }
- imp.impulse = impulse;
- if(row.motorMaxImpulse > 0) {
- let impulseM = imp.impulseM * factor;
- let max = row.motorMaxImpulse;
- if(impulseM < -max) {
- impulseM = -max;
- } else if(impulseM > max) {
- impulseM = max;
- }
- imp.impulseM = impulseM;
- } else {
- imp.impulseM = 0;
- }
- this.dImpulses[i] = imp.impulse + imp.impulseM;
- }
- let impulses = this.dImpulses;
- let linearSet = false;
- let angularSet = false;
- let lv1X;
- let lv1Y;
- let lv1Z;
- let lv2X;
- let lv2Y;
- let lv2Z;
- let av1X;
- let av1Y;
- let av1Z;
- let av2X;
- let av2Y;
- let av2Z;
- lv1X = this._b1._velX;
- lv1Y = this._b1._velY;
- lv1Z = this._b1._velZ;
- lv2X = this._b2._velX;
- lv2Y = this._b2._velY;
- lv2Z = this._b2._velZ;
- av1X = this._b1._angVelX;
- av1Y = this._b1._angVelY;
- av1Z = this._b1._angVelZ;
- av2X = this._b2._angVelX;
- av2Y = this._b2._angVelY;
- av2Z = this._b2._angVelZ;
- let _g2 = 0;
- let _g3 = this.info.numRows;
- while(_g2 < _g3) {
- let i = _g2++;
- let j = this.info.rows[i].jacobian;
- let md = this.massData[i];
- let imp = impulses[i];
- if((j.flag & 1) != 0) {
- lv1X += md.invMLin1X * imp;
- lv1Y += md.invMLin1Y * imp;
- lv1Z += md.invMLin1Z * imp;
- lv2X += md.invMLin2X * -imp;
- lv2Y += md.invMLin2Y * -imp;
- lv2Z += md.invMLin2Z * -imp;
- linearSet = true;
- }
- if((j.flag & 2) != 0) {
- av1X += md.invMAng1X * imp;
- av1Y += md.invMAng1Y * imp;
- av1Z += md.invMAng1Z * imp;
- av2X += md.invMAng2X * -imp;
- av2Y += md.invMAng2Y * -imp;
- av2Z += md.invMAng2Z * -imp;
- angularSet = true;
- }
- }
- if(linearSet) {
- this._b1._velX = lv1X;
- this._b1._velY = lv1Y;
- this._b1._velZ = lv1Z;
- this._b2._velX = lv2X;
- this._b2._velY = lv2Y;
- this._b2._velZ = lv2Z;
- }
- if(angularSet) {
- this._b1._angVelX = av1X;
- this._b1._angVelY = av1Y;
- this._b1._angVelZ = av1Z;
- this._b2._angVelX = av2X;
- this._b2._angVelY = av2Y;
- this._b2._angVelZ = av2Z;
- }
- }
- solveVelocity() {
- let numRows = this.info.numRows;
- let lv1X;
- let lv1Y;
- let lv1Z;
- let lv2X;
- let lv2Y;
- let lv2Z;
- let av1X;
- let av1Y;
- let av1Z;
- let av2X;
- let av2Y;
- let av2Z;
- lv1X = this._b1._velX;
- lv1Y = this._b1._velY;
- lv1Z = this._b1._velZ;
- lv2X = this._b2._velX;
- lv2Y = this._b2._velY;
- lv2Z = this._b2._velZ;
- av1X = this._b1._angVelX;
- av1Y = this._b1._angVelY;
- av1Z = this._b1._angVelZ;
- av2X = this._b2._angVelX;
- av2Y = this._b2._angVelY;
- av2Z = this._b2._angVelZ;
- let _g = 0;
- while(_g < numRows) {
- let i = _g++;
- let row = this.info.rows[i];
- let j = row.jacobian;
- let relVel = 0;
- relVel += lv1X * j.lin1X + lv1Y * j.lin1Y + lv1Z * j.lin1Z;
- relVel -= lv2X * j.lin2X + lv2Y * j.lin2Y + lv2Z * j.lin2Z;
- relVel += av1X * j.ang1X + av1Y * j.ang1Y + av1Z * j.ang1Z;
- relVel -= av2X * j.ang2X + av2Y * j.ang2Y + av2Z * j.ang2Z;
- this.relVels[i] = relVel;
- this.impulses[i] = row.impulse.impulse;
- this.dTotalImpulses[i] = 0;
- }
- let invMass = this.massMatrix._invMassWithoutCfm;
- let _g1 = 0;
- while(_g1 < numRows) {
- let i = _g1++;
- let row = this.info.rows[i];
- let imp = row.impulse;
- if(row.motorMaxImpulse > 0) {
- let oldImpulseM = imp.impulseM;
- let impulseM = oldImpulseM + this.massData[i].massWithoutCfm * (-row.motorSpeed - this.relVels[i]);
- let maxImpulseM = row.motorMaxImpulse;
- if(impulseM < -maxImpulseM) {
- impulseM = -maxImpulseM;
- } else if(impulseM > maxImpulseM) {
- impulseM = maxImpulseM;
- }
- imp.impulseM = impulseM;
- let dImpulseM = impulseM - oldImpulseM;
- this.dTotalImpulses[i] = dImpulseM;
- let _g = 0;
- while(_g < numRows) {
- let j = _g++;
- this.relVels[j] += dImpulseM * invMass[i][j];
- }
- }
- }
- let solved = false;
- let _g2 = 0;
- let _g3 = this.boundaryBuilder.numBoundaries;
- while(_g2 < _g3) {
- let idx = this.velBoundarySelector.indices[_g2++];
- if(this.boundaryBuilder.boundaries[idx].computeImpulses(this.info,this.massMatrix,this.relVels,this.impulses,this.dImpulses,1,false)) {
- let _g = 0;
- while(_g < numRows) {
- let j = _g++;
- let dimp = this.dImpulses[j];
- this.info.rows[j].impulse.impulse += dimp;
- this.dTotalImpulses[j] += dimp;
- }
- let impulses = this.dTotalImpulses;
- let linearSet = false;
- let angularSet = false;
- let lv1X;
- let lv1Y;
- let lv1Z;
- let lv2X;
- let lv2Y;
- let lv2Z;
- let av1X;
- let av1Y;
- let av1Z;
- let av2X;
- let av2Y;
- let av2Z;
- lv1X = this._b1._velX;
- lv1Y = this._b1._velY;
- lv1Z = this._b1._velZ;
- lv2X = this._b2._velX;
- lv2Y = this._b2._velY;
- lv2Z = this._b2._velZ;
- av1X = this._b1._angVelX;
- av1Y = this._b1._angVelY;
- av1Z = this._b1._angVelZ;
- av2X = this._b2._angVelX;
- av2Y = this._b2._angVelY;
- av2Z = this._b2._angVelZ;
- let _g1 = 0;
- let _g2 = this.info.numRows;
- while(_g1 < _g2) {
- let i = _g1++;
- let j = this.info.rows[i].jacobian;
- let md = this.massData[i];
- let imp = impulses[i];
- if((j.flag & 1) != 0) {
- lv1X += md.invMLin1X * imp;
- lv1Y += md.invMLin1Y * imp;
- lv1Z += md.invMLin1Z * imp;
- lv2X += md.invMLin2X * -imp;
- lv2Y += md.invMLin2Y * -imp;
- lv2Z += md.invMLin2Z * -imp;
- linearSet = true;
- }
- if((j.flag & 2) != 0) {
- av1X += md.invMAng1X * imp;
- av1Y += md.invMAng1Y * imp;
- av1Z += md.invMAng1Z * imp;
- av2X += md.invMAng2X * -imp;
- av2Y += md.invMAng2Y * -imp;
- av2Z += md.invMAng2Z * -imp;
- angularSet = true;
- }
- }
- if(linearSet) {
- this._b1._velX = lv1X;
- this._b1._velY = lv1Y;
- this._b1._velZ = lv1Z;
- this._b2._velX = lv2X;
- this._b2._velY = lv2Y;
- this._b2._velZ = lv2Z;
- }
- if(angularSet) {
- this._b1._angVelX = av1X;
- this._b1._angVelY = av1Y;
- this._b1._angVelZ = av1Z;
- this._b2._angVelX = av2X;
- this._b2._angVelY = av2Y;
- this._b2._angVelZ = av2Z;
- }
- let _this = this.velBoundarySelector;
- let i = 0;
- while(_this.indices[i] != idx) ++i;
- while(i > 0) {
- let tmp = _this.indices[i];
- _this.indices[i] = _this.indices[i - 1];
- _this.indices[i - 1] = tmp;
- --i;
- }
- solved = true;
- break;
- }
- }
- if(!solved) {
- console.log("src/oimo/dynamics/constraint/solver/direct/DirectJointConstraintSolver.hx:335:","could not find solution. (velocity)");
- return;
- }
- }
- postSolveVelocity(timeStep) {
- let linX;
- let linY;
- let linZ;
- let angX;
- let angY;
- let angZ;
- linX = 0;
- linY = 0;
- linZ = 0;
- angX = 0;
- angY = 0;
- angZ = 0;
- let _g = 0;
- let _g1 = this.info.numRows;
- while(_g < _g1) {
- let row = this.info.rows[_g++];
- let imp = row.impulse;
- let j = row.jacobian;
- if((j.flag & 1) != 0) {
- linX += j.lin1X * imp.impulse;
- linY += j.lin1Y * imp.impulse;
- linZ += j.lin1Z * imp.impulse;
- } else if((j.flag & 2) != 0) {
- angX += j.ang1X * imp.impulse;
- angY += j.ang1Y * imp.impulse;
- angZ += j.ang1Z * imp.impulse;
- }
- }
- this.joint._appliedForceX = linX * timeStep.invDt;
- this.joint._appliedForceY = linY * timeStep.invDt;
- this.joint._appliedForceZ = linZ * timeStep.invDt;
- this.joint._appliedTorqueX = angX * timeStep.invDt;
- this.joint._appliedTorqueY = angY * timeStep.invDt;
- this.joint._appliedTorqueZ = angZ * timeStep.invDt;
- }
- preSolvePosition(timeStep) {
- this.joint._syncAnchors();
- this.joint._getPositionSolverInfo(this.info);
- this._b1 = this.info.b1;
- this._b2 = this.info.b2;
- this.massMatrix.computeInvMass(this.info,this.massData);
- let _this = this.boundaryBuilder;
- _this.numBoundaries = 0;
- let _this1 = _this.bbInfo;
- _this1.numBounded = 0;
- _this1.numUnbounded = 0;
- _this.buildBoundariesRecursive(this.info,0);
- let _this2 = this.posBoundarySelector;
- let size = this.boundaryBuilder.numBoundaries;
- let numSmaller = 0;
- let numGreater = 0;
- let _g = 0;
- let _g1 = _this2.n;
- while(_g < _g1) {
- let idx = _this2.indices[_g++];
- if(idx < size) {
- _this2.tmpIndices[numSmaller] = idx;
- ++numSmaller;
- } else {
- _this2.tmpIndices[size + numGreater] = idx;
- ++numGreater;
- }
- }
- let tmp = _this2.indices;
- _this2.indices = _this2.tmpIndices;
- _this2.tmpIndices = tmp;
- let _g2 = 0;
- let _g3 = this.info.numRows;
- while(_g2 < _g3) this.info.rows[_g2++].impulse.impulseP = 0;
- }
- solvePositionSplitImpulse() {
- let numRows = this.info.numRows;
- let lv1X;
- let lv1Y;
- let lv1Z;
- let lv2X;
- let lv2Y;
- let lv2Z;
- let av1X;
- let av1Y;
- let av1Z;
- let av2X;
- let av2Y;
- let av2Z;
- lv1X = this._b1._pseudoVelX;
- lv1Y = this._b1._pseudoVelY;
- lv1Z = this._b1._pseudoVelZ;
- lv2X = this._b2._pseudoVelX;
- lv2Y = this._b2._pseudoVelY;
- lv2Z = this._b2._pseudoVelZ;
- av1X = this._b1._angPseudoVelX;
- av1Y = this._b1._angPseudoVelY;
- av1Z = this._b1._angPseudoVelZ;
- av2X = this._b2._angPseudoVelX;
- av2Y = this._b2._angPseudoVelY;
- av2Z = this._b2._angPseudoVelZ;
- let _g = 0;
- while(_g < numRows) {
- let i = _g++;
- let row = this.info.rows[i];
- let j = row.jacobian;
- let relVel = 0;
- relVel += lv1X * j.lin1X + lv1Y * j.lin1Y + lv1Z * j.lin1Z;
- relVel -= lv2X * j.lin2X + lv2Y * j.lin2Y + lv2Z * j.lin2Z;
- relVel += av1X * j.ang1X + av1Y * j.ang1Y + av1Z * j.ang1Z;
- relVel -= av2X * j.ang2X + av2Y * j.ang2Y + av2Z * j.ang2Z;
- this.relVels[i] = relVel;
- this.impulses[i] = row.impulse.impulseP;
- }
- let solved = false;
- let _g1 = 0;
- let _g2 = this.boundaryBuilder.numBoundaries;
- while(_g1 < _g2) {
- let idx = this.posBoundarySelector.indices[_g1++];
- if(this.boundaryBuilder.boundaries[idx].computeImpulses(this.info,this.massMatrix,this.relVels,this.impulses,this.dImpulses,oimo.common.Setting.positionSplitImpulseBaumgarte,false)) {
- let _g = 0;
- while(_g < numRows) {
- let j = _g++;
- this.info.rows[j].impulse.impulseP += this.dImpulses[j];
- }
- let impulses = this.dImpulses;
- let linearSet = false;
- let angularSet = false;
- let lv1X;
- let lv1Y;
- let lv1Z;
- let lv2X;
- let lv2Y;
- let lv2Z;
- let av1X;
- let av1Y;
- let av1Z;
- let av2X;
- let av2Y;
- let av2Z;
- lv1X = this._b1._pseudoVelX;
- lv1Y = this._b1._pseudoVelY;
- lv1Z = this._b1._pseudoVelZ;
- lv2X = this._b2._pseudoVelX;
- lv2Y = this._b2._pseudoVelY;
- lv2Z = this._b2._pseudoVelZ;
- av1X = this._b1._angPseudoVelX;
- av1Y = this._b1._angPseudoVelY;
- av1Z = this._b1._angPseudoVelZ;
- av2X = this._b2._angPseudoVelX;
- av2Y = this._b2._angPseudoVelY;
- av2Z = this._b2._angPseudoVelZ;
- let _g1 = 0;
- let _g2 = this.info.numRows;
- while(_g1 < _g2) {
- let i = _g1++;
- let j = this.info.rows[i].jacobian;
- let md = this.massData[i];
- let imp = impulses[i];
- if((j.flag & 1) != 0) {
- lv1X += md.invMLin1X * imp;
- lv1Y += md.invMLin1Y * imp;
- lv1Z += md.invMLin1Z * imp;
- lv2X += md.invMLin2X * -imp;
- lv2Y += md.invMLin2Y * -imp;
- lv2Z += md.invMLin2Z * -imp;
- linearSet = true;
- }
- if((j.flag & 2) != 0) {
- av1X += md.invMAng1X * imp;
- av1Y += md.invMAng1Y * imp;
- av1Z += md.invMAng1Z * imp;
- av2X += md.invMAng2X * -imp;
- av2Y += md.invMAng2Y * -imp;
- av2Z += md.invMAng2Z * -imp;
- angularSet = true;
- }
- }
- if(linearSet) {
- this._b1._pseudoVelX = lv1X;
- this._b1._pseudoVelY = lv1Y;
- this._b1._pseudoVelZ = lv1Z;
- this._b2._pseudoVelX = lv2X;
- this._b2._pseudoVelY = lv2Y;
- this._b2._pseudoVelZ = lv2Z;
- }
- if(angularSet) {
- this._b1._angPseudoVelX = av1X;
- this._b1._angPseudoVelY = av1Y;
- this._b1._angPseudoVelZ = av1Z;
- this._b2._angPseudoVelX = av2X;
- this._b2._angPseudoVelY = av2Y;
- this._b2._angPseudoVelZ = av2Z;
- }
- let _this = this.posBoundarySelector;
- let i = 0;
- while(_this.indices[i] != idx) ++i;
- while(i > 0) {
- let tmp = _this.indices[i];
- _this.indices[i] = _this.indices[i - 1];
- _this.indices[i - 1] = tmp;
- --i;
- }
- solved = true;
- break;
- }
- }
- if(!solved) {
- console.log("src/oimo/dynamics/constraint/solver/direct/DirectJointConstraintSolver.hx:450:","could not find solution. (split impulse)");
- return;
- }
- }
- solvePositionNgs(timeStep) {
- this.joint._syncAnchors();
- this.joint._getPositionSolverInfo(this.info);
- this._b1 = this.info.b1;
- this._b2 = this.info.b2;
- this.massMatrix.computeInvMass(this.info,this.massData);
- let _this = this.boundaryBuilder;
- _this.numBoundaries = 0;
- let _this1 = _this.bbInfo;
- _this1.numBounded = 0;
- _this1.numUnbounded = 0;
- _this.buildBoundariesRecursive(this.info,0);
- let _this2 = this.posBoundarySelector;
- let size = this.boundaryBuilder.numBoundaries;
- let numSmaller = 0;
- let numGreater = 0;
- let _g = 0;
- let _g1 = _this2.n;
- while(_g < _g1) {
- let idx = _this2.indices[_g++];
- if(idx < size) {
- _this2.tmpIndices[numSmaller] = idx;
- ++numSmaller;
- } else {
- _this2.tmpIndices[size + numGreater] = idx;
- ++numGreater;
- }
- }
- let tmp = _this2.indices;
- _this2.indices = _this2.tmpIndices;
- _this2.tmpIndices = tmp;
- let numRows = this.info.numRows;
- let _g2 = 0;
- while(_g2 < numRows) {
- let i = _g2++;
- let imp = this.info.rows[i].impulse;
- this.relVels[i] = 0;
- this.impulses[i] = imp.impulseP;
- }
- let solved = false;
- let _g3 = 0;
- let _g4 = this.boundaryBuilder.numBoundaries;
- while(_g3 < _g4) {
- let idx = this.posBoundarySelector.indices[_g3++];
- if(this.boundaryBuilder.boundaries[idx].computeImpulses(this.info,this.massMatrix,this.relVels,this.impulses,this.dImpulses,oimo.common.Setting.positionNgsBaumgarte,false)) {
- let _g = 0;
- while(_g < numRows) {
- let j = _g++;
- this.info.rows[j].impulse.impulseP += this.dImpulses[j];
- }
- let impulses = this.dImpulses;
- let linearSet = false;
- let angularSet = false;
- let lv1X;
- let lv1Y;
- let lv1Z;
- let lv2X;
- let lv2Y;
- let lv2Z;
- let av1X;
- let av1Y;
- let av1Z;
- let av2X;
- let av2Y;
- let av2Z;
- lv1X = 0;
- lv1Y = 0;
- lv1Z = 0;
- lv2X = 0;
- lv2Y = 0;
- lv2Z = 0;
- av1X = 0;
- av1Y = 0;
- av1Z = 0;
- av2X = 0;
- av2Y = 0;
- av2Z = 0;
- let _g1 = 0;
- let _g2 = this.info.numRows;
- while(_g1 < _g2) {
- let i = _g1++;
- let j = this.info.rows[i].jacobian;
- let md = this.massData[i];
- let imp = impulses[i];
- if((j.flag & 1) != 0) {
- lv1X += md.invMLin1X * imp;
- lv1Y += md.invMLin1Y * imp;
- lv1Z += md.invMLin1Z * imp;
- lv2X += md.invMLin2X * -imp;
- lv2Y += md.invMLin2Y * -imp;
- lv2Z += md.invMLin2Z * -imp;
- linearSet = true;
- }
- if((j.flag & 2) != 0) {
- av1X += md.invMAng1X * imp;
- av1Y += md.invMAng1Y * imp;
- av1Z += md.invMAng1Z * imp;
- av2X += md.invMAng2X * -imp;
- av2Y += md.invMAng2Y * -imp;
- av2Z += md.invMAng2Z * -imp;
- angularSet = true;
- }
- }
- if(linearSet) {
- let _this = this._b1;
- _this._transform._positionX += lv1X;
- _this._transform._positionY += lv1Y;
- _this._transform._positionZ += lv1Z;
- let _this1 = this._b2;
- _this1._transform._positionX += lv2X;
- _this1._transform._positionY += lv2Y;
- _this1._transform._positionZ += lv2Z;
- }
- if(angularSet) {
- let _this = this._b1;
- let theta = Math.sqrt(av1X * av1X + av1Y * av1Y + av1Z * av1Z);
- let halfTheta = theta * 0.5;
- let rotationToSinAxisFactor;
- let cosHalfTheta;
- if(halfTheta < 0.5) {
- let ht2 = halfTheta * halfTheta;
- rotationToSinAxisFactor = 0.5 * (1 - ht2 * 0.16666666666666666 + ht2 * ht2 * 0.0083333333333333332);
- cosHalfTheta = 1 - ht2 * 0.5 + ht2 * ht2 * 0.041666666666666664;
- } else {
- rotationToSinAxisFactor = Math.sin(halfTheta) / theta;
- cosHalfTheta = Math.cos(halfTheta);
- }
- let sinAxisX;
- let sinAxisY;
- let sinAxisZ;
- sinAxisX = av1X * rotationToSinAxisFactor;
- sinAxisY = av1Y * rotationToSinAxisFactor;
- sinAxisZ = av1Z * rotationToSinAxisFactor;
- let dqX;
- let dqY;
- let dqZ;
- let dqW;
- dqX = sinAxisX;
- dqY = sinAxisY;
- dqZ = sinAxisZ;
- dqW = cosHalfTheta;
- let qX;
- let qY;
- let qZ;
- let qW;
- let e00 = _this._transform._rotation00;
- let e11 = _this._transform._rotation11;
- let e22 = _this._transform._rotation22;
- let t = e00 + e11 + e22;
- let s;
- if(t > 0) {
- s = Math.sqrt(t + 1);
- qW = 0.5 * s;
- s = 0.5 / s;
- qX = (_this._transform._rotation21 - _this._transform._rotation12) * s;
- qY = (_this._transform._rotation02 - _this._transform._rotation20) * s;
- qZ = (_this._transform._rotation10 - _this._transform._rotation01) * s;
- } else if(e00 > e11) {
- if(e00 > e22) {
- s = Math.sqrt(e00 - e11 - e22 + 1);
- qX = 0.5 * s;
- s = 0.5 / s;
- qY = (_this._transform._rotation01 + _this._transform._rotation10) * s;
- qZ = (_this._transform._rotation02 + _this._transform._rotation20) * s;
- qW = (_this._transform._rotation21 - _this._transform._rotation12) * s;
- } else {
- s = Math.sqrt(e22 - e00 - e11 + 1);
- qZ = 0.5 * s;
- s = 0.5 / s;
- qX = (_this._transform._rotation02 + _this._transform._rotation20) * s;
- qY = (_this._transform._rotation12 + _this._transform._rotation21) * s;
- qW = (_this._transform._rotation10 - _this._transform._rotation01) * s;
- }
- } else if(e11 > e22) {
- s = Math.sqrt(e11 - e22 - e00 + 1);
- qY = 0.5 * s;
- s = 0.5 / s;
- qX = (_this._transform._rotation01 + _this._transform._rotation10) * s;
- qZ = (_this._transform._rotation12 + _this._transform._rotation21) * s;
- qW = (_this._transform._rotation02 - _this._transform._rotation20) * s;
- } else {
- s = Math.sqrt(e22 - e00 - e11 + 1);
- qZ = 0.5 * s;
- s = 0.5 / s;
- qX = (_this._transform._rotation02 + _this._transform._rotation20) * s;
- qY = (_this._transform._rotation12 + _this._transform._rotation21) * s;
- qW = (_this._transform._rotation10 - _this._transform._rotation01) * s;
- }
- qX = dqW * qX + dqX * qW + dqY * qZ - dqZ * qY;
- qY = dqW * qY - dqX * qZ + dqY * qW + dqZ * qX;
- qZ = dqW * qZ + dqX * qY - dqY * qX + dqZ * qW;
- qW = dqW * qW - dqX * qX - dqY * qY - dqZ * qZ;
- let l = qX * qX + qY * qY + qZ * qZ + qW * qW;
- if(l > 1e-32) {
- l = 1 / Math.sqrt(l);
- }
- qX *= l;
- qY *= l;
- qZ *= l;
- qW *= l;
- let x = qX;
- let y = qY;
- let z = qZ;
- let w = qW;
- let x2 = 2 * x;
- let y2 = 2 * y;
- let z2 = 2 * z;
- let xx = x * x2;
- let yy = y * y2;
- let zz = z * z2;
- let xy = x * y2;
- let yz = y * z2;
- let xz = x * z2;
- let wx = w * x2;
- let wy = w * y2;
- let wz = w * z2;
- _this._transform._rotation00 = 1 - yy - zz;
- _this._transform._rotation01 = xy - wz;
- _this._transform._rotation02 = xz + wy;
- _this._transform._rotation10 = xy + wz;
- _this._transform._rotation11 = 1 - xx - zz;
- _this._transform._rotation12 = yz - wx;
- _this._transform._rotation20 = xz - wy;
- _this._transform._rotation21 = yz + wx;
- _this._transform._rotation22 = 1 - xx - yy;
- let __tmp__00;
- let __tmp__01;
- let __tmp__02;
- let __tmp__10;
- let __tmp__11;
- let __tmp__12;
- let __tmp__20;
- let __tmp__21;
- let __tmp__22;
- __tmp__00 = _this._transform._rotation00 * _this._invLocalInertia00 + _this._transform._rotation01 * _this._invLocalInertia10 + _this._transform._rotation02 * _this._invLocalInertia20;
- __tmp__01 = _this._transform._rotation00 * _this._invLocalInertia01 + _this._transform._rotation01 * _this._invLocalInertia11 + _this._transform._rotation02 * _this._invLocalInertia21;
- __tmp__02 = _this._transform._rotation00 * _this._invLocalInertia02 + _this._transform._rotation01 * _this._invLocalInertia12 + _this._transform._rotation02 * _this._invLocalInertia22;
- __tmp__10 = _this._transform._rotation10 * _this._invLocalInertia00 + _this._transform._rotation11 * _this._invLocalInertia10 + _this._transform._rotation12 * _this._invLocalInertia20;
- __tmp__11 = _this._transform._rotation10 * _this._invLocalInertia01 + _this._transform._rotation11 * _this._invLocalInertia11 + _this._transform._rotation12 * _this._invLocalInertia21;
- __tmp__12 = _this._transform._rotation10 * _this._invLocalInertia02 + _this._transform._rotation11 * _this._invLocalInertia12 + _this._transform._rotation12 * _this._invLocalInertia22;
- __tmp__20 = _this._transform._rotation20 * _this._invLocalInertia00 + _this._transform._rotation21 * _this._invLocalInertia10 + _this._transform._rotation22 * _this._invLocalInertia20;
- __tmp__21 = _this._transform._rotation20 * _this._invLocalInertia01 + _this._transform._rotation21 * _this._invLocalInertia11 + _this._transform._rotation22 * _this._invLocalInertia21;
- __tmp__22 = _this._transform._rotation20 * _this._invLocalInertia02 + _this._transform._rotation21 * _this._invLocalInertia12 + _this._transform._rotation22 * _this._invLocalInertia22;
- _this._invInertia00 = __tmp__00;
- _this._invInertia01 = __tmp__01;
- _this._invInertia02 = __tmp__02;
- _this._invInertia10 = __tmp__10;
- _this._invInertia11 = __tmp__11;
- _this._invInertia12 = __tmp__12;
- _this._invInertia20 = __tmp__20;
- _this._invInertia21 = __tmp__21;
- _this._invInertia22 = __tmp__22;
- let __tmp__001;
- let __tmp__011;
- let __tmp__021;
- let __tmp__101;
- let __tmp__111;
- let __tmp__121;
- let __tmp__201;
- let __tmp__211;
- let __tmp__221;
- __tmp__001 = _this._invInertia00 * _this._transform._rotation00 + _this._invInertia01 * _this._transform._rotation01 + _this._invInertia02 * _this._transform._rotation02;
- __tmp__011 = _this._invInertia00 * _this._transform._rotation10 + _this._invInertia01 * _this._transform._rotation11 + _this._invInertia02 * _this._transform._rotation12;
- __tmp__021 = _this._invInertia00 * _this._transform._rotation20 + _this._invInertia01 * _this._transform._rotation21 + _this._invInertia02 * _this._transform._rotation22;
- __tmp__101 = _this._invInertia10 * _this._transform._rotation00 + _this._invInertia11 * _this._transform._rotation01 + _this._invInertia12 * _this._transform._rotation02;
- __tmp__111 = _this._invInertia10 * _this._transform._rotation10 + _this._invInertia11 * _this._transform._rotation11 + _this._invInertia12 * _this._transform._rotation12;
- __tmp__121 = _this._invInertia10 * _this._transform._rotation20 + _this._invInertia11 * _this._transform._rotation21 + _this._invInertia12 * _this._transform._rotation22;
- __tmp__201 = _this._invInertia20 * _this._transform._rotation00 + _this._invInertia21 * _this._transform._rotation01 + _this._invInertia22 * _this._transform._rotation02;
- __tmp__211 = _this._invInertia20 * _this._transform._rotation10 + _this._invInertia21 * _this._transform._rotation11 + _this._invInertia22 * _this._transform._rotation12;
- __tmp__221 = _this._invInertia20 * _this._transform._rotation20 + _this._invInertia21 * _this._transform._rotation21 + _this._invInertia22 * _this._transform._rotation22;
- _this._invInertia00 = __tmp__001;
- _this._invInertia01 = __tmp__011;
- _this._invInertia02 = __tmp__021;
- _this._invInertia10 = __tmp__101;
- _this._invInertia11 = __tmp__111;
- _this._invInertia12 = __tmp__121;
- _this._invInertia20 = __tmp__201;
- _this._invInertia21 = __tmp__211;
- _this._invInertia22 = __tmp__221;
- _this._invInertia00 *= _this._rotFactor.x;
- _this._invInertia01 *= _this._rotFactor.x;
- _this._invInertia02 *= _this._rotFactor.x;
- _this._invInertia10 *= _this._rotFactor.y;
- _this._invInertia11 *= _this._rotFactor.y;
- _this._invInertia12 *= _this._rotFactor.y;
- _this._invInertia20 *= _this._rotFactor.z;
- _this._invInertia21 *= _this._rotFactor.z;
- _this._invInertia22 *= _this._rotFactor.z;
- let _this1 = this._b2;
- let theta1 = Math.sqrt(av2X * av2X + av2Y * av2Y + av2Z * av2Z);
- let halfTheta1 = theta1 * 0.5;
- let rotationToSinAxisFactor1;
- let cosHalfTheta1;
- if(halfTheta1 < 0.5) {
- let ht2 = halfTheta1 * halfTheta1;
- rotationToSinAxisFactor1 = 0.5 * (1 - ht2 * 0.16666666666666666 + ht2 * ht2 * 0.0083333333333333332);
- cosHalfTheta1 = 1 - ht2 * 0.5 + ht2 * ht2 * 0.041666666666666664;
- } else {
- rotationToSinAxisFactor1 = Math.sin(halfTheta1) / theta1;
- cosHalfTheta1 = Math.cos(halfTheta1);
- }
- let sinAxisX1;
- let sinAxisY1;
- let sinAxisZ1;
- sinAxisX1 = av2X * rotationToSinAxisFactor1;
- sinAxisY1 = av2Y * rotationToSinAxisFactor1;
- sinAxisZ1 = av2Z * rotationToSinAxisFactor1;
- let dqX1;
- let dqY1;
- let dqZ1;
- let dqW1;
- dqX1 = sinAxisX1;
- dqY1 = sinAxisY1;
- dqZ1 = sinAxisZ1;
- dqW1 = cosHalfTheta1;
- let qX1;
- let qY1;
- let qZ1;
- let qW1;
- let e001 = _this1._transform._rotation00;
- let e111 = _this1._transform._rotation11;
- let e221 = _this1._transform._rotation22;
- let t1 = e001 + e111 + e221;
- let s1;
- if(t1 > 0) {
- s1 = Math.sqrt(t1 + 1);
- qW1 = 0.5 * s1;
- s1 = 0.5 / s1;
- qX1 = (_this1._transform._rotation21 - _this1._transform._rotation12) * s1;
- qY1 = (_this1._transform._rotation02 - _this1._transform._rotation20) * s1;
- qZ1 = (_this1._transform._rotation10 - _this1._transform._rotation01) * s1;
- } else if(e001 > e111) {
- if(e001 > e221) {
- s1 = Math.sqrt(e001 - e111 - e221 + 1);
- qX1 = 0.5 * s1;
- s1 = 0.5 / s1;
- qY1 = (_this1._transform._rotation01 + _this1._transform._rotation10) * s1;
- qZ1 = (_this1._transform._rotation02 + _this1._transform._rotation20) * s1;
- qW1 = (_this1._transform._rotation21 - _this1._transform._rotation12) * s1;
- } else {
- s1 = Math.sqrt(e221 - e001 - e111 + 1);
- qZ1 = 0.5 * s1;
- s1 = 0.5 / s1;
- qX1 = (_this1._transform._rotation02 + _this1._transform._rotation20) * s1;
- qY1 = (_this1._transform._rotation12 + _this1._transform._rotation21) * s1;
- qW1 = (_this1._transform._rotation10 - _this1._transform._rotation01) * s1;
- }
- } else if(e111 > e221) {
- s1 = Math.sqrt(e111 - e221 - e001 + 1);
- qY1 = 0.5 * s1;
- s1 = 0.5 / s1;
- qX1 = (_this1._transform._rotation01 + _this1._transform._rotation10) * s1;
- qZ1 = (_this1._transform._rotation12 + _this1._transform._rotation21) * s1;
- qW1 = (_this1._transform._rotation02 - _this1._transform._rotation20) * s1;
- } else {
- s1 = Math.sqrt(e221 - e001 - e111 + 1);
- qZ1 = 0.5 * s1;
- s1 = 0.5 / s1;
- qX1 = (_this1._transform._rotation02 + _this1._transform._rotation20) * s1;
- qY1 = (_this1._transform._rotation12 + _this1._transform._rotation21) * s1;
- qW1 = (_this1._transform._rotation10 - _this1._transform._rotation01) * s1;
- }
- qX1 = dqW1 * qX1 + dqX1 * qW1 + dqY1 * qZ1 - dqZ1 * qY1;
- qY1 = dqW1 * qY1 - dqX1 * qZ1 + dqY1 * qW1 + dqZ1 * qX1;
- qZ1 = dqW1 * qZ1 + dqX1 * qY1 - dqY1 * qX1 + dqZ1 * qW1;
- qW1 = dqW1 * qW1 - dqX1 * qX1 - dqY1 * qY1 - dqZ1 * qZ1;
- let l1 = qX1 * qX1 + qY1 * qY1 + qZ1 * qZ1 + qW1 * qW1;
- if(l1 > 1e-32) {
- l1 = 1 / Math.sqrt(l1);
- }
- qX1 *= l1;
- qY1 *= l1;
- qZ1 *= l1;
- qW1 *= l1;
- let x1 = qX1;
- let y1 = qY1;
- let z1 = qZ1;
- let w1 = qW1;
- let x21 = 2 * x1;
- let y21 = 2 * y1;
- let z21 = 2 * z1;
- let xx1 = x1 * x21;
- let yy1 = y1 * y21;
- let zz1 = z1 * z21;
- let xy1 = x1 * y21;
- let yz1 = y1 * z21;
- let xz1 = x1 * z21;
- let wx1 = w1 * x21;
- let wy1 = w1 * y21;
- let wz1 = w1 * z21;
- _this1._transform._rotation00 = 1 - yy1 - zz1;
- _this1._transform._rotation01 = xy1 - wz1;
- _this1._transform._rotation02 = xz1 + wy1;
- _this1._transform._rotation10 = xy1 + wz1;
- _this1._transform._rotation11 = 1 - xx1 - zz1;
- _this1._transform._rotation12 = yz1 - wx1;
- _this1._transform._rotation20 = xz1 - wy1;
- _this1._transform._rotation21 = yz1 + wx1;
- _this1._transform._rotation22 = 1 - xx1 - yy1;
- let __tmp__002;
- let __tmp__012;
- let __tmp__022;
- let __tmp__102;
- let __tmp__112;
- let __tmp__122;
- let __tmp__202;
- let __tmp__212;
- let __tmp__222;
- __tmp__002 = _this1._transform._rotation00 * _this1._invLocalInertia00 + _this1._transform._rotation01 * _this1._invLocalInertia10 + _this1._transform._rotation02 * _this1._invLocalInertia20;
- __tmp__012 = _this1._transform._rotation00 * _this1._invLocalInertia01 + _this1._transform._rotation01 * _this1._invLocalInertia11 + _this1._transform._rotation02 * _this1._invLocalInertia21;
- __tmp__022 = _this1._transform._rotation00 * _this1._invLocalInertia02 + _this1._transform._rotation01 * _this1._invLocalInertia12 + _this1._transform._rotation02 * _this1._invLocalInertia22;
- __tmp__102 = _this1._transform._rotation10 * _this1._invLocalInertia00 + _this1._transform._rotation11 * _this1._invLocalInertia10 + _this1._transform._rotation12 * _this1._invLocalInertia20;
- __tmp__112 = _this1._transform._rotation10 * _this1._invLocalInertia01 + _this1._transform._rotation11 * _this1._invLocalInertia11 + _this1._transform._rotation12 * _this1._invLocalInertia21;
- __tmp__122 = _this1._transform._rotation10 * _this1._invLocalInertia02 + _this1._transform._rotation11 * _this1._invLocalInertia12 + _this1._transform._rotation12 * _this1._invLocalInertia22;
- __tmp__202 = _this1._transform._rotation20 * _this1._invLocalInertia00 + _this1._transform._rotation21 * _this1._invLocalInertia10 + _this1._transform._rotation22 * _this1._invLocalInertia20;
- __tmp__212 = _this1._transform._rotation20 * _this1._invLocalInertia01 + _this1._transform._rotation21 * _this1._invLocalInertia11 + _this1._transform._rotation22 * _this1._invLocalInertia21;
- __tmp__222 = _this1._transform._rotation20 * _this1._invLocalInertia02 + _this1._transform._rotation21 * _this1._invLocalInertia12 + _this1._transform._rotation22 * _this1._invLocalInertia22;
- _this1._invInertia00 = __tmp__002;
- _this1._invInertia01 = __tmp__012;
- _this1._invInertia02 = __tmp__022;
- _this1._invInertia10 = __tmp__102;
- _this1._invInertia11 = __tmp__112;
- _this1._invInertia12 = __tmp__122;
- _this1._invInertia20 = __tmp__202;
- _this1._invInertia21 = __tmp__212;
- _this1._invInertia22 = __tmp__222;
- let __tmp__003;
- let __tmp__013;
- let __tmp__023;
- let __tmp__103;
- let __tmp__113;
- let __tmp__123;
- let __tmp__203;
- let __tmp__213;
- let __tmp__223;
- __tmp__003 = _this1._invInertia00 * _this1._transform._rotation00 + _this1._invInertia01 * _this1._transform._rotation01 + _this1._invInertia02 * _this1._transform._rotation02;
- __tmp__013 = _this1._invInertia00 * _this1._transform._rotation10 + _this1._invInertia01 * _this1._transform._rotation11 + _this1._invInertia02 * _this1._transform._rotation12;
- __tmp__023 = _this1._invInertia00 * _this1._transform._rotation20 + _this1._invInertia01 * _this1._transform._rotation21 + _this1._invInertia02 * _this1._transform._rotation22;
- __tmp__103 = _this1._invInertia10 * _this1._transform._rotation00 + _this1._invInertia11 * _this1._transform._rotation01 + _this1._invInertia12 * _this1._transform._rotation02;
- __tmp__113 = _this1._invInertia10 * _this1._transform._rotation10 + _this1._invInertia11 * _this1._transform._rotation11 + _this1._invInertia12 * _this1._transform._rotation12;
- __tmp__123 = _this1._invInertia10 * _this1._transform._rotation20 + _this1._invInertia11 * _this1._transform._rotation21 + _this1._invInertia12 * _this1._transform._rotation22;
- __tmp__203 = _this1._invInertia20 * _this1._transform._rotation00 + _this1._invInertia21 * _this1._transform._rotation01 + _this1._invInertia22 * _this1._transform._rotation02;
- __tmp__213 = _this1._invInertia20 * _this1._transform._rotation10 + _this1._invInertia21 * _this1._transform._rotation11 + _this1._invInertia22 * _this1._transform._rotation12;
- __tmp__223 = _this1._invInertia20 * _this1._transform._rotation20 + _this1._invInertia21 * _this1._transform._rotation21 + _this1._invInertia22 * _this1._transform._rotation22;
- _this1._invInertia00 = __tmp__003;
- _this1._invInertia01 = __tmp__013;
- _this1._invInertia02 = __tmp__023;
- _this1._invInertia10 = __tmp__103;
- _this1._invInertia11 = __tmp__113;
- _this1._invInertia12 = __tmp__123;
- _this1._invInertia20 = __tmp__203;
- _this1._invInertia21 = __tmp__213;
- _this1._invInertia22 = __tmp__223;
- _this1._invInertia00 *= _this1._rotFactor.x;
- _this1._invInertia01 *= _this1._rotFactor.x;
- _this1._invInertia02 *= _this1._rotFactor.x;
- _this1._invInertia10 *= _this1._rotFactor.y;
- _this1._invInertia11 *= _this1._rotFactor.y;
- _this1._invInertia12 *= _this1._rotFactor.y;
- _this1._invInertia20 *= _this1._rotFactor.z;
- _this1._invInertia21 *= _this1._rotFactor.z;
- _this1._invInertia22 *= _this1._rotFactor.z;
- }
- let _this = this.posBoundarySelector;
- let i = 0;
- while(_this.indices[i] != idx) ++i;
- while(i > 0) {
- let tmp = _this.indices[i];
- _this.indices[i] = _this.indices[i - 1];
- _this.indices[i - 1] = tmp;
- --i;
- }
- solved = true;
- break;
- }
- }
- if(!solved) {
- console.log("src/oimo/dynamics/constraint/solver/direct/DirectJointConstraintSolver.hx:502:","could not find solution. (NGS)");
- return;
- }
- }
- postSolve() {
- this.joint._syncAnchors();
- this.joint._checkDestruction();
- }
- }
- oimo.dynamics.constraint.solver.direct.MassMatrix = class oimo_dynamics_constraint_solver_direct_MassMatrix {
- constructor(size) {
- this._size = size;
- this.tmpMatrix = new Array(this._size);
- this._invMass = new Array(this._size);
- this._invMassWithoutCfm = new Array(this._size);
- let _g = 0;
- let _g1 = this._size;
- while(_g < _g1) {
- let i = _g++;
- this.tmpMatrix[i] = new Array(this._size);
- this._invMass[i] = new Array(this._size);
- this._invMassWithoutCfm[i] = new Array(this._size);
- let _g1 = 0;
- let _g2 = this._size;
- while(_g1 < _g2) {
- let j = _g1++;
- this.tmpMatrix[i][j] = 0;
- this._invMass[i][j] = 0;
- this._invMassWithoutCfm[i][j] = 0;
- }
- }
- this._maxSubmatrixId = 1 << this._size;
- this._cacheComputed = new Array(this._maxSubmatrixId);
- this._cachedSubmatrices = new Array(this._maxSubmatrixId);
- let _g2 = 0;
- let _g3 = this._maxSubmatrixId;
- while(_g2 < _g3) {
- let i = _g2++;
- let t;
- t = (i & 85) + (i >> 1 & 85);
- t = (t & 51) + (t >> 2 & 51);
- t = (t & 15) + (t >> 4 & 15);
- let matrixSize = t;
- let subMatrix = new Array(matrixSize);
- let _g = 0;
- while(_g < matrixSize) {
- let j = _g++;
- subMatrix[j] = new Array(matrixSize);
- let _g1 = 0;
- while(_g1 < matrixSize) subMatrix[j][_g1++] = 0;
- }
- this._cacheComputed[i] = false;
- this._cachedSubmatrices[i] = subMatrix;
- }
- }
- computeSubmatrix(id,indices,size) {
- let _g = 0;
- while(_g < size) {
- let i = _g++;
- let ii = indices[i];
- let _g1 = 0;
- while(_g1 < size) {
- let j = _g1++;
- this.tmpMatrix[i][j] = this._invMass[ii][indices[j]];
- }
- }
- let src = this.tmpMatrix;
- let dst = this._cachedSubmatrices[id];
- let srci;
- let dsti;
- let srcj;
- let dstj;
- let diag;
- switch(size) {
- case 4:
- srci = src[0];
- dsti = dst[0];
- diag = 1 / srci[0];
- dsti[0] = diag;
- srci[1] *= diag;
- srci[2] *= diag;
- srci[3] *= diag;
- srcj = src[1];
- dstj = dst[1];
- dstj[0] = -diag * srcj[0];
- srcj[1] -= srci[1] * srcj[0];
- srcj[2] -= srci[2] * srcj[0];
- srcj[3] -= srci[3] * srcj[0];
- srcj = src[2];
- dstj = dst[2];
- dstj[0] = -diag * srcj[0];
- srcj[1] -= srci[1] * srcj[0];
- srcj[2] -= srci[2] * srcj[0];
- srcj[3] -= srci[3] * srcj[0];
- srcj = src[3];
- dstj = dst[3];
- dstj[0] = -diag * srcj[0];
- srcj[1] -= srci[1] * srcj[0];
- srcj[2] -= srci[2] * srcj[0];
- srcj[3] -= srci[3] * srcj[0];
- srci = src[1];
- dsti = dst[1];
- diag = 1 / srci[1];
- dsti[1] = diag;
- dsti[0] *= diag;
- srci[2] *= diag;
- srci[3] *= diag;
- srcj = src[0];
- dstj = dst[0];
- dstj[0] -= dsti[0] * srcj[1];
- srcj[2] -= srci[2] * srcj[1];
- srcj[3] -= srci[3] * srcj[1];
- srcj = src[2];
- dstj = dst[2];
- dstj[0] -= dsti[0] * srcj[1];
- dstj[1] = -diag * srcj[1];
- srcj[2] -= srci[2] * srcj[1];
- srcj[3] -= srci[3] * srcj[1];
- srcj = src[3];
- dstj = dst[3];
- dstj[0] -= dsti[0] * srcj[1];
- dstj[1] = -diag * srcj[1];
- srcj[2] -= srci[2] * srcj[1];
- srcj[3] -= srci[3] * srcj[1];
- srci = src[2];
- dsti = dst[2];
- diag = 1 / srci[2];
- dsti[2] = diag;
- dsti[0] *= diag;
- dsti[1] *= diag;
- srci[3] *= diag;
- srcj = src[0];
- dstj = dst[0];
- dstj[0] -= dsti[0] * srcj[2];
- srcj[3] -= srci[3] * srcj[2];
- srcj = src[1];
- dstj = dst[1];
- dstj[0] -= dsti[0] * srcj[2];
- dstj[1] -= dsti[1] * srcj[2];
- srcj[3] -= srci[3] * srcj[2];
- srcj = src[3];
- dstj = dst[3];
- dstj[0] -= dsti[0] * srcj[2];
- dstj[1] -= dsti[1] * srcj[2];
- dstj[2] = -diag * srcj[2];
- srcj[3] -= srci[3] * srcj[2];
- srci = src[3];
- dsti = dst[3];
- diag = 1 / srci[3];
- dsti[3] = diag;
- dsti[0] *= diag;
- dsti[1] *= diag;
- dsti[2] *= diag;
- srcj = src[0];
- dstj = dst[0];
- dstj[0] -= dsti[0] * srcj[3];
- srcj = src[1];
- dstj = dst[1];
- dstj[0] -= dsti[0] * srcj[3];
- dstj[1] -= dsti[1] * srcj[3];
- srcj = src[2];
- dstj = dst[2];
- dstj[0] -= dsti[0] * srcj[3];
- dstj[1] -= dsti[1] * srcj[3];
- dstj[2] -= dsti[2] * srcj[3];
- dsti = dst[1];
- dst[0][1] = dsti[0];
- dsti = dst[2];
- dst[0][2] = dsti[0];
- dst[1][2] = dsti[1];
- dsti = dst[3];
- dst[0][3] = dsti[0];
- dst[1][3] = dsti[1];
- dst[2][3] = dsti[2];
- break;
- case 5:
- srci = src[0];
- dsti = dst[0];
- diag = 1 / srci[0];
- dsti[0] = diag;
- srci[1] *= diag;
- srci[2] *= diag;
- srci[3] *= diag;
- srci[4] *= diag;
- srcj = src[1];
- dstj = dst[1];
- dstj[0] = -diag * srcj[0];
- srcj[1] -= srci[1] * srcj[0];
- srcj[2] -= srci[2] * srcj[0];
- srcj[3] -= srci[3] * srcj[0];
- srcj[4] -= srci[4] * srcj[0];
- srcj = src[2];
- dstj = dst[2];
- dstj[0] = -diag * srcj[0];
- srcj[1] -= srci[1] * srcj[0];
- srcj[2] -= srci[2] * srcj[0];
- srcj[3] -= srci[3] * srcj[0];
- srcj[4] -= srci[4] * srcj[0];
- srcj = src[3];
- dstj = dst[3];
- dstj[0] = -diag * srcj[0];
- srcj[1] -= srci[1] * srcj[0];
- srcj[2] -= srci[2] * srcj[0];
- srcj[3] -= srci[3] * srcj[0];
- srcj[4] -= srci[4] * srcj[0];
- srcj = src[4];
- dstj = dst[4];
- dstj[0] = -diag * srcj[0];
- srcj[1] -= srci[1] * srcj[0];
- srcj[2] -= srci[2] * srcj[0];
- srcj[3] -= srci[3] * srcj[0];
- srcj[4] -= srci[4] * srcj[0];
- srci = src[1];
- dsti = dst[1];
- diag = 1 / srci[1];
- dsti[1] = diag;
- dsti[0] *= diag;
- srci[2] *= diag;
- srci[3] *= diag;
- srci[4] *= diag;
- srcj = src[0];
- dstj = dst[0];
- dstj[0] -= dsti[0] * srcj[1];
- srcj[2] -= srci[2] * srcj[1];
- srcj[3] -= srci[3] * srcj[1];
- srcj[4] -= srci[4] * srcj[1];
- srcj = src[2];
- dstj = dst[2];
- dstj[0] -= dsti[0] * srcj[1];
- dstj[1] = -diag * srcj[1];
- srcj[2] -= srci[2] * srcj[1];
- srcj[3] -= srci[3] * srcj[1];
- srcj[4] -= srci[4] * srcj[1];
- srcj = src[3];
- dstj = dst[3];
- dstj[0] -= dsti[0] * srcj[1];
- dstj[1] = -diag * srcj[1];
- srcj[2] -= srci[2] * srcj[1];
- srcj[3] -= srci[3] * srcj[1];
- srcj[4] -= srci[4] * srcj[1];
- srcj = src[4];
- dstj = dst[4];
- dstj[0] -= dsti[0] * srcj[1];
- dstj[1] = -diag * srcj[1];
- srcj[2] -= srci[2] * srcj[1];
- srcj[3] -= srci[3] * srcj[1];
- srcj[4] -= srci[4] * srcj[1];
- srci = src[2];
- dsti = dst[2];
- diag = 1 / srci[2];
- dsti[2] = diag;
- dsti[0] *= diag;
- dsti[1] *= diag;
- srci[3] *= diag;
- srci[4] *= diag;
- srcj = src[0];
- dstj = dst[0];
- dstj[0] -= dsti[0] * srcj[2];
- srcj[3] -= srci[3] * srcj[2];
- srcj[4] -= srci[4] * srcj[2];
- srcj = src[1];
- dstj = dst[1];
- dstj[0] -= dsti[0] * srcj[2];
- dstj[1] -= dsti[1] * srcj[2];
- srcj[3] -= srci[3] * srcj[2];
- srcj[4] -= srci[4] * srcj[2];
- srcj = src[3];
- dstj = dst[3];
- dstj[0] -= dsti[0] * srcj[2];
- dstj[1] -= dsti[1] * srcj[2];
- dstj[2] = -diag * srcj[2];
- srcj[3] -= srci[3] * srcj[2];
- srcj[4] -= srci[4] * srcj[2];
- srcj = src[4];
- dstj = dst[4];
- dstj[0] -= dsti[0] * srcj[2];
- dstj[1] -= dsti[1] * srcj[2];
- dstj[2] = -diag * srcj[2];
- srcj[3] -= srci[3] * srcj[2];
- srcj[4] -= srci[4] * srcj[2];
- srci = src[3];
- dsti = dst[3];
- diag = 1 / srci[3];
- dsti[3] = diag;
- dsti[0] *= diag;
- dsti[1] *= diag;
- dsti[2] *= diag;
- srci[4] *= diag;
- srcj = src[0];
- dstj = dst[0];
- dstj[0] -= dsti[0] * srcj[3];
- srcj[4] -= srci[4] * srcj[3];
- srcj = src[1];
- dstj = dst[1];
- dstj[0] -= dsti[0] * srcj[3];
- dstj[1] -= dsti[1] * srcj[3];
- srcj[4] -= srci[4] * srcj[3];
- srcj = src[2];
- dstj = dst[2];
- dstj[0] -= dsti[0] * srcj[3];
- dstj[1] -= dsti[1] * srcj[3];
- dstj[2] -= dsti[2] * srcj[3];
- srcj[4] -= srci[4] * srcj[3];
- srcj = src[4];
- dstj = dst[4];
- dstj[0] -= dsti[0] * srcj[3];
- dstj[1] -= dsti[1] * srcj[3];
- dstj[2] -= dsti[2] * srcj[3];
- dstj[3] = -diag * srcj[3];
- srcj[4] -= srci[4] * srcj[3];
- srci = src[4];
- dsti = dst[4];
- diag = 1 / srci[4];
- dsti[4] = diag;
- dsti[0] *= diag;
- dsti[1] *= diag;
- dsti[2] *= diag;
- dsti[3] *= diag;
- srcj = src[0];
- dstj = dst[0];
- dstj[0] -= dsti[0] * srcj[4];
- srcj = src[1];
- dstj = dst[1];
- dstj[0] -= dsti[0] * srcj[4];
- dstj[1] -= dsti[1] * srcj[4];
- srcj = src[2];
- dstj = dst[2];
- dstj[0] -= dsti[0] * srcj[4];
- dstj[1] -= dsti[1] * srcj[4];
- dstj[2] -= dsti[2] * srcj[4];
- srcj = src[3];
- dstj = dst[3];
- dstj[0] -= dsti[0] * srcj[4];
- dstj[1] -= dsti[1] * srcj[4];
- dstj[2] -= dsti[2] * srcj[4];
- dstj[3] -= dsti[3] * srcj[4];
- dsti = dst[1];
- dst[0][1] = dsti[0];
- dsti = dst[2];
- dst[0][2] = dsti[0];
- dst[1][2] = dsti[1];
- dsti = dst[3];
- dst[0][3] = dsti[0];
- dst[1][3] = dsti[1];
- dst[2][3] = dsti[2];
- dsti = dst[4];
- dst[0][4] = dsti[0];
- dst[1][4] = dsti[1];
- dst[2][4] = dsti[2];
- dst[3][4] = dsti[3];
- break;
- case 6:
- srci = src[0];
- dsti = dst[0];
- diag = 1 / srci[0];
- dsti[0] = diag;
- srci[1] *= diag;
- srci[2] *= diag;
- srci[3] *= diag;
- srci[4] *= diag;
- srci[5] *= diag;
- srcj = src[1];
- dstj = dst[1];
- dstj[0] = -diag * srcj[0];
- srcj[1] -= srci[1] * srcj[0];
- srcj[2] -= srci[2] * srcj[0];
- srcj[3] -= srci[3] * srcj[0];
- srcj[4] -= srci[4] * srcj[0];
- srcj[5] -= srci[5] * srcj[0];
- srcj = src[2];
- dstj = dst[2];
- dstj[0] = -diag * srcj[0];
- srcj[1] -= srci[1] * srcj[0];
- srcj[2] -= srci[2] * srcj[0];
- srcj[3] -= srci[3] * srcj[0];
- srcj[4] -= srci[4] * srcj[0];
- srcj[5] -= srci[5] * srcj[0];
- srcj = src[3];
- dstj = dst[3];
- dstj[0] = -diag * srcj[0];
- srcj[1] -= srci[1] * srcj[0];
- srcj[2] -= srci[2] * srcj[0];
- srcj[3] -= srci[3] * srcj[0];
- srcj[4] -= srci[4] * srcj[0];
- srcj[5] -= srci[5] * srcj[0];
- srcj = src[4];
- dstj = dst[4];
- dstj[0] = -diag * srcj[0];
- srcj[1] -= srci[1] * srcj[0];
- srcj[2] -= srci[2] * srcj[0];
- srcj[3] -= srci[3] * srcj[0];
- srcj[4] -= srci[4] * srcj[0];
- srcj[5] -= srci[5] * srcj[0];
- srcj = src[5];
- dstj = dst[5];
- dstj[0] = -diag * srcj[0];
- srcj[1] -= srci[1] * srcj[0];
- srcj[2] -= srci[2] * srcj[0];
- srcj[3] -= srci[3] * srcj[0];
- srcj[4] -= srci[4] * srcj[0];
- srcj[5] -= srci[5] * srcj[0];
- srci = src[1];
- dsti = dst[1];
- diag = 1 / srci[1];
- dsti[1] = diag;
- dsti[0] *= diag;
- srci[2] *= diag;
- srci[3] *= diag;
- srci[4] *= diag;
- srci[5] *= diag;
- srcj = src[0];
- dstj = dst[0];
- dstj[0] -= dsti[0] * srcj[1];
- srcj[2] -= srci[2] * srcj[1];
- srcj[3] -= srci[3] * srcj[1];
- srcj[4] -= srci[4] * srcj[1];
- srcj[5] -= srci[5] * srcj[1];
- srcj = src[2];
- dstj = dst[2];
- dstj[0] -= dsti[0] * srcj[1];
- dstj[1] = -diag * srcj[1];
- srcj[2] -= srci[2] * srcj[1];
- srcj[3] -= srci[3] * srcj[1];
- srcj[4] -= srci[4] * srcj[1];
- srcj[5] -= srci[5] * srcj[1];
- srcj = src[3];
- dstj = dst[3];
- dstj[0] -= dsti[0] * srcj[1];
- dstj[1] = -diag * srcj[1];
- srcj[2] -= srci[2] * srcj[1];
- srcj[3] -= srci[3] * srcj[1];
- srcj[4] -= srci[4] * srcj[1];
- srcj[5] -= srci[5] * srcj[1];
- srcj = src[4];
- dstj = dst[4];
- dstj[0] -= dsti[0] * srcj[1];
- dstj[1] = -diag * srcj[1];
- srcj[2] -= srci[2] * srcj[1];
- srcj[3] -= srci[3] * srcj[1];
- srcj[4] -= srci[4] * srcj[1];
- srcj[5] -= srci[5] * srcj[1];
- srcj = src[5];
- dstj = dst[5];
- dstj[0] -= dsti[0] * srcj[1];
- dstj[1] = -diag * srcj[1];
- srcj[2] -= srci[2] * srcj[1];
- srcj[3] -= srci[3] * srcj[1];
- srcj[4] -= srci[4] * srcj[1];
- srcj[5] -= srci[5] * srcj[1];
- srci = src[2];
- dsti = dst[2];
- diag = 1 / srci[2];
- dsti[2] = diag;
- dsti[0] *= diag;
- dsti[1] *= diag;
- srci[3] *= diag;
- srci[4] *= diag;
- srci[5] *= diag;
- srcj = src[0];
- dstj = dst[0];
- dstj[0] -= dsti[0] * srcj[2];
- srcj[3] -= srci[3] * srcj[2];
- srcj[4] -= srci[4] * srcj[2];
- srcj[5] -= srci[5] * srcj[2];
- srcj = src[1];
- dstj = dst[1];
- dstj[0] -= dsti[0] * srcj[2];
- dstj[1] -= dsti[1] * srcj[2];
- srcj[3] -= srci[3] * srcj[2];
- srcj[4] -= srci[4] * srcj[2];
- srcj[5] -= srci[5] * srcj[2];
- srcj = src[3];
- dstj = dst[3];
- dstj[0] -= dsti[0] * srcj[2];
- dstj[1] -= dsti[1] * srcj[2];
- dstj[2] = -diag * srcj[2];
- srcj[3] -= srci[3] * srcj[2];
- srcj[4] -= srci[4] * srcj[2];
- srcj[5] -= srci[5] * srcj[2];
- srcj = src[4];
- dstj = dst[4];
- dstj[0] -= dsti[0] * srcj[2];
- dstj[1] -= dsti[1] * srcj[2];
- dstj[2] = -diag * srcj[2];
- srcj[3] -= srci[3] * srcj[2];
- srcj[4] -= srci[4] * srcj[2];
- srcj[5] -= srci[5] * srcj[2];
- srcj = src[5];
- dstj = dst[5];
- dstj[0] -= dsti[0] * srcj[2];
- dstj[1] -= dsti[1] * srcj[2];
- dstj[2] = -diag * srcj[2];
- srcj[3] -= srci[3] * srcj[2];
- srcj[4] -= srci[4] * srcj[2];
- srcj[5] -= srci[5] * srcj[2];
- srci = src[3];
- dsti = dst[3];
- diag = 1 / srci[3];
- dsti[3] = diag;
- dsti[0] *= diag;
- dsti[1] *= diag;
- dsti[2] *= diag;
- srci[4] *= diag;
- srci[5] *= diag;
- srcj = src[0];
- dstj = dst[0];
- dstj[0] -= dsti[0] * srcj[3];
- srcj[4] -= srci[4] * srcj[3];
- srcj[5] -= srci[5] * srcj[3];
- srcj = src[1];
- dstj = dst[1];
- dstj[0] -= dsti[0] * srcj[3];
- dstj[1] -= dsti[1] * srcj[3];
- srcj[4] -= srci[4] * srcj[3];
- srcj[5] -= srci[5] * srcj[3];
- srcj = src[2];
- dstj = dst[2];
- dstj[0] -= dsti[0] * srcj[3];
- dstj[1] -= dsti[1] * srcj[3];
- dstj[2] -= dsti[2] * srcj[3];
- srcj[4] -= srci[4] * srcj[3];
- srcj[5] -= srci[5] * srcj[3];
- srcj = src[4];
- dstj = dst[4];
- dstj[0] -= dsti[0] * srcj[3];
- dstj[1] -= dsti[1] * srcj[3];
- dstj[2] -= dsti[2] * srcj[3];
- dstj[3] = -diag * srcj[3];
- srcj[4] -= srci[4] * srcj[3];
- srcj[5] -= srci[5] * srcj[3];
- srcj = src[5];
- dstj = dst[5];
- dstj[0] -= dsti[0] * srcj[3];
- dstj[1] -= dsti[1] * srcj[3];
- dstj[2] -= dsti[2] * srcj[3];
- dstj[3] = -diag * srcj[3];
- srcj[4] -= srci[4] * srcj[3];
- srcj[5] -= srci[5] * srcj[3];
- srci = src[4];
- dsti = dst[4];
- diag = 1 / srci[4];
- dsti[4] = diag;
- dsti[0] *= diag;
- dsti[1] *= diag;
- dsti[2] *= diag;
- dsti[3] *= diag;
- srci[5] *= diag;
- srcj = src[0];
- dstj = dst[0];
- dstj[0] -= dsti[0] * srcj[4];
- srcj[5] -= srci[5] * srcj[4];
- srcj = src[1];
- dstj = dst[1];
- dstj[0] -= dsti[0] * srcj[4];
- dstj[1] -= dsti[1] * srcj[4];
- srcj[5] -= srci[5] * srcj[4];
- srcj = src[2];
- dstj = dst[2];
- dstj[0] -= dsti[0] * srcj[4];
- dstj[1] -= dsti[1] * srcj[4];
- dstj[2] -= dsti[2] * srcj[4];
- srcj[5] -= srci[5] * srcj[4];
- srcj = src[3];
- dstj = dst[3];
- dstj[0] -= dsti[0] * srcj[4];
- dstj[1] -= dsti[1] * srcj[4];
- dstj[2] -= dsti[2] * srcj[4];
- dstj[3] -= dsti[3] * srcj[4];
- srcj[5] -= srci[5] * srcj[4];
- srcj = src[5];
- dstj = dst[5];
- dstj[0] -= dsti[0] * srcj[4];
- dstj[1] -= dsti[1] * srcj[4];
- dstj[2] -= dsti[2] * srcj[4];
- dstj[3] -= dsti[3] * srcj[4];
- dstj[4] = -diag * srcj[4];
- srcj[5] -= srci[5] * srcj[4];
- srci = src[5];
- dsti = dst[5];
- diag = 1 / srci[5];
- dsti[5] = diag;
- dsti[0] *= diag;
- dsti[1] *= diag;
- dsti[2] *= diag;
- dsti[3] *= diag;
- dsti[4] *= diag;
- srcj = src[0];
- dstj = dst[0];
- dstj[0] -= dsti[0] * srcj[5];
- srcj = src[1];
- dstj = dst[1];
- dstj[0] -= dsti[0] * srcj[5];
- dstj[1] -= dsti[1] * srcj[5];
- srcj = src[2];
- dstj = dst[2];
- dstj[0] -= dsti[0] * srcj[5];
- dstj[1] -= dsti[1] * srcj[5];
- dstj[2] -= dsti[2] * srcj[5];
- srcj = src[3];
- dstj = dst[3];
- dstj[0] -= dsti[0] * srcj[5];
- dstj[1] -= dsti[1] * srcj[5];
- dstj[2] -= dsti[2] * srcj[5];
- dstj[3] -= dsti[3] * srcj[5];
- srcj = src[4];
- dstj = dst[4];
- dstj[0] -= dsti[0] * srcj[5];
- dstj[1] -= dsti[1] * srcj[5];
- dstj[2] -= dsti[2] * srcj[5];
- dstj[3] -= dsti[3] * srcj[5];
- dstj[4] -= dsti[4] * srcj[5];
- dsti = dst[1];
- dst[0][1] = dsti[0];
- dsti = dst[2];
- dst[0][2] = dsti[0];
- dst[1][2] = dsti[1];
- dsti = dst[3];
- dst[0][3] = dsti[0];
- dst[1][3] = dsti[1];
- dst[2][3] = dsti[2];
- dsti = dst[4];
- dst[0][4] = dsti[0];
- dst[1][4] = dsti[1];
- dst[2][4] = dsti[2];
- dst[3][4] = dsti[3];
- dsti = dst[5];
- dst[0][5] = dsti[0];
- dst[1][5] = dsti[1];
- dst[2][5] = dsti[2];
- dst[3][5] = dsti[3];
- dst[4][5] = dsti[4];
- break;
- default:
- let _g1 = 0;
- while(_g1 < size) {
- let i = _g1++;
- srci = src[i];
- dsti = dst[i];
- let diag = 1 / srci[i];
- dsti[i] = diag;
- let _g = 0;
- while(_g < i) dsti[_g++] *= diag;
- let _g2 = i + 1;
- while(_g2 < size) srci[_g2++] *= diag;
- let _g3 = 0;
- while(_g3 < i) {
- let j = _g3++;
- srcj = src[j];
- dstj = dst[j];
- let _g = 0;
- let _g1 = j + 1;
- while(_g < _g1) {
- let k = _g++;
- dstj[k] -= dsti[k] * srcj[i];
- }
- let _g2 = i + 1;
- while(_g2 < size) {
- let k = _g2++;
- srcj[k] -= srci[k] * srcj[i];
- }
- }
- let _g4 = i + 1;
- while(_g4 < size) {
- let j = _g4++;
- srcj = src[j];
- dstj = dst[j];
- let _g = 0;
- while(_g < i) {
- let k = _g++;
- dstj[k] -= dsti[k] * srcj[i];
- }
- dstj[i] = -diag * srcj[i];
- let _g1 = i + 1;
- while(_g1 < size) {
- let k = _g1++;
- srcj[k] -= srci[k] * srcj[i];
- }
- }
- }
- let _g2 = 1;
- while(_g2 < size) {
- let i = _g2++;
- dsti = dst[i];
- let _g = 0;
- while(_g < i) {
- let j = _g++;
- dst[j][i] = dsti[j];
- }
- }
- }
- }
- computeInvMass(info,massData) {
- let invMass = this._invMass;
- let invMassWithoutCfm = this._invMassWithoutCfm;
- let numRows = info.numRows;
- let b1 = info.b1;
- let b2 = info.b2;
- let invM1 = b1._invMass;
- let invM2 = b2._invMass;
- let invI100;
- let invI101;
- let invI102;
- let invI110;
- let invI111;
- let invI112;
- let invI120;
- let invI121;
- let invI122;
- let invI200;
- let invI201;
- let invI202;
- let invI210;
- let invI211;
- let invI212;
- let invI220;
- let invI221;
- let invI222;
- invI100 = b1._invInertia00;
- invI101 = b1._invInertia01;
- invI102 = b1._invInertia02;
- invI110 = b1._invInertia10;
- invI111 = b1._invInertia11;
- invI112 = b1._invInertia12;
- invI120 = b1._invInertia20;
- invI121 = b1._invInertia21;
- invI122 = b1._invInertia22;
- invI200 = b2._invInertia00;
- invI201 = b2._invInertia01;
- invI202 = b2._invInertia02;
- invI210 = b2._invInertia10;
- invI211 = b2._invInertia11;
- invI212 = b2._invInertia12;
- invI220 = b2._invInertia20;
- invI221 = b2._invInertia21;
- invI222 = b2._invInertia22;
- let _g = 0;
- while(_g < numRows) {
- let i = _g++;
- let j = info.rows[i].jacobian;
- let md = massData[i];
- j.updateSparsity();
- if((j.flag & 1) != 0) {
- md.invMLin1X = j.lin1X * invM1;
- md.invMLin1Y = j.lin1Y * invM1;
- md.invMLin1Z = j.lin1Z * invM1;
- md.invMLin2X = j.lin2X * invM2;
- md.invMLin2Y = j.lin2Y * invM2;
- md.invMLin2Z = j.lin2Z * invM2;
- } else {
- md.invMLin1X = 0;
- md.invMLin1Y = 0;
- md.invMLin1Z = 0;
- md.invMLin2X = 0;
- md.invMLin2Y = 0;
- md.invMLin2Z = 0;
- }
- if((j.flag & 2) != 0) {
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = invI100 * j.ang1X + invI101 * j.ang1Y + invI102 * j.ang1Z;
- __tmp__Y = invI110 * j.ang1X + invI111 * j.ang1Y + invI112 * j.ang1Z;
- __tmp__Z = invI120 * j.ang1X + invI121 * j.ang1Y + invI122 * j.ang1Z;
- md.invMAng1X = __tmp__X;
- md.invMAng1Y = __tmp__Y;
- md.invMAng1Z = __tmp__Z;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = invI200 * j.ang2X + invI201 * j.ang2Y + invI202 * j.ang2Z;
- __tmp__Y1 = invI210 * j.ang2X + invI211 * j.ang2Y + invI212 * j.ang2Z;
- __tmp__Z1 = invI220 * j.ang2X + invI221 * j.ang2Y + invI222 * j.ang2Z;
- md.invMAng2X = __tmp__X1;
- md.invMAng2Y = __tmp__Y1;
- md.invMAng2Z = __tmp__Z1;
- } else {
- md.invMAng1X = 0;
- md.invMAng1Y = 0;
- md.invMAng1Z = 0;
- md.invMAng2X = 0;
- md.invMAng2Y = 0;
- md.invMAng2Z = 0;
- }
- }
- let _g1 = 0;
- while(_g1 < numRows) {
- let i = _g1++;
- let j1 = info.rows[i].jacobian;
- let _g = i;
- while(_g < numRows) {
- let j = _g++;
- let md2 = massData[j];
- let val = j1.lin1X * md2.invMLin1X + j1.lin1Y * md2.invMLin1Y + j1.lin1Z * md2.invMLin1Z + (j1.ang1X * md2.invMAng1X + j1.ang1Y * md2.invMAng1Y + j1.ang1Z * md2.invMAng1Z) + (j1.lin2X * md2.invMLin2X + j1.lin2Y * md2.invMLin2Y + j1.lin2Z * md2.invMLin2Z) + (j1.ang2X * md2.invMAng2X + j1.ang2Y * md2.invMAng2Y + j1.ang2Z * md2.invMAng2Z);
- if(i == j) {
- invMass[i][j] = val + info.rows[i].cfm;
- invMassWithoutCfm[i][j] = val;
- md2.mass = val + info.rows[i].cfm;
- md2.massWithoutCfm = val;
- if(md2.mass != 0) {
- md2.mass = 1 / md2.mass;
- }
- if(md2.massWithoutCfm != 0) {
- md2.massWithoutCfm = 1 / md2.massWithoutCfm;
- }
- } else {
- invMass[i][j] = val;
- invMass[j][i] = val;
- invMassWithoutCfm[i][j] = val;
- invMassWithoutCfm[j][i] = val;
- }
- }
- }
- let _g2 = 0;
- let _g3 = this._maxSubmatrixId;
- while(_g2 < _g3) this._cacheComputed[_g2++] = false;
- }
- }
- if(!oimo.dynamics.constraint.solver.pgs) oimo.dynamics.constraint.solver.pgs = {};
- oimo.dynamics.constraint.solver.pgs.PgsContactConstraintSolver = class oimo_dynamics_constraint_solver_pgs_PgsContactConstraintSolver extends oimo.dynamics.constraint.ConstraintSolver {
- constructor(constraint) {
- super();
- this.constraint = constraint;
- this.info = new oimo.dynamics.constraint.info.contact.ContactSolverInfo();
- this.massData = new Array(oimo.common.Setting.maxManifoldPoints);
- let _g = 0;
- let _g1 = this.massData.length;
- while(_g < _g1) this.massData[_g++] = new oimo.dynamics.constraint.solver.common.ContactSolverMassDataRow();
- }
- preSolveVelocity(timeStep) {
- this.constraint._getVelocitySolverInfo(timeStep,this.info);
- this._b1 = this.info.b1;
- this._b2 = this.info.b2;
- let invM1 = this._b1._invMass;
- let invM2 = this._b2._invMass;
- let invI100;
- let invI101;
- let invI102;
- let invI110;
- let invI111;
- let invI112;
- let invI120;
- let invI121;
- let invI122;
- let invI200;
- let invI201;
- let invI202;
- let invI210;
- let invI211;
- let invI212;
- let invI220;
- let invI221;
- let invI222;
- invI100 = this._b1._invInertia00;
- invI101 = this._b1._invInertia01;
- invI102 = this._b1._invInertia02;
- invI110 = this._b1._invInertia10;
- invI111 = this._b1._invInertia11;
- invI112 = this._b1._invInertia12;
- invI120 = this._b1._invInertia20;
- invI121 = this._b1._invInertia21;
- invI122 = this._b1._invInertia22;
- invI200 = this._b2._invInertia00;
- invI201 = this._b2._invInertia01;
- invI202 = this._b2._invInertia02;
- invI210 = this._b2._invInertia10;
- invI211 = this._b2._invInertia11;
- invI212 = this._b2._invInertia12;
- invI220 = this._b2._invInertia20;
- invI221 = this._b2._invInertia21;
- invI222 = this._b2._invInertia22;
- let _g = 0;
- let _g1 = this.info.numRows;
- while(_g < _g1) {
- let i = _g++;
- let row = this.info.rows[i];
- let md = this.massData[i];
- let j = row.jacobianN;
- md.invMLinN1X = j.lin1X * invM1;
- md.invMLinN1Y = j.lin1Y * invM1;
- md.invMLinN1Z = j.lin1Z * invM1;
- md.invMLinN2X = j.lin2X * invM2;
- md.invMLinN2Y = j.lin2Y * invM2;
- md.invMLinN2Z = j.lin2Z * invM2;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = invI100 * j.ang1X + invI101 * j.ang1Y + invI102 * j.ang1Z;
- __tmp__Y = invI110 * j.ang1X + invI111 * j.ang1Y + invI112 * j.ang1Z;
- __tmp__Z = invI120 * j.ang1X + invI121 * j.ang1Y + invI122 * j.ang1Z;
- md.invMAngN1X = __tmp__X;
- md.invMAngN1Y = __tmp__Y;
- md.invMAngN1Z = __tmp__Z;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = invI200 * j.ang2X + invI201 * j.ang2Y + invI202 * j.ang2Z;
- __tmp__Y1 = invI210 * j.ang2X + invI211 * j.ang2Y + invI212 * j.ang2Z;
- __tmp__Z1 = invI220 * j.ang2X + invI221 * j.ang2Y + invI222 * j.ang2Z;
- md.invMAngN2X = __tmp__X1;
- md.invMAngN2Y = __tmp__Y1;
- md.invMAngN2Z = __tmp__Z1;
- md.massN = invM1 + invM2 + (md.invMAngN1X * j.ang1X + md.invMAngN1Y * j.ang1Y + md.invMAngN1Z * j.ang1Z) + (md.invMAngN2X * j.ang2X + md.invMAngN2Y * j.ang2Y + md.invMAngN2Z * j.ang2Z);
- if(md.massN != 0) {
- md.massN = 1 / md.massN;
- }
- let jt = row.jacobianT;
- let jb = row.jacobianB;
- md.invMLinT1X = jt.lin1X * invM1;
- md.invMLinT1Y = jt.lin1Y * invM1;
- md.invMLinT1Z = jt.lin1Z * invM1;
- md.invMLinT2X = jt.lin2X * invM2;
- md.invMLinT2Y = jt.lin2Y * invM2;
- md.invMLinT2Z = jt.lin2Z * invM2;
- md.invMLinB1X = jb.lin1X * invM1;
- md.invMLinB1Y = jb.lin1Y * invM1;
- md.invMLinB1Z = jb.lin1Z * invM1;
- md.invMLinB2X = jb.lin2X * invM2;
- md.invMLinB2Y = jb.lin2Y * invM2;
- md.invMLinB2Z = jb.lin2Z * invM2;
- let __tmp__X2;
- let __tmp__Y2;
- let __tmp__Z2;
- __tmp__X2 = invI100 * jt.ang1X + invI101 * jt.ang1Y + invI102 * jt.ang1Z;
- __tmp__Y2 = invI110 * jt.ang1X + invI111 * jt.ang1Y + invI112 * jt.ang1Z;
- __tmp__Z2 = invI120 * jt.ang1X + invI121 * jt.ang1Y + invI122 * jt.ang1Z;
- md.invMAngT1X = __tmp__X2;
- md.invMAngT1Y = __tmp__Y2;
- md.invMAngT1Z = __tmp__Z2;
- let __tmp__X3;
- let __tmp__Y3;
- let __tmp__Z3;
- __tmp__X3 = invI200 * jt.ang2X + invI201 * jt.ang2Y + invI202 * jt.ang2Z;
- __tmp__Y3 = invI210 * jt.ang2X + invI211 * jt.ang2Y + invI212 * jt.ang2Z;
- __tmp__Z3 = invI220 * jt.ang2X + invI221 * jt.ang2Y + invI222 * jt.ang2Z;
- md.invMAngT2X = __tmp__X3;
- md.invMAngT2Y = __tmp__Y3;
- md.invMAngT2Z = __tmp__Z3;
- let __tmp__X4;
- let __tmp__Y4;
- let __tmp__Z4;
- __tmp__X4 = invI100 * jb.ang1X + invI101 * jb.ang1Y + invI102 * jb.ang1Z;
- __tmp__Y4 = invI110 * jb.ang1X + invI111 * jb.ang1Y + invI112 * jb.ang1Z;
- __tmp__Z4 = invI120 * jb.ang1X + invI121 * jb.ang1Y + invI122 * jb.ang1Z;
- md.invMAngB1X = __tmp__X4;
- md.invMAngB1Y = __tmp__Y4;
- md.invMAngB1Z = __tmp__Z4;
- let __tmp__X5;
- let __tmp__Y5;
- let __tmp__Z5;
- __tmp__X5 = invI200 * jb.ang2X + invI201 * jb.ang2Y + invI202 * jb.ang2Z;
- __tmp__Y5 = invI210 * jb.ang2X + invI211 * jb.ang2Y + invI212 * jb.ang2Z;
- __tmp__Z5 = invI220 * jb.ang2X + invI221 * jb.ang2Y + invI222 * jb.ang2Z;
- md.invMAngB2X = __tmp__X5;
- md.invMAngB2Y = __tmp__Y5;
- md.invMAngB2Z = __tmp__Z5;
- let invMassTB00 = invM1 + invM2 + (md.invMAngT1X * jt.ang1X + md.invMAngT1Y * jt.ang1Y + md.invMAngT1Z * jt.ang1Z) + (md.invMAngT2X * jt.ang2X + md.invMAngT2Y * jt.ang2Y + md.invMAngT2Z * jt.ang2Z);
- let invMassTB01 = md.invMAngT1X * jb.ang1X + md.invMAngT1Y * jb.ang1Y + md.invMAngT1Z * jb.ang1Z + (md.invMAngT2X * jb.ang2X + md.invMAngT2Y * jb.ang2Y + md.invMAngT2Z * jb.ang2Z);
- let invMassTB11 = invM1 + invM2 + (md.invMAngB1X * jb.ang1X + md.invMAngB1Y * jb.ang1Y + md.invMAngB1Z * jb.ang1Z) + (md.invMAngB2X * jb.ang2X + md.invMAngB2Y * jb.ang2Y + md.invMAngB2Z * jb.ang2Z);
- let invDet = invMassTB00 * invMassTB11 - invMassTB01 * invMassTB01;
- if(invDet != 0) {
- invDet = 1 / invDet;
- }
- md.massTB00 = invMassTB11 * invDet;
- md.massTB01 = -invMassTB01 * invDet;
- md.massTB10 = -invMassTB01 * invDet;
- md.massTB11 = invMassTB00 * invDet;
- }
- }
- warmStart(timeStep) {
- let lv1X;
- let lv1Y;
- let lv1Z;
- let lv2X;
- let lv2Y;
- let lv2Z;
- let av1X;
- let av1Y;
- let av1Z;
- let av2X;
- let av2Y;
- let av2Z;
- lv1X = this._b1._velX;
- lv1Y = this._b1._velY;
- lv1Z = this._b1._velZ;
- lv2X = this._b2._velX;
- lv2Y = this._b2._velY;
- lv2Z = this._b2._velZ;
- av1X = this._b1._angVelX;
- av1Y = this._b1._angVelY;
- av1Z = this._b1._angVelZ;
- av2X = this._b2._angVelX;
- av2Y = this._b2._angVelY;
- av2Z = this._b2._angVelZ;
- let _g = 0;
- let _g1 = this.info.numRows;
- while(_g < _g1) {
- let i = _g++;
- let row = this.info.rows[i];
- let imp = row.impulse;
- let md = this.massData[i];
- let jt = row.jacobianT;
- let jb = row.jacobianB;
- let impulseN = imp.impulseN;
- let impulseT = imp.impulseLX * jt.lin1X + imp.impulseLY * jt.lin1Y + imp.impulseLZ * jt.lin1Z;
- let impulseB = imp.impulseLX * jb.lin1X + imp.impulseLY * jb.lin1Y + imp.impulseLZ * jb.lin1Z;
- imp.impulseT = impulseT;
- imp.impulseB = impulseB;
- imp.impulseN *= timeStep.dtRatio;
- imp.impulseT *= timeStep.dtRatio;
- imp.impulseB *= timeStep.dtRatio;
- lv1X += md.invMLinN1X * impulseN;
- lv1Y += md.invMLinN1Y * impulseN;
- lv1Z += md.invMLinN1Z * impulseN;
- lv1X += md.invMLinT1X * impulseT;
- lv1Y += md.invMLinT1Y * impulseT;
- lv1Z += md.invMLinT1Z * impulseT;
- lv1X += md.invMLinB1X * impulseB;
- lv1Y += md.invMLinB1Y * impulseB;
- lv1Z += md.invMLinB1Z * impulseB;
- lv2X += md.invMLinN2X * -impulseN;
- lv2Y += md.invMLinN2Y * -impulseN;
- lv2Z += md.invMLinN2Z * -impulseN;
- lv2X += md.invMLinT2X * -impulseT;
- lv2Y += md.invMLinT2Y * -impulseT;
- lv2Z += md.invMLinT2Z * -impulseT;
- lv2X += md.invMLinB2X * -impulseB;
- lv2Y += md.invMLinB2Y * -impulseB;
- lv2Z += md.invMLinB2Z * -impulseB;
- av1X += md.invMAngN1X * impulseN;
- av1Y += md.invMAngN1Y * impulseN;
- av1Z += md.invMAngN1Z * impulseN;
- av1X += md.invMAngT1X * impulseT;
- av1Y += md.invMAngT1Y * impulseT;
- av1Z += md.invMAngT1Z * impulseT;
- av1X += md.invMAngB1X * impulseB;
- av1Y += md.invMAngB1Y * impulseB;
- av1Z += md.invMAngB1Z * impulseB;
- av2X += md.invMAngN2X * -impulseN;
- av2Y += md.invMAngN2Y * -impulseN;
- av2Z += md.invMAngN2Z * -impulseN;
- av2X += md.invMAngT2X * -impulseT;
- av2Y += md.invMAngT2Y * -impulseT;
- av2Z += md.invMAngT2Z * -impulseT;
- av2X += md.invMAngB2X * -impulseB;
- av2Y += md.invMAngB2Y * -impulseB;
- av2Z += md.invMAngB2Z * -impulseB;
- }
- this._b1._velX = lv1X;
- this._b1._velY = lv1Y;
- this._b1._velZ = lv1Z;
- this._b2._velX = lv2X;
- this._b2._velY = lv2Y;
- this._b2._velZ = lv2Z;
- this._b1._angVelX = av1X;
- this._b1._angVelY = av1Y;
- this._b1._angVelZ = av1Z;
- this._b2._angVelX = av2X;
- this._b2._angVelY = av2Y;
- this._b2._angVelZ = av2Z;
- }
- solveVelocity() {
- let lv1X;
- let lv1Y;
- let lv1Z;
- let lv2X;
- let lv2Y;
- let lv2Z;
- let av1X;
- let av1Y;
- let av1Z;
- let av2X;
- let av2Y;
- let av2Z;
- lv1X = this._b1._velX;
- lv1Y = this._b1._velY;
- lv1Z = this._b1._velZ;
- lv2X = this._b2._velX;
- lv2Y = this._b2._velY;
- lv2Z = this._b2._velZ;
- av1X = this._b1._angVelX;
- av1Y = this._b1._angVelY;
- av1Z = this._b1._angVelZ;
- av2X = this._b2._angVelX;
- av2Y = this._b2._angVelY;
- av2Z = this._b2._angVelZ;
- let _g = 0;
- let _g1 = this.info.numRows;
- while(_g < _g1) {
- let i = _g++;
- let row = this.info.rows[i];
- let md = this.massData[i];
- let imp = row.impulse;
- let rvt = 0;
- let j = row.jacobianT;
- rvt += lv1X * j.lin1X + lv1Y * j.lin1Y + lv1Z * j.lin1Z;
- rvt -= lv2X * j.lin2X + lv2Y * j.lin2Y + lv2Z * j.lin2Z;
- rvt += av1X * j.ang1X + av1Y * j.ang1Y + av1Z * j.ang1Z;
- rvt -= av2X * j.ang2X + av2Y * j.ang2Y + av2Z * j.ang2Z;
- let rvb = 0;
- j = row.jacobianB;
- rvb += lv1X * j.lin1X + lv1Y * j.lin1Y + lv1Z * j.lin1Z;
- rvb -= lv2X * j.lin2X + lv2Y * j.lin2Y + lv2Z * j.lin2Z;
- rvb += av1X * j.ang1X + av1Y * j.ang1Y + av1Z * j.ang1Z;
- rvb -= av2X * j.ang2X + av2Y * j.ang2Y + av2Z * j.ang2Z;
- let impulseT = -(rvt * md.massTB00 + rvb * md.massTB01);
- let impulseB = -(rvt * md.massTB10 + rvb * md.massTB11);
- let oldImpulseT = imp.impulseT;
- let oldImpulseB = imp.impulseB;
- imp.impulseT += impulseT;
- imp.impulseB += impulseB;
- let maxImpulse = row.friction * imp.impulseN;
- if(maxImpulse == 0) {
- imp.impulseT = 0;
- imp.impulseB = 0;
- } else {
- let impulseLengthSq = imp.impulseT * imp.impulseT + imp.impulseB * imp.impulseB;
- if(impulseLengthSq > maxImpulse * maxImpulse) {
- let invL = maxImpulse / Math.sqrt(impulseLengthSq);
- imp.impulseT *= invL;
- imp.impulseB *= invL;
- }
- }
- impulseT = imp.impulseT - oldImpulseT;
- impulseB = imp.impulseB - oldImpulseB;
- lv1X += md.invMLinT1X * impulseT;
- lv1Y += md.invMLinT1Y * impulseT;
- lv1Z += md.invMLinT1Z * impulseT;
- lv1X += md.invMLinB1X * impulseB;
- lv1Y += md.invMLinB1Y * impulseB;
- lv1Z += md.invMLinB1Z * impulseB;
- lv2X += md.invMLinT2X * -impulseT;
- lv2Y += md.invMLinT2Y * -impulseT;
- lv2Z += md.invMLinT2Z * -impulseT;
- lv2X += md.invMLinB2X * -impulseB;
- lv2Y += md.invMLinB2Y * -impulseB;
- lv2Z += md.invMLinB2Z * -impulseB;
- av1X += md.invMAngT1X * impulseT;
- av1Y += md.invMAngT1Y * impulseT;
- av1Z += md.invMAngT1Z * impulseT;
- av1X += md.invMAngB1X * impulseB;
- av1Y += md.invMAngB1Y * impulseB;
- av1Z += md.invMAngB1Z * impulseB;
- av2X += md.invMAngT2X * -impulseT;
- av2Y += md.invMAngT2Y * -impulseT;
- av2Z += md.invMAngT2Z * -impulseT;
- av2X += md.invMAngB2X * -impulseB;
- av2Y += md.invMAngB2Y * -impulseB;
- av2Z += md.invMAngB2Z * -impulseB;
- }
- let _g2 = 0;
- let _g3 = this.info.numRows;
- while(_g2 < _g3) {
- let i = _g2++;
- let row = this.info.rows[i];
- let md = this.massData[i];
- let imp = row.impulse;
- let rvn = 0;
- let j = row.jacobianN;
- rvn += lv1X * j.lin1X + lv1Y * j.lin1Y + lv1Z * j.lin1Z;
- rvn -= lv2X * j.lin2X + lv2Y * j.lin2Y + lv2Z * j.lin2Z;
- rvn += av1X * j.ang1X + av1Y * j.ang1Y + av1Z * j.ang1Z;
- rvn -= av2X * j.ang2X + av2Y * j.ang2Y + av2Z * j.ang2Z;
- let impulseN = (row.rhs - rvn) * md.massN;
- let oldImpulseN = imp.impulseN;
- imp.impulseN += impulseN;
- if(imp.impulseN < 0) {
- imp.impulseN = 0;
- }
- impulseN = imp.impulseN - oldImpulseN;
- lv1X += md.invMLinN1X * impulseN;
- lv1Y += md.invMLinN1Y * impulseN;
- lv1Z += md.invMLinN1Z * impulseN;
- lv2X += md.invMLinN2X * -impulseN;
- lv2Y += md.invMLinN2Y * -impulseN;
- lv2Z += md.invMLinN2Z * -impulseN;
- av1X += md.invMAngN1X * impulseN;
- av1Y += md.invMAngN1Y * impulseN;
- av1Z += md.invMAngN1Z * impulseN;
- av2X += md.invMAngN2X * -impulseN;
- av2Y += md.invMAngN2Y * -impulseN;
- av2Z += md.invMAngN2Z * -impulseN;
- }
- this._b1._velX = lv1X;
- this._b1._velY = lv1Y;
- this._b1._velZ = lv1Z;
- this._b2._velX = lv2X;
- this._b2._velY = lv2Y;
- this._b2._velZ = lv2Z;
- this._b1._angVelX = av1X;
- this._b1._angVelY = av1Y;
- this._b1._angVelZ = av1Z;
- this._b2._angVelX = av2X;
- this._b2._angVelY = av2Y;
- this._b2._angVelZ = av2Z;
- }
- preSolvePosition(timeStep) {
- this.constraint._syncManifold();
- this.constraint._getPositionSolverInfo(this.info);
- let invM1 = this._b1._invMass;
- let invM2 = this._b2._invMass;
- let invI100;
- let invI101;
- let invI102;
- let invI110;
- let invI111;
- let invI112;
- let invI120;
- let invI121;
- let invI122;
- let invI200;
- let invI201;
- let invI202;
- let invI210;
- let invI211;
- let invI212;
- let invI220;
- let invI221;
- let invI222;
- invI100 = this._b1._invInertia00;
- invI101 = this._b1._invInertia01;
- invI102 = this._b1._invInertia02;
- invI110 = this._b1._invInertia10;
- invI111 = this._b1._invInertia11;
- invI112 = this._b1._invInertia12;
- invI120 = this._b1._invInertia20;
- invI121 = this._b1._invInertia21;
- invI122 = this._b1._invInertia22;
- invI200 = this._b2._invInertia00;
- invI201 = this._b2._invInertia01;
- invI202 = this._b2._invInertia02;
- invI210 = this._b2._invInertia10;
- invI211 = this._b2._invInertia11;
- invI212 = this._b2._invInertia12;
- invI220 = this._b2._invInertia20;
- invI221 = this._b2._invInertia21;
- invI222 = this._b2._invInertia22;
- let _g = 0;
- let _g1 = this.info.numRows;
- while(_g < _g1) {
- let i = _g++;
- let md = this.massData[i];
- let j = this.info.rows[i].jacobianN;
- md.invMLinN1X = j.lin1X * invM1;
- md.invMLinN1Y = j.lin1Y * invM1;
- md.invMLinN1Z = j.lin1Z * invM1;
- md.invMLinN2X = j.lin2X * invM2;
- md.invMLinN2Y = j.lin2Y * invM2;
- md.invMLinN2Z = j.lin2Z * invM2;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = invI100 * j.ang1X + invI101 * j.ang1Y + invI102 * j.ang1Z;
- __tmp__Y = invI110 * j.ang1X + invI111 * j.ang1Y + invI112 * j.ang1Z;
- __tmp__Z = invI120 * j.ang1X + invI121 * j.ang1Y + invI122 * j.ang1Z;
- md.invMAngN1X = __tmp__X;
- md.invMAngN1Y = __tmp__Y;
- md.invMAngN1Z = __tmp__Z;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = invI200 * j.ang2X + invI201 * j.ang2Y + invI202 * j.ang2Z;
- __tmp__Y1 = invI210 * j.ang2X + invI211 * j.ang2Y + invI212 * j.ang2Z;
- __tmp__Z1 = invI220 * j.ang2X + invI221 * j.ang2Y + invI222 * j.ang2Z;
- md.invMAngN2X = __tmp__X1;
- md.invMAngN2Y = __tmp__Y1;
- md.invMAngN2Z = __tmp__Z1;
- md.massN = invM1 + invM2 + (md.invMAngN1X * j.ang1X + md.invMAngN1Y * j.ang1Y + md.invMAngN1Z * j.ang1Z) + (md.invMAngN2X * j.ang2X + md.invMAngN2Y * j.ang2Y + md.invMAngN2Z * j.ang2Z);
- if(md.massN != 0) {
- md.massN = 1 / md.massN;
- }
- }
- let _g2 = 0;
- let _g3 = this.info.numRows;
- while(_g2 < _g3) this.info.rows[_g2++].impulse.impulseP = 0;
- }
- solvePositionSplitImpulse() {
- let lv1X;
- let lv1Y;
- let lv1Z;
- let lv2X;
- let lv2Y;
- let lv2Z;
- let av1X;
- let av1Y;
- let av1Z;
- let av2X;
- let av2Y;
- let av2Z;
- lv1X = this._b1._pseudoVelX;
- lv1Y = this._b1._pseudoVelY;
- lv1Z = this._b1._pseudoVelZ;
- lv2X = this._b2._pseudoVelX;
- lv2Y = this._b2._pseudoVelY;
- lv2Z = this._b2._pseudoVelZ;
- av1X = this._b1._angPseudoVelX;
- av1Y = this._b1._angPseudoVelY;
- av1Z = this._b1._angPseudoVelZ;
- av2X = this._b2._angPseudoVelX;
- av2Y = this._b2._angPseudoVelY;
- av2Z = this._b2._angPseudoVelZ;
- let _g = 0;
- let _g1 = this.info.numRows;
- while(_g < _g1) {
- let i = _g++;
- let row = this.info.rows[i];
- let md = this.massData[i];
- let imp = row.impulse;
- let j = row.jacobianN;
- let rvn = 0;
- rvn += lv1X * j.lin1X + lv1Y * j.lin1Y + lv1Z * j.lin1Z;
- rvn -= lv2X * j.lin2X + lv2Y * j.lin2Y + lv2Z * j.lin2Z;
- rvn += av1X * j.ang1X + av1Y * j.ang1Y + av1Z * j.ang1Z;
- rvn -= av2X * j.ang2X + av2Y * j.ang2Y + av2Z * j.ang2Z;
- let impulseP = (row.rhs - rvn) * md.massN * oimo.common.Setting.positionSplitImpulseBaumgarte;
- let oldImpulseP = imp.impulseP;
- imp.impulseP += impulseP;
- if(imp.impulseP < 0) {
- imp.impulseP = 0;
- }
- impulseP = imp.impulseP - oldImpulseP;
- lv1X += md.invMLinN1X * impulseP;
- lv1Y += md.invMLinN1Y * impulseP;
- lv1Z += md.invMLinN1Z * impulseP;
- lv2X += md.invMLinN2X * -impulseP;
- lv2Y += md.invMLinN2Y * -impulseP;
- lv2Z += md.invMLinN2Z * -impulseP;
- av1X += md.invMAngN1X * impulseP;
- av1Y += md.invMAngN1Y * impulseP;
- av1Z += md.invMAngN1Z * impulseP;
- av2X += md.invMAngN2X * -impulseP;
- av2Y += md.invMAngN2Y * -impulseP;
- av2Z += md.invMAngN2Z * -impulseP;
- }
- this._b1._pseudoVelX = lv1X;
- this._b1._pseudoVelY = lv1Y;
- this._b1._pseudoVelZ = lv1Z;
- this._b2._pseudoVelX = lv2X;
- this._b2._pseudoVelY = lv2Y;
- this._b2._pseudoVelZ = lv2Z;
- this._b1._angPseudoVelX = av1X;
- this._b1._angPseudoVelY = av1Y;
- this._b1._angPseudoVelZ = av1Z;
- this._b2._angPseudoVelX = av2X;
- this._b2._angPseudoVelY = av2Y;
- this._b2._angPseudoVelZ = av2Z;
- }
- solvePositionNgs(timeStep) {
- this.constraint._syncManifold();
- this.constraint._getPositionSolverInfo(this.info);
- let invM1 = this._b1._invMass;
- let invM2 = this._b2._invMass;
- let invI100;
- let invI101;
- let invI102;
- let invI110;
- let invI111;
- let invI112;
- let invI120;
- let invI121;
- let invI122;
- let invI200;
- let invI201;
- let invI202;
- let invI210;
- let invI211;
- let invI212;
- let invI220;
- let invI221;
- let invI222;
- invI100 = this._b1._invInertia00;
- invI101 = this._b1._invInertia01;
- invI102 = this._b1._invInertia02;
- invI110 = this._b1._invInertia10;
- invI111 = this._b1._invInertia11;
- invI112 = this._b1._invInertia12;
- invI120 = this._b1._invInertia20;
- invI121 = this._b1._invInertia21;
- invI122 = this._b1._invInertia22;
- invI200 = this._b2._invInertia00;
- invI201 = this._b2._invInertia01;
- invI202 = this._b2._invInertia02;
- invI210 = this._b2._invInertia10;
- invI211 = this._b2._invInertia11;
- invI212 = this._b2._invInertia12;
- invI220 = this._b2._invInertia20;
- invI221 = this._b2._invInertia21;
- invI222 = this._b2._invInertia22;
- let _g = 0;
- let _g1 = this.info.numRows;
- while(_g < _g1) {
- let i = _g++;
- let md = this.massData[i];
- let j = this.info.rows[i].jacobianN;
- md.invMLinN1X = j.lin1X * invM1;
- md.invMLinN1Y = j.lin1Y * invM1;
- md.invMLinN1Z = j.lin1Z * invM1;
- md.invMLinN2X = j.lin2X * invM2;
- md.invMLinN2Y = j.lin2Y * invM2;
- md.invMLinN2Z = j.lin2Z * invM2;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = invI100 * j.ang1X + invI101 * j.ang1Y + invI102 * j.ang1Z;
- __tmp__Y = invI110 * j.ang1X + invI111 * j.ang1Y + invI112 * j.ang1Z;
- __tmp__Z = invI120 * j.ang1X + invI121 * j.ang1Y + invI122 * j.ang1Z;
- md.invMAngN1X = __tmp__X;
- md.invMAngN1Y = __tmp__Y;
- md.invMAngN1Z = __tmp__Z;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = invI200 * j.ang2X + invI201 * j.ang2Y + invI202 * j.ang2Z;
- __tmp__Y1 = invI210 * j.ang2X + invI211 * j.ang2Y + invI212 * j.ang2Z;
- __tmp__Z1 = invI220 * j.ang2X + invI221 * j.ang2Y + invI222 * j.ang2Z;
- md.invMAngN2X = __tmp__X1;
- md.invMAngN2Y = __tmp__Y1;
- md.invMAngN2Z = __tmp__Z1;
- md.massN = invM1 + invM2 + (md.invMAngN1X * j.ang1X + md.invMAngN1Y * j.ang1Y + md.invMAngN1Z * j.ang1Z) + (md.invMAngN2X * j.ang2X + md.invMAngN2Y * j.ang2Y + md.invMAngN2Z * j.ang2Z);
- if(md.massN != 0) {
- md.massN = 1 / md.massN;
- }
- }
- let lv1X;
- let lv1Y;
- let lv1Z;
- let lv2X;
- let lv2Y;
- let lv2Z;
- let av1X;
- let av1Y;
- let av1Z;
- let av2X;
- let av2Y;
- let av2Z;
- lv1X = 0;
- lv1Y = 0;
- lv1Z = 0;
- lv2X = 0;
- lv2Y = 0;
- lv2Z = 0;
- av1X = 0;
- av1Y = 0;
- av1Z = 0;
- av2X = 0;
- av2Y = 0;
- av2Z = 0;
- let _g2 = 0;
- let _g3 = this.info.numRows;
- while(_g2 < _g3) {
- let i = _g2++;
- let row = this.info.rows[i];
- let md = this.massData[i];
- let imp = row.impulse;
- let j = row.jacobianN;
- let rvn = 0;
- rvn += lv1X * j.lin1X + lv1Y * j.lin1Y + lv1Z * j.lin1Z;
- rvn -= lv2X * j.lin2X + lv2Y * j.lin2Y + lv2Z * j.lin2Z;
- rvn += av1X * j.ang1X + av1Y * j.ang1Y + av1Z * j.ang1Z;
- rvn -= av2X * j.ang2X + av2Y * j.ang2Y + av2Z * j.ang2Z;
- let impulseP = (row.rhs - rvn) * md.massN * oimo.common.Setting.positionNgsBaumgarte;
- let oldImpulseP = imp.impulseP;
- imp.impulseP += impulseP;
- if(imp.impulseP < 0) {
- imp.impulseP = 0;
- }
- impulseP = imp.impulseP - oldImpulseP;
- lv1X += md.invMLinN1X * impulseP;
- lv1Y += md.invMLinN1Y * impulseP;
- lv1Z += md.invMLinN1Z * impulseP;
- lv2X += md.invMLinN2X * -impulseP;
- lv2Y += md.invMLinN2Y * -impulseP;
- lv2Z += md.invMLinN2Z * -impulseP;
- av1X += md.invMAngN1X * impulseP;
- av1Y += md.invMAngN1Y * impulseP;
- av1Z += md.invMAngN1Z * impulseP;
- av2X += md.invMAngN2X * -impulseP;
- av2Y += md.invMAngN2Y * -impulseP;
- av2Z += md.invMAngN2Z * -impulseP;
- }
- let _this = this._b1;
- _this._transform._positionX += lv1X;
- _this._transform._positionY += lv1Y;
- _this._transform._positionZ += lv1Z;
- let _this1 = this._b2;
- _this1._transform._positionX += lv2X;
- _this1._transform._positionY += lv2Y;
- _this1._transform._positionZ += lv2Z;
- let _this2 = this._b1;
- let theta = Math.sqrt(av1X * av1X + av1Y * av1Y + av1Z * av1Z);
- let halfTheta = theta * 0.5;
- let rotationToSinAxisFactor;
- let cosHalfTheta;
- if(halfTheta < 0.5) {
- let ht2 = halfTheta * halfTheta;
- rotationToSinAxisFactor = 0.5 * (1 - ht2 * 0.16666666666666666 + ht2 * ht2 * 0.0083333333333333332);
- cosHalfTheta = 1 - ht2 * 0.5 + ht2 * ht2 * 0.041666666666666664;
- } else {
- rotationToSinAxisFactor = Math.sin(halfTheta) / theta;
- cosHalfTheta = Math.cos(halfTheta);
- }
- let sinAxisX;
- let sinAxisY;
- let sinAxisZ;
- sinAxisX = av1X * rotationToSinAxisFactor;
- sinAxisY = av1Y * rotationToSinAxisFactor;
- sinAxisZ = av1Z * rotationToSinAxisFactor;
- let dqX;
- let dqY;
- let dqZ;
- let dqW;
- dqX = sinAxisX;
- dqY = sinAxisY;
- dqZ = sinAxisZ;
- dqW = cosHalfTheta;
- let qX;
- let qY;
- let qZ;
- let qW;
- let e00 = _this2._transform._rotation00;
- let e11 = _this2._transform._rotation11;
- let e22 = _this2._transform._rotation22;
- let t = e00 + e11 + e22;
- let s;
- if(t > 0) {
- s = Math.sqrt(t + 1);
- qW = 0.5 * s;
- s = 0.5 / s;
- qX = (_this2._transform._rotation21 - _this2._transform._rotation12) * s;
- qY = (_this2._transform._rotation02 - _this2._transform._rotation20) * s;
- qZ = (_this2._transform._rotation10 - _this2._transform._rotation01) * s;
- } else if(e00 > e11) {
- if(e00 > e22) {
- s = Math.sqrt(e00 - e11 - e22 + 1);
- qX = 0.5 * s;
- s = 0.5 / s;
- qY = (_this2._transform._rotation01 + _this2._transform._rotation10) * s;
- qZ = (_this2._transform._rotation02 + _this2._transform._rotation20) * s;
- qW = (_this2._transform._rotation21 - _this2._transform._rotation12) * s;
- } else {
- s = Math.sqrt(e22 - e00 - e11 + 1);
- qZ = 0.5 * s;
- s = 0.5 / s;
- qX = (_this2._transform._rotation02 + _this2._transform._rotation20) * s;
- qY = (_this2._transform._rotation12 + _this2._transform._rotation21) * s;
- qW = (_this2._transform._rotation10 - _this2._transform._rotation01) * s;
- }
- } else if(e11 > e22) {
- s = Math.sqrt(e11 - e22 - e00 + 1);
- qY = 0.5 * s;
- s = 0.5 / s;
- qX = (_this2._transform._rotation01 + _this2._transform._rotation10) * s;
- qZ = (_this2._transform._rotation12 + _this2._transform._rotation21) * s;
- qW = (_this2._transform._rotation02 - _this2._transform._rotation20) * s;
- } else {
- s = Math.sqrt(e22 - e00 - e11 + 1);
- qZ = 0.5 * s;
- s = 0.5 / s;
- qX = (_this2._transform._rotation02 + _this2._transform._rotation20) * s;
- qY = (_this2._transform._rotation12 + _this2._transform._rotation21) * s;
- qW = (_this2._transform._rotation10 - _this2._transform._rotation01) * s;
- }
- qX = dqW * qX + dqX * qW + dqY * qZ - dqZ * qY;
- qY = dqW * qY - dqX * qZ + dqY * qW + dqZ * qX;
- qZ = dqW * qZ + dqX * qY - dqY * qX + dqZ * qW;
- qW = dqW * qW - dqX * qX - dqY * qY - dqZ * qZ;
- let l = qX * qX + qY * qY + qZ * qZ + qW * qW;
- if(l > 1e-32) {
- l = 1 / Math.sqrt(l);
- }
- qX *= l;
- qY *= l;
- qZ *= l;
- qW *= l;
- let x = qX;
- let y = qY;
- let z = qZ;
- let w = qW;
- let x2 = 2 * x;
- let y2 = 2 * y;
- let z2 = 2 * z;
- let xx = x * x2;
- let yy = y * y2;
- let zz = z * z2;
- let xy = x * y2;
- let yz = y * z2;
- let xz = x * z2;
- let wx = w * x2;
- let wy = w * y2;
- let wz = w * z2;
- _this2._transform._rotation00 = 1 - yy - zz;
- _this2._transform._rotation01 = xy - wz;
- _this2._transform._rotation02 = xz + wy;
- _this2._transform._rotation10 = xy + wz;
- _this2._transform._rotation11 = 1 - xx - zz;
- _this2._transform._rotation12 = yz - wx;
- _this2._transform._rotation20 = xz - wy;
- _this2._transform._rotation21 = yz + wx;
- _this2._transform._rotation22 = 1 - xx - yy;
- let __tmp__00;
- let __tmp__01;
- let __tmp__02;
- let __tmp__10;
- let __tmp__11;
- let __tmp__12;
- let __tmp__20;
- let __tmp__21;
- let __tmp__22;
- __tmp__00 = _this2._transform._rotation00 * _this2._invLocalInertia00 + _this2._transform._rotation01 * _this2._invLocalInertia10 + _this2._transform._rotation02 * _this2._invLocalInertia20;
- __tmp__01 = _this2._transform._rotation00 * _this2._invLocalInertia01 + _this2._transform._rotation01 * _this2._invLocalInertia11 + _this2._transform._rotation02 * _this2._invLocalInertia21;
- __tmp__02 = _this2._transform._rotation00 * _this2._invLocalInertia02 + _this2._transform._rotation01 * _this2._invLocalInertia12 + _this2._transform._rotation02 * _this2._invLocalInertia22;
- __tmp__10 = _this2._transform._rotation10 * _this2._invLocalInertia00 + _this2._transform._rotation11 * _this2._invLocalInertia10 + _this2._transform._rotation12 * _this2._invLocalInertia20;
- __tmp__11 = _this2._transform._rotation10 * _this2._invLocalInertia01 + _this2._transform._rotation11 * _this2._invLocalInertia11 + _this2._transform._rotation12 * _this2._invLocalInertia21;
- __tmp__12 = _this2._transform._rotation10 * _this2._invLocalInertia02 + _this2._transform._rotation11 * _this2._invLocalInertia12 + _this2._transform._rotation12 * _this2._invLocalInertia22;
- __tmp__20 = _this2._transform._rotation20 * _this2._invLocalInertia00 + _this2._transform._rotation21 * _this2._invLocalInertia10 + _this2._transform._rotation22 * _this2._invLocalInertia20;
- __tmp__21 = _this2._transform._rotation20 * _this2._invLocalInertia01 + _this2._transform._rotation21 * _this2._invLocalInertia11 + _this2._transform._rotation22 * _this2._invLocalInertia21;
- __tmp__22 = _this2._transform._rotation20 * _this2._invLocalInertia02 + _this2._transform._rotation21 * _this2._invLocalInertia12 + _this2._transform._rotation22 * _this2._invLocalInertia22;
- _this2._invInertia00 = __tmp__00;
- _this2._invInertia01 = __tmp__01;
- _this2._invInertia02 = __tmp__02;
- _this2._invInertia10 = __tmp__10;
- _this2._invInertia11 = __tmp__11;
- _this2._invInertia12 = __tmp__12;
- _this2._invInertia20 = __tmp__20;
- _this2._invInertia21 = __tmp__21;
- _this2._invInertia22 = __tmp__22;
- let __tmp__001;
- let __tmp__011;
- let __tmp__021;
- let __tmp__101;
- let __tmp__111;
- let __tmp__121;
- let __tmp__201;
- let __tmp__211;
- let __tmp__221;
- __tmp__001 = _this2._invInertia00 * _this2._transform._rotation00 + _this2._invInertia01 * _this2._transform._rotation01 + _this2._invInertia02 * _this2._transform._rotation02;
- __tmp__011 = _this2._invInertia00 * _this2._transform._rotation10 + _this2._invInertia01 * _this2._transform._rotation11 + _this2._invInertia02 * _this2._transform._rotation12;
- __tmp__021 = _this2._invInertia00 * _this2._transform._rotation20 + _this2._invInertia01 * _this2._transform._rotation21 + _this2._invInertia02 * _this2._transform._rotation22;
- __tmp__101 = _this2._invInertia10 * _this2._transform._rotation00 + _this2._invInertia11 * _this2._transform._rotation01 + _this2._invInertia12 * _this2._transform._rotation02;
- __tmp__111 = _this2._invInertia10 * _this2._transform._rotation10 + _this2._invInertia11 * _this2._transform._rotation11 + _this2._invInertia12 * _this2._transform._rotation12;
- __tmp__121 = _this2._invInertia10 * _this2._transform._rotation20 + _this2._invInertia11 * _this2._transform._rotation21 + _this2._invInertia12 * _this2._transform._rotation22;
- __tmp__201 = _this2._invInertia20 * _this2._transform._rotation00 + _this2._invInertia21 * _this2._transform._rotation01 + _this2._invInertia22 * _this2._transform._rotation02;
- __tmp__211 = _this2._invInertia20 * _this2._transform._rotation10 + _this2._invInertia21 * _this2._transform._rotation11 + _this2._invInertia22 * _this2._transform._rotation12;
- __tmp__221 = _this2._invInertia20 * _this2._transform._rotation20 + _this2._invInertia21 * _this2._transform._rotation21 + _this2._invInertia22 * _this2._transform._rotation22;
- _this2._invInertia00 = __tmp__001;
- _this2._invInertia01 = __tmp__011;
- _this2._invInertia02 = __tmp__021;
- _this2._invInertia10 = __tmp__101;
- _this2._invInertia11 = __tmp__111;
- _this2._invInertia12 = __tmp__121;
- _this2._invInertia20 = __tmp__201;
- _this2._invInertia21 = __tmp__211;
- _this2._invInertia22 = __tmp__221;
- _this2._invInertia00 *= _this2._rotFactor.x;
- _this2._invInertia01 *= _this2._rotFactor.x;
- _this2._invInertia02 *= _this2._rotFactor.x;
- _this2._invInertia10 *= _this2._rotFactor.y;
- _this2._invInertia11 *= _this2._rotFactor.y;
- _this2._invInertia12 *= _this2._rotFactor.y;
- _this2._invInertia20 *= _this2._rotFactor.z;
- _this2._invInertia21 *= _this2._rotFactor.z;
- _this2._invInertia22 *= _this2._rotFactor.z;
- let _this3 = this._b2;
- let theta1 = Math.sqrt(av2X * av2X + av2Y * av2Y + av2Z * av2Z);
- let halfTheta1 = theta1 * 0.5;
- let rotationToSinAxisFactor1;
- let cosHalfTheta1;
- if(halfTheta1 < 0.5) {
- let ht2 = halfTheta1 * halfTheta1;
- rotationToSinAxisFactor1 = 0.5 * (1 - ht2 * 0.16666666666666666 + ht2 * ht2 * 0.0083333333333333332);
- cosHalfTheta1 = 1 - ht2 * 0.5 + ht2 * ht2 * 0.041666666666666664;
- } else {
- rotationToSinAxisFactor1 = Math.sin(halfTheta1) / theta1;
- cosHalfTheta1 = Math.cos(halfTheta1);
- }
- let sinAxisX1;
- let sinAxisY1;
- let sinAxisZ1;
- sinAxisX1 = av2X * rotationToSinAxisFactor1;
- sinAxisY1 = av2Y * rotationToSinAxisFactor1;
- sinAxisZ1 = av2Z * rotationToSinAxisFactor1;
- let dqX1;
- let dqY1;
- let dqZ1;
- let dqW1;
- dqX1 = sinAxisX1;
- dqY1 = sinAxisY1;
- dqZ1 = sinAxisZ1;
- dqW1 = cosHalfTheta1;
- let qX1;
- let qY1;
- let qZ1;
- let qW1;
- let e001 = _this3._transform._rotation00;
- let e111 = _this3._transform._rotation11;
- let e221 = _this3._transform._rotation22;
- let t1 = e001 + e111 + e221;
- let s1;
- if(t1 > 0) {
- s1 = Math.sqrt(t1 + 1);
- qW1 = 0.5 * s1;
- s1 = 0.5 / s1;
- qX1 = (_this3._transform._rotation21 - _this3._transform._rotation12) * s1;
- qY1 = (_this3._transform._rotation02 - _this3._transform._rotation20) * s1;
- qZ1 = (_this3._transform._rotation10 - _this3._transform._rotation01) * s1;
- } else if(e001 > e111) {
- if(e001 > e221) {
- s1 = Math.sqrt(e001 - e111 - e221 + 1);
- qX1 = 0.5 * s1;
- s1 = 0.5 / s1;
- qY1 = (_this3._transform._rotation01 + _this3._transform._rotation10) * s1;
- qZ1 = (_this3._transform._rotation02 + _this3._transform._rotation20) * s1;
- qW1 = (_this3._transform._rotation21 - _this3._transform._rotation12) * s1;
- } else {
- s1 = Math.sqrt(e221 - e001 - e111 + 1);
- qZ1 = 0.5 * s1;
- s1 = 0.5 / s1;
- qX1 = (_this3._transform._rotation02 + _this3._transform._rotation20) * s1;
- qY1 = (_this3._transform._rotation12 + _this3._transform._rotation21) * s1;
- qW1 = (_this3._transform._rotation10 - _this3._transform._rotation01) * s1;
- }
- } else if(e111 > e221) {
- s1 = Math.sqrt(e111 - e221 - e001 + 1);
- qY1 = 0.5 * s1;
- s1 = 0.5 / s1;
- qX1 = (_this3._transform._rotation01 + _this3._transform._rotation10) * s1;
- qZ1 = (_this3._transform._rotation12 + _this3._transform._rotation21) * s1;
- qW1 = (_this3._transform._rotation02 - _this3._transform._rotation20) * s1;
- } else {
- s1 = Math.sqrt(e221 - e001 - e111 + 1);
- qZ1 = 0.5 * s1;
- s1 = 0.5 / s1;
- qX1 = (_this3._transform._rotation02 + _this3._transform._rotation20) * s1;
- qY1 = (_this3._transform._rotation12 + _this3._transform._rotation21) * s1;
- qW1 = (_this3._transform._rotation10 - _this3._transform._rotation01) * s1;
- }
- qX1 = dqW1 * qX1 + dqX1 * qW1 + dqY1 * qZ1 - dqZ1 * qY1;
- qY1 = dqW1 * qY1 - dqX1 * qZ1 + dqY1 * qW1 + dqZ1 * qX1;
- qZ1 = dqW1 * qZ1 + dqX1 * qY1 - dqY1 * qX1 + dqZ1 * qW1;
- qW1 = dqW1 * qW1 - dqX1 * qX1 - dqY1 * qY1 - dqZ1 * qZ1;
- let l1 = qX1 * qX1 + qY1 * qY1 + qZ1 * qZ1 + qW1 * qW1;
- if(l1 > 1e-32) {
- l1 = 1 / Math.sqrt(l1);
- }
- qX1 *= l1;
- qY1 *= l1;
- qZ1 *= l1;
- qW1 *= l1;
- let x1 = qX1;
- let y1 = qY1;
- let z1 = qZ1;
- let w1 = qW1;
- let x21 = 2 * x1;
- let y21 = 2 * y1;
- let z21 = 2 * z1;
- let xx1 = x1 * x21;
- let yy1 = y1 * y21;
- let zz1 = z1 * z21;
- let xy1 = x1 * y21;
- let yz1 = y1 * z21;
- let xz1 = x1 * z21;
- let wx1 = w1 * x21;
- let wy1 = w1 * y21;
- let wz1 = w1 * z21;
- _this3._transform._rotation00 = 1 - yy1 - zz1;
- _this3._transform._rotation01 = xy1 - wz1;
- _this3._transform._rotation02 = xz1 + wy1;
- _this3._transform._rotation10 = xy1 + wz1;
- _this3._transform._rotation11 = 1 - xx1 - zz1;
- _this3._transform._rotation12 = yz1 - wx1;
- _this3._transform._rotation20 = xz1 - wy1;
- _this3._transform._rotation21 = yz1 + wx1;
- _this3._transform._rotation22 = 1 - xx1 - yy1;
- let __tmp__002;
- let __tmp__012;
- let __tmp__022;
- let __tmp__102;
- let __tmp__112;
- let __tmp__122;
- let __tmp__202;
- let __tmp__212;
- let __tmp__222;
- __tmp__002 = _this3._transform._rotation00 * _this3._invLocalInertia00 + _this3._transform._rotation01 * _this3._invLocalInertia10 + _this3._transform._rotation02 * _this3._invLocalInertia20;
- __tmp__012 = _this3._transform._rotation00 * _this3._invLocalInertia01 + _this3._transform._rotation01 * _this3._invLocalInertia11 + _this3._transform._rotation02 * _this3._invLocalInertia21;
- __tmp__022 = _this3._transform._rotation00 * _this3._invLocalInertia02 + _this3._transform._rotation01 * _this3._invLocalInertia12 + _this3._transform._rotation02 * _this3._invLocalInertia22;
- __tmp__102 = _this3._transform._rotation10 * _this3._invLocalInertia00 + _this3._transform._rotation11 * _this3._invLocalInertia10 + _this3._transform._rotation12 * _this3._invLocalInertia20;
- __tmp__112 = _this3._transform._rotation10 * _this3._invLocalInertia01 + _this3._transform._rotation11 * _this3._invLocalInertia11 + _this3._transform._rotation12 * _this3._invLocalInertia21;
- __tmp__122 = _this3._transform._rotation10 * _this3._invLocalInertia02 + _this3._transform._rotation11 * _this3._invLocalInertia12 + _this3._transform._rotation12 * _this3._invLocalInertia22;
- __tmp__202 = _this3._transform._rotation20 * _this3._invLocalInertia00 + _this3._transform._rotation21 * _this3._invLocalInertia10 + _this3._transform._rotation22 * _this3._invLocalInertia20;
- __tmp__212 = _this3._transform._rotation20 * _this3._invLocalInertia01 + _this3._transform._rotation21 * _this3._invLocalInertia11 + _this3._transform._rotation22 * _this3._invLocalInertia21;
- __tmp__222 = _this3._transform._rotation20 * _this3._invLocalInertia02 + _this3._transform._rotation21 * _this3._invLocalInertia12 + _this3._transform._rotation22 * _this3._invLocalInertia22;
- _this3._invInertia00 = __tmp__002;
- _this3._invInertia01 = __tmp__012;
- _this3._invInertia02 = __tmp__022;
- _this3._invInertia10 = __tmp__102;
- _this3._invInertia11 = __tmp__112;
- _this3._invInertia12 = __tmp__122;
- _this3._invInertia20 = __tmp__202;
- _this3._invInertia21 = __tmp__212;
- _this3._invInertia22 = __tmp__222;
- let __tmp__003;
- let __tmp__013;
- let __tmp__023;
- let __tmp__103;
- let __tmp__113;
- let __tmp__123;
- let __tmp__203;
- let __tmp__213;
- let __tmp__223;
- __tmp__003 = _this3._invInertia00 * _this3._transform._rotation00 + _this3._invInertia01 * _this3._transform._rotation01 + _this3._invInertia02 * _this3._transform._rotation02;
- __tmp__013 = _this3._invInertia00 * _this3._transform._rotation10 + _this3._invInertia01 * _this3._transform._rotation11 + _this3._invInertia02 * _this3._transform._rotation12;
- __tmp__023 = _this3._invInertia00 * _this3._transform._rotation20 + _this3._invInertia01 * _this3._transform._rotation21 + _this3._invInertia02 * _this3._transform._rotation22;
- __tmp__103 = _this3._invInertia10 * _this3._transform._rotation00 + _this3._invInertia11 * _this3._transform._rotation01 + _this3._invInertia12 * _this3._transform._rotation02;
- __tmp__113 = _this3._invInertia10 * _this3._transform._rotation10 + _this3._invInertia11 * _this3._transform._rotation11 + _this3._invInertia12 * _this3._transform._rotation12;
- __tmp__123 = _this3._invInertia10 * _this3._transform._rotation20 + _this3._invInertia11 * _this3._transform._rotation21 + _this3._invInertia12 * _this3._transform._rotation22;
- __tmp__203 = _this3._invInertia20 * _this3._transform._rotation00 + _this3._invInertia21 * _this3._transform._rotation01 + _this3._invInertia22 * _this3._transform._rotation02;
- __tmp__213 = _this3._invInertia20 * _this3._transform._rotation10 + _this3._invInertia21 * _this3._transform._rotation11 + _this3._invInertia22 * _this3._transform._rotation12;
- __tmp__223 = _this3._invInertia20 * _this3._transform._rotation20 + _this3._invInertia21 * _this3._transform._rotation21 + _this3._invInertia22 * _this3._transform._rotation22;
- _this3._invInertia00 = __tmp__003;
- _this3._invInertia01 = __tmp__013;
- _this3._invInertia02 = __tmp__023;
- _this3._invInertia10 = __tmp__103;
- _this3._invInertia11 = __tmp__113;
- _this3._invInertia12 = __tmp__123;
- _this3._invInertia20 = __tmp__203;
- _this3._invInertia21 = __tmp__213;
- _this3._invInertia22 = __tmp__223;
- _this3._invInertia00 *= _this3._rotFactor.x;
- _this3._invInertia01 *= _this3._rotFactor.x;
- _this3._invInertia02 *= _this3._rotFactor.x;
- _this3._invInertia10 *= _this3._rotFactor.y;
- _this3._invInertia11 *= _this3._rotFactor.y;
- _this3._invInertia12 *= _this3._rotFactor.y;
- _this3._invInertia20 *= _this3._rotFactor.z;
- _this3._invInertia21 *= _this3._rotFactor.z;
- _this3._invInertia22 *= _this3._rotFactor.z;
- }
- postSolve() {
- let lin1X;
- let lin1Y;
- let lin1Z;
- let ang1X;
- let ang1Y;
- let ang1Z;
- let ang2X;
- let ang2Y;
- let ang2Z;
- lin1X = 0;
- lin1Y = 0;
- lin1Z = 0;
- ang1X = 0;
- ang1Y = 0;
- ang1Z = 0;
- ang2X = 0;
- ang2Y = 0;
- ang2Z = 0;
- let _g = 0;
- let _g1 = this.info.numRows;
- while(_g < _g1) {
- let row = this.info.rows[_g++];
- let imp = row.impulse;
- let jn = row.jacobianN;
- let jt = row.jacobianT;
- let jb = row.jacobianB;
- let impN = imp.impulseN;
- let impT = imp.impulseT;
- let impB = imp.impulseB;
- let impulseLX;
- let impulseLY;
- let impulseLZ;
- impulseLX = 0;
- impulseLY = 0;
- impulseLZ = 0;
- impulseLX += jt.lin1X * impT;
- impulseLY += jt.lin1Y * impT;
- impulseLZ += jt.lin1Z * impT;
- impulseLX += jb.lin1X * impB;
- impulseLY += jb.lin1Y * impB;
- impulseLZ += jb.lin1Z * impB;
- imp.impulseLX = impulseLX;
- imp.impulseLY = impulseLY;
- imp.impulseLZ = impulseLZ;
- lin1X += jn.lin1X * impN;
- lin1Y += jn.lin1Y * impN;
- lin1Z += jn.lin1Z * impN;
- ang1X += jn.ang1X * impN;
- ang1Y += jn.ang1Y * impN;
- ang1Z += jn.ang1Z * impN;
- ang2X += jn.ang2X * impN;
- ang2Y += jn.ang2Y * impN;
- ang2Z += jn.ang2Z * impN;
- lin1X += jt.lin1X * impT;
- lin1Y += jt.lin1Y * impT;
- lin1Z += jt.lin1Z * impT;
- ang1X += jt.ang1X * impT;
- ang1Y += jt.ang1Y * impT;
- ang1Z += jt.ang1Z * impT;
- ang2X += jt.ang2X * impT;
- ang2Y += jt.ang2Y * impT;
- ang2Z += jt.ang2Z * impT;
- lin1X += jb.lin1X * impB;
- lin1Y += jb.lin1Y * impB;
- lin1Z += jb.lin1Z * impB;
- ang1X += jb.ang1X * impB;
- ang1Y += jb.ang1Y * impB;
- ang1Z += jb.ang1Z * impB;
- ang2X += jb.ang2X * impB;
- ang2Y += jb.ang2Y * impB;
- ang2Z += jb.ang2Z * impB;
- }
- this._b1._linearContactImpulseX += lin1X;
- this._b1._linearContactImpulseY += lin1Y;
- this._b1._linearContactImpulseZ += lin1Z;
- this._b1._angularContactImpulseX += ang1X;
- this._b1._angularContactImpulseY += ang1Y;
- this._b1._angularContactImpulseZ += ang1Z;
- this._b2._linearContactImpulseX -= lin1X;
- this._b2._linearContactImpulseY -= lin1Y;
- this._b2._linearContactImpulseZ -= lin1Z;
- this._b2._angularContactImpulseX -= ang2X;
- this._b2._angularContactImpulseY -= ang2Y;
- this._b2._angularContactImpulseZ -= ang2Z;
- this.constraint._syncManifold();
- }
- }
- oimo.dynamics.constraint.solver.pgs.PgsJointConstraintSolver = class oimo_dynamics_constraint_solver_pgs_PgsJointConstraintSolver extends oimo.dynamics.constraint.ConstraintSolver {
- constructor(joint) {
- super();
- this.joint = joint;
- this.info = new oimo.dynamics.constraint.info.joint.JointSolverInfo();
- this.massData = new Array(oimo.common.Setting.maxJacobianRows);
- let _g = 0;
- let _g1 = this.massData.length;
- while(_g < _g1) this.massData[_g++] = new oimo.dynamics.constraint.solver.common.JointSolverMassDataRow();
- }
- preSolveVelocity(timeStep) {
- this.joint._syncAnchors();
- this.joint._getVelocitySolverInfo(timeStep,this.info);
- this._b1 = this.info.b1;
- this._b2 = this.info.b2;
- let invM1 = this._b1._invMass;
- let invM2 = this._b2._invMass;
- let invI100;
- let invI101;
- let invI102;
- let invI110;
- let invI111;
- let invI112;
- let invI120;
- let invI121;
- let invI122;
- let invI200;
- let invI201;
- let invI202;
- let invI210;
- let invI211;
- let invI212;
- let invI220;
- let invI221;
- let invI222;
- invI100 = this._b1._invInertia00;
- invI101 = this._b1._invInertia01;
- invI102 = this._b1._invInertia02;
- invI110 = this._b1._invInertia10;
- invI111 = this._b1._invInertia11;
- invI112 = this._b1._invInertia12;
- invI120 = this._b1._invInertia20;
- invI121 = this._b1._invInertia21;
- invI122 = this._b1._invInertia22;
- invI200 = this._b2._invInertia00;
- invI201 = this._b2._invInertia01;
- invI202 = this._b2._invInertia02;
- invI210 = this._b2._invInertia10;
- invI211 = this._b2._invInertia11;
- invI212 = this._b2._invInertia12;
- invI220 = this._b2._invInertia20;
- invI221 = this._b2._invInertia21;
- invI222 = this._b2._invInertia22;
- let _g = 0;
- let _g1 = this.info.numRows;
- while(_g < _g1) {
- let i = _g++;
- let row = this.info.rows[i];
- let md = this.massData[i];
- let j = row.jacobian;
- j.updateSparsity();
- if((j.flag & 1) != 0) {
- md.invMLin1X = j.lin1X * invM1;
- md.invMLin1Y = j.lin1Y * invM1;
- md.invMLin1Z = j.lin1Z * invM1;
- md.invMLin2X = j.lin2X * invM2;
- md.invMLin2Y = j.lin2Y * invM2;
- md.invMLin2Z = j.lin2Z * invM2;
- } else {
- md.invMLin1X = 0;
- md.invMLin1Y = 0;
- md.invMLin1Z = 0;
- md.invMLin2X = 0;
- md.invMLin2Y = 0;
- md.invMLin2Z = 0;
- }
- if((j.flag & 2) != 0) {
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = invI100 * j.ang1X + invI101 * j.ang1Y + invI102 * j.ang1Z;
- __tmp__Y = invI110 * j.ang1X + invI111 * j.ang1Y + invI112 * j.ang1Z;
- __tmp__Z = invI120 * j.ang1X + invI121 * j.ang1Y + invI122 * j.ang1Z;
- md.invMAng1X = __tmp__X;
- md.invMAng1Y = __tmp__Y;
- md.invMAng1Z = __tmp__Z;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = invI200 * j.ang2X + invI201 * j.ang2Y + invI202 * j.ang2Z;
- __tmp__Y1 = invI210 * j.ang2X + invI211 * j.ang2Y + invI212 * j.ang2Z;
- __tmp__Z1 = invI220 * j.ang2X + invI221 * j.ang2Y + invI222 * j.ang2Z;
- md.invMAng2X = __tmp__X1;
- md.invMAng2Y = __tmp__Y1;
- md.invMAng2Z = __tmp__Z1;
- } else {
- md.invMAng1X = 0;
- md.invMAng1Y = 0;
- md.invMAng1Z = 0;
- md.invMAng2X = 0;
- md.invMAng2Y = 0;
- md.invMAng2Z = 0;
- }
- md.massWithoutCfm = md.invMLin1X * j.lin1X + md.invMLin1Y * j.lin1Y + md.invMLin1Z * j.lin1Z + (md.invMLin2X * j.lin2X + md.invMLin2Y * j.lin2Y + md.invMLin2Z * j.lin2Z) + (md.invMAng1X * j.ang1X + md.invMAng1Y * j.ang1Y + md.invMAng1Z * j.ang1Z) + (md.invMAng2X * j.ang2X + md.invMAng2Y * j.ang2Y + md.invMAng2Z * j.ang2Z);
- md.mass = md.massWithoutCfm + row.cfm;
- if(md.massWithoutCfm != 0) {
- md.massWithoutCfm = 1 / md.massWithoutCfm;
- }
- if(md.mass != 0) {
- md.mass = 1 / md.mass;
- }
- }
- }
- warmStart(timeStep) {
- let factor = this.joint._positionCorrectionAlgorithm == oimo.dynamics.constraint.PositionCorrectionAlgorithm.BAUMGARTE ? oimo.common.Setting.jointWarmStartingFactorForBaungarte : oimo.common.Setting.jointWarmStartingFactor;
- factor *= timeStep.dtRatio;
- if(factor <= 0) {
- let _g = 0;
- let _g1 = this.info.numRows;
- while(_g < _g1) {
- let _this = this.info.rows[_g++].impulse;
- _this.impulse = 0;
- _this.impulseM = 0;
- _this.impulseP = 0;
- }
- return;
- }
- let lv1X;
- let lv1Y;
- let lv1Z;
- let lv2X;
- let lv2Y;
- let lv2Z;
- let av1X;
- let av1Y;
- let av1Z;
- let av2X;
- let av2Y;
- let av2Z;
- lv1X = this._b1._velX;
- lv1Y = this._b1._velY;
- lv1Z = this._b1._velZ;
- lv2X = this._b2._velX;
- lv2Y = this._b2._velY;
- lv2Z = this._b2._velZ;
- av1X = this._b1._angVelX;
- av1Y = this._b1._angVelY;
- av1Z = this._b1._angVelZ;
- av2X = this._b2._angVelX;
- av2Y = this._b2._angVelY;
- av2Z = this._b2._angVelZ;
- let _g = 0;
- let _g1 = this.info.numRows;
- while(_g < _g1) {
- let i = _g++;
- let md = this.massData[i];
- let imp = this.info.rows[i].impulse;
- imp.impulse *= factor;
- imp.impulseM *= factor;
- let impulse = imp.impulse + imp.impulseM;
- lv1X += md.invMLin1X * impulse;
- lv1Y += md.invMLin1Y * impulse;
- lv1Z += md.invMLin1Z * impulse;
- lv2X += md.invMLin2X * -impulse;
- lv2Y += md.invMLin2Y * -impulse;
- lv2Z += md.invMLin2Z * -impulse;
- av1X += md.invMAng1X * impulse;
- av1Y += md.invMAng1Y * impulse;
- av1Z += md.invMAng1Z * impulse;
- av2X += md.invMAng2X * -impulse;
- av2Y += md.invMAng2Y * -impulse;
- av2Z += md.invMAng2Z * -impulse;
- }
- this._b1._velX = lv1X;
- this._b1._velY = lv1Y;
- this._b1._velZ = lv1Z;
- this._b2._velX = lv2X;
- this._b2._velY = lv2Y;
- this._b2._velZ = lv2Z;
- this._b1._angVelX = av1X;
- this._b1._angVelY = av1Y;
- this._b1._angVelZ = av1Z;
- this._b2._angVelX = av2X;
- this._b2._angVelY = av2Y;
- this._b2._angVelZ = av2Z;
- }
- solveVelocity() {
- let lv1X;
- let lv1Y;
- let lv1Z;
- let lv2X;
- let lv2Y;
- let lv2Z;
- let av1X;
- let av1Y;
- let av1Z;
- let av2X;
- let av2Y;
- let av2Z;
- lv1X = this._b1._velX;
- lv1Y = this._b1._velY;
- lv1Z = this._b1._velZ;
- lv2X = this._b2._velX;
- lv2Y = this._b2._velY;
- lv2Z = this._b2._velZ;
- av1X = this._b1._angVelX;
- av1Y = this._b1._angVelY;
- av1Z = this._b1._angVelZ;
- av2X = this._b2._angVelX;
- av2Y = this._b2._angVelY;
- av2Z = this._b2._angVelZ;
- let _g = 0;
- let _g1 = this.info.numRows;
- while(_g < _g1) {
- let i = _g++;
- let row = this.info.rows[i];
- let md = this.massData[i];
- let imp = row.impulse;
- let j = row.jacobian;
- if(row.motorMaxImpulse == 0) {
- continue;
- }
- let rv = 0;
- rv += lv1X * j.lin1X + lv1Y * j.lin1Y + lv1Z * j.lin1Z;
- rv -= lv2X * j.lin2X + lv2Y * j.lin2Y + lv2Z * j.lin2Z;
- rv += av1X * j.ang1X + av1Y * j.ang1Y + av1Z * j.ang1Z;
- rv -= av2X * j.ang2X + av2Y * j.ang2Y + av2Z * j.ang2Z;
- let impulseM = (-row.motorSpeed - rv) * md.massWithoutCfm;
- let oldImpulseM = imp.impulseM;
- imp.impulseM += impulseM;
- if(imp.impulseM < -row.motorMaxImpulse) {
- imp.impulseM = -row.motorMaxImpulse;
- } else if(imp.impulseM > row.motorMaxImpulse) {
- imp.impulseM = row.motorMaxImpulse;
- }
- impulseM = imp.impulseM - oldImpulseM;
- if((j.flag & 1) != 0) {
- lv1X += md.invMLin1X * impulseM;
- lv1Y += md.invMLin1Y * impulseM;
- lv1Z += md.invMLin1Z * impulseM;
- lv2X += md.invMLin2X * -impulseM;
- lv2Y += md.invMLin2Y * -impulseM;
- lv2Z += md.invMLin2Z * -impulseM;
- }
- if((j.flag & 2) != 0) {
- av1X += md.invMAng1X * impulseM;
- av1Y += md.invMAng1Y * impulseM;
- av1Z += md.invMAng1Z * impulseM;
- av2X += md.invMAng2X * -impulseM;
- av2Y += md.invMAng2Y * -impulseM;
- av2Z += md.invMAng2Z * -impulseM;
- }
- }
- let _g2 = 0;
- let _g3 = this.info.numRows;
- while(_g2 < _g3) {
- let i = _g2++;
- let row = this.info.rows[i];
- let md = this.massData[i];
- let imp = row.impulse;
- let j = row.jacobian;
- let rv = 0;
- rv += lv1X * j.lin1X + lv1Y * j.lin1Y + lv1Z * j.lin1Z;
- rv -= lv2X * j.lin2X + lv2Y * j.lin2Y + lv2Z * j.lin2Z;
- rv += av1X * j.ang1X + av1Y * j.ang1Y + av1Z * j.ang1Z;
- rv -= av2X * j.ang2X + av2Y * j.ang2Y + av2Z * j.ang2Z;
- let impulse = (row.rhs - rv - imp.impulse * row.cfm) * md.mass;
- let oldImpulse = imp.impulse;
- imp.impulse += impulse;
- if(imp.impulse < row.minImpulse) {
- imp.impulse = row.minImpulse;
- } else if(imp.impulse > row.maxImpulse) {
- imp.impulse = row.maxImpulse;
- }
- impulse = imp.impulse - oldImpulse;
- if((j.flag & 1) != 0) {
- lv1X += md.invMLin1X * impulse;
- lv1Y += md.invMLin1Y * impulse;
- lv1Z += md.invMLin1Z * impulse;
- lv2X += md.invMLin2X * -impulse;
- lv2Y += md.invMLin2Y * -impulse;
- lv2Z += md.invMLin2Z * -impulse;
- }
- if((j.flag & 2) != 0) {
- av1X += md.invMAng1X * impulse;
- av1Y += md.invMAng1Y * impulse;
- av1Z += md.invMAng1Z * impulse;
- av2X += md.invMAng2X * -impulse;
- av2Y += md.invMAng2Y * -impulse;
- av2Z += md.invMAng2Z * -impulse;
- }
- }
- this._b1._velX = lv1X;
- this._b1._velY = lv1Y;
- this._b1._velZ = lv1Z;
- this._b2._velX = lv2X;
- this._b2._velY = lv2Y;
- this._b2._velZ = lv2Z;
- this._b1._angVelX = av1X;
- this._b1._angVelY = av1Y;
- this._b1._angVelZ = av1Z;
- this._b2._angVelX = av2X;
- this._b2._angVelY = av2Y;
- this._b2._angVelZ = av2Z;
- }
- postSolveVelocity(timeStep) {
- let linX;
- let linY;
- let linZ;
- let angX;
- let angY;
- let angZ;
- linX = 0;
- linY = 0;
- linZ = 0;
- angX = 0;
- angY = 0;
- angZ = 0;
- let _g = 0;
- let _g1 = this.info.numRows;
- while(_g < _g1) {
- let row = this.info.rows[_g++];
- let imp = row.impulse;
- let j = row.jacobian;
- if((j.flag & 1) != 0) {
- linX += j.lin1X * imp.impulse;
- linY += j.lin1Y * imp.impulse;
- linZ += j.lin1Z * imp.impulse;
- } else if((j.flag & 2) != 0) {
- angX += j.ang1X * imp.impulse;
- angY += j.ang1Y * imp.impulse;
- angZ += j.ang1Z * imp.impulse;
- }
- }
- this.joint._appliedForceX = linX * timeStep.invDt;
- this.joint._appliedForceY = linY * timeStep.invDt;
- this.joint._appliedForceZ = linZ * timeStep.invDt;
- this.joint._appliedTorqueX = angX * timeStep.invDt;
- this.joint._appliedTorqueY = angY * timeStep.invDt;
- this.joint._appliedTorqueZ = angZ * timeStep.invDt;
- }
- preSolvePosition(timeStep) {
- this.joint._syncAnchors();
- this.joint._getPositionSolverInfo(this.info);
- this._b1 = this.info.b1;
- this._b2 = this.info.b2;
- let invM1 = this._b1._invMass;
- let invM2 = this._b2._invMass;
- let invI100;
- let invI101;
- let invI102;
- let invI110;
- let invI111;
- let invI112;
- let invI120;
- let invI121;
- let invI122;
- let invI200;
- let invI201;
- let invI202;
- let invI210;
- let invI211;
- let invI212;
- let invI220;
- let invI221;
- let invI222;
- invI100 = this._b1._invInertia00;
- invI101 = this._b1._invInertia01;
- invI102 = this._b1._invInertia02;
- invI110 = this._b1._invInertia10;
- invI111 = this._b1._invInertia11;
- invI112 = this._b1._invInertia12;
- invI120 = this._b1._invInertia20;
- invI121 = this._b1._invInertia21;
- invI122 = this._b1._invInertia22;
- invI200 = this._b2._invInertia00;
- invI201 = this._b2._invInertia01;
- invI202 = this._b2._invInertia02;
- invI210 = this._b2._invInertia10;
- invI211 = this._b2._invInertia11;
- invI212 = this._b2._invInertia12;
- invI220 = this._b2._invInertia20;
- invI221 = this._b2._invInertia21;
- invI222 = this._b2._invInertia22;
- let _g = 0;
- let _g1 = this.info.numRows;
- while(_g < _g1) {
- let i = _g++;
- let md = this.massData[i];
- let j = this.info.rows[i].jacobian;
- md.invMLin1X = j.lin1X * invM1;
- md.invMLin1Y = j.lin1Y * invM1;
- md.invMLin1Z = j.lin1Z * invM1;
- md.invMLin2X = j.lin2X * invM2;
- md.invMLin2Y = j.lin2Y * invM2;
- md.invMLin2Z = j.lin2Z * invM2;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = invI100 * j.ang1X + invI101 * j.ang1Y + invI102 * j.ang1Z;
- __tmp__Y = invI110 * j.ang1X + invI111 * j.ang1Y + invI112 * j.ang1Z;
- __tmp__Z = invI120 * j.ang1X + invI121 * j.ang1Y + invI122 * j.ang1Z;
- md.invMAng1X = __tmp__X;
- md.invMAng1Y = __tmp__Y;
- md.invMAng1Z = __tmp__Z;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = invI200 * j.ang2X + invI201 * j.ang2Y + invI202 * j.ang2Z;
- __tmp__Y1 = invI210 * j.ang2X + invI211 * j.ang2Y + invI212 * j.ang2Z;
- __tmp__Z1 = invI220 * j.ang2X + invI221 * j.ang2Y + invI222 * j.ang2Z;
- md.invMAng2X = __tmp__X1;
- md.invMAng2Y = __tmp__Y1;
- md.invMAng2Z = __tmp__Z1;
- md.mass = md.invMLin1X * j.lin1X + md.invMLin1Y * j.lin1Y + md.invMLin1Z * j.lin1Z + (md.invMLin2X * j.lin2X + md.invMLin2Y * j.lin2Y + md.invMLin2Z * j.lin2Z) + (md.invMAng1X * j.ang1X + md.invMAng1Y * j.ang1Y + md.invMAng1Z * j.ang1Z) + (md.invMAng2X * j.ang2X + md.invMAng2Y * j.ang2Y + md.invMAng2Z * j.ang2Z);
- if(md.mass != 0) {
- md.mass = 1 / md.mass;
- }
- }
- let _g2 = 0;
- let _g3 = this.info.numRows;
- while(_g2 < _g3) this.info.rows[_g2++].impulse.impulseP = 0;
- }
- solvePositionSplitImpulse() {
- let lv1X;
- let lv1Y;
- let lv1Z;
- let lv2X;
- let lv2Y;
- let lv2Z;
- let av1X;
- let av1Y;
- let av1Z;
- let av2X;
- let av2Y;
- let av2Z;
- lv1X = this._b1._pseudoVelX;
- lv1Y = this._b1._pseudoVelY;
- lv1Z = this._b1._pseudoVelZ;
- lv2X = this._b2._pseudoVelX;
- lv2Y = this._b2._pseudoVelY;
- lv2Z = this._b2._pseudoVelZ;
- av1X = this._b1._angPseudoVelX;
- av1Y = this._b1._angPseudoVelY;
- av1Z = this._b1._angPseudoVelZ;
- av2X = this._b2._angPseudoVelX;
- av2Y = this._b2._angPseudoVelY;
- av2Z = this._b2._angPseudoVelZ;
- let _g = 0;
- let _g1 = this.info.numRows;
- while(_g < _g1) {
- let i = _g++;
- let row = this.info.rows[i];
- let md = this.massData[i];
- let imp = row.impulse;
- let j = row.jacobian;
- let rv = 0;
- rv += lv1X * j.lin1X + lv1Y * j.lin1Y + lv1Z * j.lin1Z;
- rv -= lv2X * j.lin2X + lv2Y * j.lin2Y + lv2Z * j.lin2Z;
- rv += av1X * j.ang1X + av1Y * j.ang1Y + av1Z * j.ang1Z;
- rv -= av2X * j.ang2X + av2Y * j.ang2Y + av2Z * j.ang2Z;
- let impulseP = (row.rhs * oimo.common.Setting.positionSplitImpulseBaumgarte - rv) * md.mass;
- let oldImpulseP = imp.impulseP;
- imp.impulseP += impulseP;
- if(imp.impulseP < row.minImpulse) {
- imp.impulseP = row.minImpulse;
- } else if(imp.impulseP > row.maxImpulse) {
- imp.impulseP = row.maxImpulse;
- }
- impulseP = imp.impulseP - oldImpulseP;
- lv1X += md.invMLin1X * impulseP;
- lv1Y += md.invMLin1Y * impulseP;
- lv1Z += md.invMLin1Z * impulseP;
- lv2X += md.invMLin2X * -impulseP;
- lv2Y += md.invMLin2Y * -impulseP;
- lv2Z += md.invMLin2Z * -impulseP;
- av1X += md.invMAng1X * impulseP;
- av1Y += md.invMAng1Y * impulseP;
- av1Z += md.invMAng1Z * impulseP;
- av2X += md.invMAng2X * -impulseP;
- av2Y += md.invMAng2Y * -impulseP;
- av2Z += md.invMAng2Z * -impulseP;
- }
- this._b1._pseudoVelX = lv1X;
- this._b1._pseudoVelY = lv1Y;
- this._b1._pseudoVelZ = lv1Z;
- this._b2._pseudoVelX = lv2X;
- this._b2._pseudoVelY = lv2Y;
- this._b2._pseudoVelZ = lv2Z;
- this._b1._angPseudoVelX = av1X;
- this._b1._angPseudoVelY = av1Y;
- this._b1._angPseudoVelZ = av1Z;
- this._b2._angPseudoVelX = av2X;
- this._b2._angPseudoVelY = av2Y;
- this._b2._angPseudoVelZ = av2Z;
- }
- solvePositionNgs(timeStep) {
- this.joint._syncAnchors();
- this.joint._getPositionSolverInfo(this.info);
- this._b1 = this.info.b1;
- this._b2 = this.info.b2;
- let invM1 = this._b1._invMass;
- let invM2 = this._b2._invMass;
- let invI100;
- let invI101;
- let invI102;
- let invI110;
- let invI111;
- let invI112;
- let invI120;
- let invI121;
- let invI122;
- let invI200;
- let invI201;
- let invI202;
- let invI210;
- let invI211;
- let invI212;
- let invI220;
- let invI221;
- let invI222;
- invI100 = this._b1._invInertia00;
- invI101 = this._b1._invInertia01;
- invI102 = this._b1._invInertia02;
- invI110 = this._b1._invInertia10;
- invI111 = this._b1._invInertia11;
- invI112 = this._b1._invInertia12;
- invI120 = this._b1._invInertia20;
- invI121 = this._b1._invInertia21;
- invI122 = this._b1._invInertia22;
- invI200 = this._b2._invInertia00;
- invI201 = this._b2._invInertia01;
- invI202 = this._b2._invInertia02;
- invI210 = this._b2._invInertia10;
- invI211 = this._b2._invInertia11;
- invI212 = this._b2._invInertia12;
- invI220 = this._b2._invInertia20;
- invI221 = this._b2._invInertia21;
- invI222 = this._b2._invInertia22;
- let _g = 0;
- let _g1 = this.info.numRows;
- while(_g < _g1) {
- let i = _g++;
- let md = this.massData[i];
- let j = this.info.rows[i].jacobian;
- md.invMLin1X = j.lin1X * invM1;
- md.invMLin1Y = j.lin1Y * invM1;
- md.invMLin1Z = j.lin1Z * invM1;
- md.invMLin2X = j.lin2X * invM2;
- md.invMLin2Y = j.lin2Y * invM2;
- md.invMLin2Z = j.lin2Z * invM2;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = invI100 * j.ang1X + invI101 * j.ang1Y + invI102 * j.ang1Z;
- __tmp__Y = invI110 * j.ang1X + invI111 * j.ang1Y + invI112 * j.ang1Z;
- __tmp__Z = invI120 * j.ang1X + invI121 * j.ang1Y + invI122 * j.ang1Z;
- md.invMAng1X = __tmp__X;
- md.invMAng1Y = __tmp__Y;
- md.invMAng1Z = __tmp__Z;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = invI200 * j.ang2X + invI201 * j.ang2Y + invI202 * j.ang2Z;
- __tmp__Y1 = invI210 * j.ang2X + invI211 * j.ang2Y + invI212 * j.ang2Z;
- __tmp__Z1 = invI220 * j.ang2X + invI221 * j.ang2Y + invI222 * j.ang2Z;
- md.invMAng2X = __tmp__X1;
- md.invMAng2Y = __tmp__Y1;
- md.invMAng2Z = __tmp__Z1;
- md.mass = md.invMLin1X * j.lin1X + md.invMLin1Y * j.lin1Y + md.invMLin1Z * j.lin1Z + (md.invMLin2X * j.lin2X + md.invMLin2Y * j.lin2Y + md.invMLin2Z * j.lin2Z) + (md.invMAng1X * j.ang1X + md.invMAng1Y * j.ang1Y + md.invMAng1Z * j.ang1Z) + (md.invMAng2X * j.ang2X + md.invMAng2Y * j.ang2Y + md.invMAng2Z * j.ang2Z);
- if(md.mass != 0) {
- md.mass = 1 / md.mass;
- }
- }
- let lv1X;
- let lv1Y;
- let lv1Z;
- let lv2X;
- let lv2Y;
- let lv2Z;
- let av1X;
- let av1Y;
- let av1Z;
- let av2X;
- let av2Y;
- let av2Z;
- lv1X = 0;
- lv1Y = 0;
- lv1Z = 0;
- lv2X = 0;
- lv2Y = 0;
- lv2Z = 0;
- av1X = 0;
- av1Y = 0;
- av1Z = 0;
- av2X = 0;
- av2Y = 0;
- av2Z = 0;
- let _g2 = 0;
- let _g3 = this.info.numRows;
- while(_g2 < _g3) {
- let i = _g2++;
- let row = this.info.rows[i];
- let md = this.massData[i];
- let imp = row.impulse;
- let j = row.jacobian;
- let rv = 0;
- rv += lv1X * j.lin1X + lv1Y * j.lin1Y + lv1Z * j.lin1Z;
- rv -= lv2X * j.lin2X + lv2Y * j.lin2Y + lv2Z * j.lin2Z;
- rv += av1X * j.ang1X + av1Y * j.ang1Y + av1Z * j.ang1Z;
- rv -= av2X * j.ang2X + av2Y * j.ang2Y + av2Z * j.ang2Z;
- let impulseP = (row.rhs * oimo.common.Setting.positionNgsBaumgarte - rv) * md.mass;
- let oldImpulseP = imp.impulseP;
- imp.impulseP += impulseP;
- if(imp.impulseP < row.minImpulse) {
- imp.impulseP = row.minImpulse;
- } else if(imp.impulseP > row.maxImpulse) {
- imp.impulseP = row.maxImpulse;
- }
- impulseP = imp.impulseP - oldImpulseP;
- lv1X += md.invMLin1X * impulseP;
- lv1Y += md.invMLin1Y * impulseP;
- lv1Z += md.invMLin1Z * impulseP;
- lv2X += md.invMLin2X * -impulseP;
- lv2Y += md.invMLin2Y * -impulseP;
- lv2Z += md.invMLin2Z * -impulseP;
- av1X += md.invMAng1X * impulseP;
- av1Y += md.invMAng1Y * impulseP;
- av1Z += md.invMAng1Z * impulseP;
- av2X += md.invMAng2X * -impulseP;
- av2Y += md.invMAng2Y * -impulseP;
- av2Z += md.invMAng2Z * -impulseP;
- }
- let _this = this._b1;
- _this._transform._positionX += lv1X;
- _this._transform._positionY += lv1Y;
- _this._transform._positionZ += lv1Z;
- let _this1 = this._b2;
- _this1._transform._positionX += lv2X;
- _this1._transform._positionY += lv2Y;
- _this1._transform._positionZ += lv2Z;
- let _this2 = this._b1;
- let theta = Math.sqrt(av1X * av1X + av1Y * av1Y + av1Z * av1Z);
- let halfTheta = theta * 0.5;
- let rotationToSinAxisFactor;
- let cosHalfTheta;
- if(halfTheta < 0.5) {
- let ht2 = halfTheta * halfTheta;
- rotationToSinAxisFactor = 0.5 * (1 - ht2 * 0.16666666666666666 + ht2 * ht2 * 0.0083333333333333332);
- cosHalfTheta = 1 - ht2 * 0.5 + ht2 * ht2 * 0.041666666666666664;
- } else {
- rotationToSinAxisFactor = Math.sin(halfTheta) / theta;
- cosHalfTheta = Math.cos(halfTheta);
- }
- let sinAxisX;
- let sinAxisY;
- let sinAxisZ;
- sinAxisX = av1X * rotationToSinAxisFactor;
- sinAxisY = av1Y * rotationToSinAxisFactor;
- sinAxisZ = av1Z * rotationToSinAxisFactor;
- let dqX;
- let dqY;
- let dqZ;
- let dqW;
- dqX = sinAxisX;
- dqY = sinAxisY;
- dqZ = sinAxisZ;
- dqW = cosHalfTheta;
- let qX;
- let qY;
- let qZ;
- let qW;
- let e00 = _this2._transform._rotation00;
- let e11 = _this2._transform._rotation11;
- let e22 = _this2._transform._rotation22;
- let t = e00 + e11 + e22;
- let s;
- if(t > 0) {
- s = Math.sqrt(t + 1);
- qW = 0.5 * s;
- s = 0.5 / s;
- qX = (_this2._transform._rotation21 - _this2._transform._rotation12) * s;
- qY = (_this2._transform._rotation02 - _this2._transform._rotation20) * s;
- qZ = (_this2._transform._rotation10 - _this2._transform._rotation01) * s;
- } else if(e00 > e11) {
- if(e00 > e22) {
- s = Math.sqrt(e00 - e11 - e22 + 1);
- qX = 0.5 * s;
- s = 0.5 / s;
- qY = (_this2._transform._rotation01 + _this2._transform._rotation10) * s;
- qZ = (_this2._transform._rotation02 + _this2._transform._rotation20) * s;
- qW = (_this2._transform._rotation21 - _this2._transform._rotation12) * s;
- } else {
- s = Math.sqrt(e22 - e00 - e11 + 1);
- qZ = 0.5 * s;
- s = 0.5 / s;
- qX = (_this2._transform._rotation02 + _this2._transform._rotation20) * s;
- qY = (_this2._transform._rotation12 + _this2._transform._rotation21) * s;
- qW = (_this2._transform._rotation10 - _this2._transform._rotation01) * s;
- }
- } else if(e11 > e22) {
- s = Math.sqrt(e11 - e22 - e00 + 1);
- qY = 0.5 * s;
- s = 0.5 / s;
- qX = (_this2._transform._rotation01 + _this2._transform._rotation10) * s;
- qZ = (_this2._transform._rotation12 + _this2._transform._rotation21) * s;
- qW = (_this2._transform._rotation02 - _this2._transform._rotation20) * s;
- } else {
- s = Math.sqrt(e22 - e00 - e11 + 1);
- qZ = 0.5 * s;
- s = 0.5 / s;
- qX = (_this2._transform._rotation02 + _this2._transform._rotation20) * s;
- qY = (_this2._transform._rotation12 + _this2._transform._rotation21) * s;
- qW = (_this2._transform._rotation10 - _this2._transform._rotation01) * s;
- }
- qX = dqW * qX + dqX * qW + dqY * qZ - dqZ * qY;
- qY = dqW * qY - dqX * qZ + dqY * qW + dqZ * qX;
- qZ = dqW * qZ + dqX * qY - dqY * qX + dqZ * qW;
- qW = dqW * qW - dqX * qX - dqY * qY - dqZ * qZ;
- let l = qX * qX + qY * qY + qZ * qZ + qW * qW;
- if(l > 1e-32) {
- l = 1 / Math.sqrt(l);
- }
- qX *= l;
- qY *= l;
- qZ *= l;
- qW *= l;
- let x = qX;
- let y = qY;
- let z = qZ;
- let w = qW;
- let x2 = 2 * x;
- let y2 = 2 * y;
- let z2 = 2 * z;
- let xx = x * x2;
- let yy = y * y2;
- let zz = z * z2;
- let xy = x * y2;
- let yz = y * z2;
- let xz = x * z2;
- let wx = w * x2;
- let wy = w * y2;
- let wz = w * z2;
- _this2._transform._rotation00 = 1 - yy - zz;
- _this2._transform._rotation01 = xy - wz;
- _this2._transform._rotation02 = xz + wy;
- _this2._transform._rotation10 = xy + wz;
- _this2._transform._rotation11 = 1 - xx - zz;
- _this2._transform._rotation12 = yz - wx;
- _this2._transform._rotation20 = xz - wy;
- _this2._transform._rotation21 = yz + wx;
- _this2._transform._rotation22 = 1 - xx - yy;
- let __tmp__00;
- let __tmp__01;
- let __tmp__02;
- let __tmp__10;
- let __tmp__11;
- let __tmp__12;
- let __tmp__20;
- let __tmp__21;
- let __tmp__22;
- __tmp__00 = _this2._transform._rotation00 * _this2._invLocalInertia00 + _this2._transform._rotation01 * _this2._invLocalInertia10 + _this2._transform._rotation02 * _this2._invLocalInertia20;
- __tmp__01 = _this2._transform._rotation00 * _this2._invLocalInertia01 + _this2._transform._rotation01 * _this2._invLocalInertia11 + _this2._transform._rotation02 * _this2._invLocalInertia21;
- __tmp__02 = _this2._transform._rotation00 * _this2._invLocalInertia02 + _this2._transform._rotation01 * _this2._invLocalInertia12 + _this2._transform._rotation02 * _this2._invLocalInertia22;
- __tmp__10 = _this2._transform._rotation10 * _this2._invLocalInertia00 + _this2._transform._rotation11 * _this2._invLocalInertia10 + _this2._transform._rotation12 * _this2._invLocalInertia20;
- __tmp__11 = _this2._transform._rotation10 * _this2._invLocalInertia01 + _this2._transform._rotation11 * _this2._invLocalInertia11 + _this2._transform._rotation12 * _this2._invLocalInertia21;
- __tmp__12 = _this2._transform._rotation10 * _this2._invLocalInertia02 + _this2._transform._rotation11 * _this2._invLocalInertia12 + _this2._transform._rotation12 * _this2._invLocalInertia22;
- __tmp__20 = _this2._transform._rotation20 * _this2._invLocalInertia00 + _this2._transform._rotation21 * _this2._invLocalInertia10 + _this2._transform._rotation22 * _this2._invLocalInertia20;
- __tmp__21 = _this2._transform._rotation20 * _this2._invLocalInertia01 + _this2._transform._rotation21 * _this2._invLocalInertia11 + _this2._transform._rotation22 * _this2._invLocalInertia21;
- __tmp__22 = _this2._transform._rotation20 * _this2._invLocalInertia02 + _this2._transform._rotation21 * _this2._invLocalInertia12 + _this2._transform._rotation22 * _this2._invLocalInertia22;
- _this2._invInertia00 = __tmp__00;
- _this2._invInertia01 = __tmp__01;
- _this2._invInertia02 = __tmp__02;
- _this2._invInertia10 = __tmp__10;
- _this2._invInertia11 = __tmp__11;
- _this2._invInertia12 = __tmp__12;
- _this2._invInertia20 = __tmp__20;
- _this2._invInertia21 = __tmp__21;
- _this2._invInertia22 = __tmp__22;
- let __tmp__001;
- let __tmp__011;
- let __tmp__021;
- let __tmp__101;
- let __tmp__111;
- let __tmp__121;
- let __tmp__201;
- let __tmp__211;
- let __tmp__221;
- __tmp__001 = _this2._invInertia00 * _this2._transform._rotation00 + _this2._invInertia01 * _this2._transform._rotation01 + _this2._invInertia02 * _this2._transform._rotation02;
- __tmp__011 = _this2._invInertia00 * _this2._transform._rotation10 + _this2._invInertia01 * _this2._transform._rotation11 + _this2._invInertia02 * _this2._transform._rotation12;
- __tmp__021 = _this2._invInertia00 * _this2._transform._rotation20 + _this2._invInertia01 * _this2._transform._rotation21 + _this2._invInertia02 * _this2._transform._rotation22;
- __tmp__101 = _this2._invInertia10 * _this2._transform._rotation00 + _this2._invInertia11 * _this2._transform._rotation01 + _this2._invInertia12 * _this2._transform._rotation02;
- __tmp__111 = _this2._invInertia10 * _this2._transform._rotation10 + _this2._invInertia11 * _this2._transform._rotation11 + _this2._invInertia12 * _this2._transform._rotation12;
- __tmp__121 = _this2._invInertia10 * _this2._transform._rotation20 + _this2._invInertia11 * _this2._transform._rotation21 + _this2._invInertia12 * _this2._transform._rotation22;
- __tmp__201 = _this2._invInertia20 * _this2._transform._rotation00 + _this2._invInertia21 * _this2._transform._rotation01 + _this2._invInertia22 * _this2._transform._rotation02;
- __tmp__211 = _this2._invInertia20 * _this2._transform._rotation10 + _this2._invInertia21 * _this2._transform._rotation11 + _this2._invInertia22 * _this2._transform._rotation12;
- __tmp__221 = _this2._invInertia20 * _this2._transform._rotation20 + _this2._invInertia21 * _this2._transform._rotation21 + _this2._invInertia22 * _this2._transform._rotation22;
- _this2._invInertia00 = __tmp__001;
- _this2._invInertia01 = __tmp__011;
- _this2._invInertia02 = __tmp__021;
- _this2._invInertia10 = __tmp__101;
- _this2._invInertia11 = __tmp__111;
- _this2._invInertia12 = __tmp__121;
- _this2._invInertia20 = __tmp__201;
- _this2._invInertia21 = __tmp__211;
- _this2._invInertia22 = __tmp__221;
- _this2._invInertia00 *= _this2._rotFactor.x;
- _this2._invInertia01 *= _this2._rotFactor.x;
- _this2._invInertia02 *= _this2._rotFactor.x;
- _this2._invInertia10 *= _this2._rotFactor.y;
- _this2._invInertia11 *= _this2._rotFactor.y;
- _this2._invInertia12 *= _this2._rotFactor.y;
- _this2._invInertia20 *= _this2._rotFactor.z;
- _this2._invInertia21 *= _this2._rotFactor.z;
- _this2._invInertia22 *= _this2._rotFactor.z;
- let _this3 = this._b2;
- let theta1 = Math.sqrt(av2X * av2X + av2Y * av2Y + av2Z * av2Z);
- let halfTheta1 = theta1 * 0.5;
- let rotationToSinAxisFactor1;
- let cosHalfTheta1;
- if(halfTheta1 < 0.5) {
- let ht2 = halfTheta1 * halfTheta1;
- rotationToSinAxisFactor1 = 0.5 * (1 - ht2 * 0.16666666666666666 + ht2 * ht2 * 0.0083333333333333332);
- cosHalfTheta1 = 1 - ht2 * 0.5 + ht2 * ht2 * 0.041666666666666664;
- } else {
- rotationToSinAxisFactor1 = Math.sin(halfTheta1) / theta1;
- cosHalfTheta1 = Math.cos(halfTheta1);
- }
- let sinAxisX1;
- let sinAxisY1;
- let sinAxisZ1;
- sinAxisX1 = av2X * rotationToSinAxisFactor1;
- sinAxisY1 = av2Y * rotationToSinAxisFactor1;
- sinAxisZ1 = av2Z * rotationToSinAxisFactor1;
- let dqX1;
- let dqY1;
- let dqZ1;
- let dqW1;
- dqX1 = sinAxisX1;
- dqY1 = sinAxisY1;
- dqZ1 = sinAxisZ1;
- dqW1 = cosHalfTheta1;
- let qX1;
- let qY1;
- let qZ1;
- let qW1;
- let e001 = _this3._transform._rotation00;
- let e111 = _this3._transform._rotation11;
- let e221 = _this3._transform._rotation22;
- let t1 = e001 + e111 + e221;
- let s1;
- if(t1 > 0) {
- s1 = Math.sqrt(t1 + 1);
- qW1 = 0.5 * s1;
- s1 = 0.5 / s1;
- qX1 = (_this3._transform._rotation21 - _this3._transform._rotation12) * s1;
- qY1 = (_this3._transform._rotation02 - _this3._transform._rotation20) * s1;
- qZ1 = (_this3._transform._rotation10 - _this3._transform._rotation01) * s1;
- } else if(e001 > e111) {
- if(e001 > e221) {
- s1 = Math.sqrt(e001 - e111 - e221 + 1);
- qX1 = 0.5 * s1;
- s1 = 0.5 / s1;
- qY1 = (_this3._transform._rotation01 + _this3._transform._rotation10) * s1;
- qZ1 = (_this3._transform._rotation02 + _this3._transform._rotation20) * s1;
- qW1 = (_this3._transform._rotation21 - _this3._transform._rotation12) * s1;
- } else {
- s1 = Math.sqrt(e221 - e001 - e111 + 1);
- qZ1 = 0.5 * s1;
- s1 = 0.5 / s1;
- qX1 = (_this3._transform._rotation02 + _this3._transform._rotation20) * s1;
- qY1 = (_this3._transform._rotation12 + _this3._transform._rotation21) * s1;
- qW1 = (_this3._transform._rotation10 - _this3._transform._rotation01) * s1;
- }
- } else if(e111 > e221) {
- s1 = Math.sqrt(e111 - e221 - e001 + 1);
- qY1 = 0.5 * s1;
- s1 = 0.5 / s1;
- qX1 = (_this3._transform._rotation01 + _this3._transform._rotation10) * s1;
- qZ1 = (_this3._transform._rotation12 + _this3._transform._rotation21) * s1;
- qW1 = (_this3._transform._rotation02 - _this3._transform._rotation20) * s1;
- } else {
- s1 = Math.sqrt(e221 - e001 - e111 + 1);
- qZ1 = 0.5 * s1;
- s1 = 0.5 / s1;
- qX1 = (_this3._transform._rotation02 + _this3._transform._rotation20) * s1;
- qY1 = (_this3._transform._rotation12 + _this3._transform._rotation21) * s1;
- qW1 = (_this3._transform._rotation10 - _this3._transform._rotation01) * s1;
- }
- qX1 = dqW1 * qX1 + dqX1 * qW1 + dqY1 * qZ1 - dqZ1 * qY1;
- qY1 = dqW1 * qY1 - dqX1 * qZ1 + dqY1 * qW1 + dqZ1 * qX1;
- qZ1 = dqW1 * qZ1 + dqX1 * qY1 - dqY1 * qX1 + dqZ1 * qW1;
- qW1 = dqW1 * qW1 - dqX1 * qX1 - dqY1 * qY1 - dqZ1 * qZ1;
- let l1 = qX1 * qX1 + qY1 * qY1 + qZ1 * qZ1 + qW1 * qW1;
- if(l1 > 1e-32) {
- l1 = 1 / Math.sqrt(l1);
- }
- qX1 *= l1;
- qY1 *= l1;
- qZ1 *= l1;
- qW1 *= l1;
- let x1 = qX1;
- let y1 = qY1;
- let z1 = qZ1;
- let w1 = qW1;
- let x21 = 2 * x1;
- let y21 = 2 * y1;
- let z21 = 2 * z1;
- let xx1 = x1 * x21;
- let yy1 = y1 * y21;
- let zz1 = z1 * z21;
- let xy1 = x1 * y21;
- let yz1 = y1 * z21;
- let xz1 = x1 * z21;
- let wx1 = w1 * x21;
- let wy1 = w1 * y21;
- let wz1 = w1 * z21;
- _this3._transform._rotation00 = 1 - yy1 - zz1;
- _this3._transform._rotation01 = xy1 - wz1;
- _this3._transform._rotation02 = xz1 + wy1;
- _this3._transform._rotation10 = xy1 + wz1;
- _this3._transform._rotation11 = 1 - xx1 - zz1;
- _this3._transform._rotation12 = yz1 - wx1;
- _this3._transform._rotation20 = xz1 - wy1;
- _this3._transform._rotation21 = yz1 + wx1;
- _this3._transform._rotation22 = 1 - xx1 - yy1;
- let __tmp__002;
- let __tmp__012;
- let __tmp__022;
- let __tmp__102;
- let __tmp__112;
- let __tmp__122;
- let __tmp__202;
- let __tmp__212;
- let __tmp__222;
- __tmp__002 = _this3._transform._rotation00 * _this3._invLocalInertia00 + _this3._transform._rotation01 * _this3._invLocalInertia10 + _this3._transform._rotation02 * _this3._invLocalInertia20;
- __tmp__012 = _this3._transform._rotation00 * _this3._invLocalInertia01 + _this3._transform._rotation01 * _this3._invLocalInertia11 + _this3._transform._rotation02 * _this3._invLocalInertia21;
- __tmp__022 = _this3._transform._rotation00 * _this3._invLocalInertia02 + _this3._transform._rotation01 * _this3._invLocalInertia12 + _this3._transform._rotation02 * _this3._invLocalInertia22;
- __tmp__102 = _this3._transform._rotation10 * _this3._invLocalInertia00 + _this3._transform._rotation11 * _this3._invLocalInertia10 + _this3._transform._rotation12 * _this3._invLocalInertia20;
- __tmp__112 = _this3._transform._rotation10 * _this3._invLocalInertia01 + _this3._transform._rotation11 * _this3._invLocalInertia11 + _this3._transform._rotation12 * _this3._invLocalInertia21;
- __tmp__122 = _this3._transform._rotation10 * _this3._invLocalInertia02 + _this3._transform._rotation11 * _this3._invLocalInertia12 + _this3._transform._rotation12 * _this3._invLocalInertia22;
- __tmp__202 = _this3._transform._rotation20 * _this3._invLocalInertia00 + _this3._transform._rotation21 * _this3._invLocalInertia10 + _this3._transform._rotation22 * _this3._invLocalInertia20;
- __tmp__212 = _this3._transform._rotation20 * _this3._invLocalInertia01 + _this3._transform._rotation21 * _this3._invLocalInertia11 + _this3._transform._rotation22 * _this3._invLocalInertia21;
- __tmp__222 = _this3._transform._rotation20 * _this3._invLocalInertia02 + _this3._transform._rotation21 * _this3._invLocalInertia12 + _this3._transform._rotation22 * _this3._invLocalInertia22;
- _this3._invInertia00 = __tmp__002;
- _this3._invInertia01 = __tmp__012;
- _this3._invInertia02 = __tmp__022;
- _this3._invInertia10 = __tmp__102;
- _this3._invInertia11 = __tmp__112;
- _this3._invInertia12 = __tmp__122;
- _this3._invInertia20 = __tmp__202;
- _this3._invInertia21 = __tmp__212;
- _this3._invInertia22 = __tmp__222;
- let __tmp__003;
- let __tmp__013;
- let __tmp__023;
- let __tmp__103;
- let __tmp__113;
- let __tmp__123;
- let __tmp__203;
- let __tmp__213;
- let __tmp__223;
- __tmp__003 = _this3._invInertia00 * _this3._transform._rotation00 + _this3._invInertia01 * _this3._transform._rotation01 + _this3._invInertia02 * _this3._transform._rotation02;
- __tmp__013 = _this3._invInertia00 * _this3._transform._rotation10 + _this3._invInertia01 * _this3._transform._rotation11 + _this3._invInertia02 * _this3._transform._rotation12;
- __tmp__023 = _this3._invInertia00 * _this3._transform._rotation20 + _this3._invInertia01 * _this3._transform._rotation21 + _this3._invInertia02 * _this3._transform._rotation22;
- __tmp__103 = _this3._invInertia10 * _this3._transform._rotation00 + _this3._invInertia11 * _this3._transform._rotation01 + _this3._invInertia12 * _this3._transform._rotation02;
- __tmp__113 = _this3._invInertia10 * _this3._transform._rotation10 + _this3._invInertia11 * _this3._transform._rotation11 + _this3._invInertia12 * _this3._transform._rotation12;
- __tmp__123 = _this3._invInertia10 * _this3._transform._rotation20 + _this3._invInertia11 * _this3._transform._rotation21 + _this3._invInertia12 * _this3._transform._rotation22;
- __tmp__203 = _this3._invInertia20 * _this3._transform._rotation00 + _this3._invInertia21 * _this3._transform._rotation01 + _this3._invInertia22 * _this3._transform._rotation02;
- __tmp__213 = _this3._invInertia20 * _this3._transform._rotation10 + _this3._invInertia21 * _this3._transform._rotation11 + _this3._invInertia22 * _this3._transform._rotation12;
- __tmp__223 = _this3._invInertia20 * _this3._transform._rotation20 + _this3._invInertia21 * _this3._transform._rotation21 + _this3._invInertia22 * _this3._transform._rotation22;
- _this3._invInertia00 = __tmp__003;
- _this3._invInertia01 = __tmp__013;
- _this3._invInertia02 = __tmp__023;
- _this3._invInertia10 = __tmp__103;
- _this3._invInertia11 = __tmp__113;
- _this3._invInertia12 = __tmp__123;
- _this3._invInertia20 = __tmp__203;
- _this3._invInertia21 = __tmp__213;
- _this3._invInertia22 = __tmp__223;
- _this3._invInertia00 *= _this3._rotFactor.x;
- _this3._invInertia01 *= _this3._rotFactor.x;
- _this3._invInertia02 *= _this3._rotFactor.x;
- _this3._invInertia10 *= _this3._rotFactor.y;
- _this3._invInertia11 *= _this3._rotFactor.y;
- _this3._invInertia12 *= _this3._rotFactor.y;
- _this3._invInertia20 *= _this3._rotFactor.z;
- _this3._invInertia21 *= _this3._rotFactor.z;
- _this3._invInertia22 *= _this3._rotFactor.z;
- }
- postSolve() {
- this.joint._syncAnchors();
- this.joint._checkDestruction();
- }
- }
- if(!oimo.dynamics.rigidbody) oimo.dynamics.rigidbody = {};
- oimo.dynamics.rigidbody.MassData = class oimo_dynamics_rigidbody_MassData {
- constructor() {
- this.mass = 0;
- this.localInertia = new oimo.common.Mat3();
- }
- }
- oimo.dynamics.rigidbody.RigidBody = class oimo_dynamics_rigidbody_RigidBody {
- constructor(config) {
- this._next = null;
- this._prev = null;
- this._shapeList = null;
- this._shapeListLast = null;
- this._numShapes = 0;
- this._contactLinkList = null;
- this._contactLinkListLast = null;
- this._numContactLinks = 0;
- this._jointLinkList = null;
- this._jointLinkListLast = null;
- this._numJointLinks = 0;
- let v = config.linearVelocity;
- this._velX = v.x;
- this._velY = v.y;
- this._velZ = v.z;
- let v1 = config.angularVelocity;
- this._angVelX = v1.x;
- this._angVelY = v1.y;
- this._angVelZ = v1.z;
- this._pseudoVelX = 0;
- this._pseudoVelY = 0;
- this._pseudoVelZ = 0;
- this._angPseudoVelX = 0;
- this._angPseudoVelY = 0;
- this._angPseudoVelZ = 0;
- this._ptransform = new oimo.common.Transform();
- this._transform = new oimo.common.Transform();
- let v2 = config.position;
- this._ptransform._positionX = v2.x;
- this._ptransform._positionY = v2.y;
- this._ptransform._positionZ = v2.z;
- let m = config.rotation;
- this._ptransform._rotation00 = m.e00;
- this._ptransform._rotation01 = m.e01;
- this._ptransform._rotation02 = m.e02;
- this._ptransform._rotation10 = m.e10;
- this._ptransform._rotation11 = m.e11;
- this._ptransform._rotation12 = m.e12;
- this._ptransform._rotation20 = m.e20;
- this._ptransform._rotation21 = m.e21;
- this._ptransform._rotation22 = m.e22;
- let dst = this._transform;
- let src = this._ptransform;
- dst._positionX = src._positionX;
- dst._positionY = src._positionY;
- dst._positionZ = src._positionZ;
- dst._rotation00 = src._rotation00;
- dst._rotation01 = src._rotation01;
- dst._rotation02 = src._rotation02;
- dst._rotation10 = src._rotation10;
- dst._rotation11 = src._rotation11;
- dst._rotation12 = src._rotation12;
- dst._rotation20 = src._rotation20;
- dst._rotation21 = src._rotation21;
- dst._rotation22 = src._rotation22;
- this._type = config.type;
- this._sleepTime = 0;
- this._sleeping = false;
- this._autoSleep = config.autoSleep;
- this._mass = 0;
- this._invMass = 0;
- this._localInertia00 = 0;
- this._localInertia01 = 0;
- this._localInertia02 = 0;
- this._localInertia10 = 0;
- this._localInertia11 = 0;
- this._localInertia12 = 0;
- this._localInertia20 = 0;
- this._localInertia21 = 0;
- this._localInertia22 = 0;
- this._invLocalInertia00 = 0;
- this._invLocalInertia01 = 0;
- this._invLocalInertia02 = 0;
- this._invLocalInertia10 = 0;
- this._invLocalInertia11 = 0;
- this._invLocalInertia12 = 0;
- this._invLocalInertia20 = 0;
- this._invLocalInertia21 = 0;
- this._invLocalInertia22 = 0;
- this._invLocalInertiaWithoutRotFactor00 = 0;
- this._invLocalInertiaWithoutRotFactor01 = 0;
- this._invLocalInertiaWithoutRotFactor02 = 0;
- this._invLocalInertiaWithoutRotFactor10 = 0;
- this._invLocalInertiaWithoutRotFactor11 = 0;
- this._invLocalInertiaWithoutRotFactor12 = 0;
- this._invLocalInertiaWithoutRotFactor20 = 0;
- this._invLocalInertiaWithoutRotFactor21 = 0;
- this._invLocalInertiaWithoutRotFactor22 = 0;
- this._invInertia00 = 0;
- this._invInertia01 = 0;
- this._invInertia02 = 0;
- this._invInertia10 = 0;
- this._invInertia11 = 0;
- this._invInertia12 = 0;
- this._invInertia20 = 0;
- this._invInertia21 = 0;
- this._invInertia22 = 0;
- this._linearDamping = config.linearDamping;
- this._angularDamping = config.angularDamping;
- this._forceX = 0;
- this._forceY = 0;
- this._forceZ = 0;
- this._torqueX = 0;
- this._torqueY = 0;
- this._torqueZ = 0;
- this._linearContactImpulseX = 0;
- this._linearContactImpulseY = 0;
- this._linearContactImpulseZ = 0;
- this._angularContactImpulseX = 0;
- this._angularContactImpulseY = 0;
- this._angularContactImpulseZ = 0;
- this._rotFactor = new oimo.common.Vec3(1,1,1);
- this._addedToIsland = false;
- this._gravityScale = 1;
- this._world = null;
- }
- _integrate(dt) {
- switch(this._type) {
- case 1:
- this._velX = 0;
- this._velY = 0;
- this._velZ = 0;
- this._angVelX = 0;
- this._angVelY = 0;
- this._angVelZ = 0;
- this._pseudoVelX = 0;
- this._pseudoVelY = 0;
- this._pseudoVelZ = 0;
- this._angPseudoVelX = 0;
- this._angPseudoVelY = 0;
- this._angPseudoVelZ = 0;
- break;
- case 0:case 2:
- let translationX;
- let translationY;
- let translationZ;
- let rotationX;
- let rotationY;
- let rotationZ;
- translationX = this._velX * dt;
- translationY = this._velY * dt;
- translationZ = this._velZ * dt;
- rotationX = this._angVelX * dt;
- rotationY = this._angVelY * dt;
- rotationZ = this._angVelZ * dt;
- let translationLengthSq = translationX * translationX + translationY * translationY + translationZ * translationZ;
- let rotationLengthSq = rotationX * rotationX + rotationY * rotationY + rotationZ * rotationZ;
- if(translationLengthSq == 0 && rotationLengthSq == 0) {
- return;
- }
- if(translationLengthSq > oimo.common.Setting.maxTranslationPerStep * oimo.common.Setting.maxTranslationPerStep) {
- let l = oimo.common.Setting.maxTranslationPerStep / Math.sqrt(translationLengthSq);
- this._velX *= l;
- this._velY *= l;
- this._velZ *= l;
- translationX *= l;
- translationY *= l;
- translationZ *= l;
- }
- if(rotationLengthSq > oimo.common.Setting.maxRotationPerStep * oimo.common.Setting.maxRotationPerStep) {
- let l = oimo.common.Setting.maxRotationPerStep / Math.sqrt(rotationLengthSq);
- this._angVelX *= l;
- this._angVelY *= l;
- this._angVelZ *= l;
- rotationX *= l;
- rotationY *= l;
- rotationZ *= l;
- }
- this._transform._positionX += translationX;
- this._transform._positionY += translationY;
- this._transform._positionZ += translationZ;
- let theta = Math.sqrt(rotationX * rotationX + rotationY * rotationY + rotationZ * rotationZ);
- let halfTheta = theta * 0.5;
- let rotationToSinAxisFactor;
- let cosHalfTheta;
- if(halfTheta < 0.5) {
- let ht2 = halfTheta * halfTheta;
- rotationToSinAxisFactor = 0.5 * (1 - ht2 * 0.16666666666666666 + ht2 * ht2 * 0.0083333333333333332);
- cosHalfTheta = 1 - ht2 * 0.5 + ht2 * ht2 * 0.041666666666666664;
- } else {
- rotationToSinAxisFactor = Math.sin(halfTheta) / theta;
- cosHalfTheta = Math.cos(halfTheta);
- }
- let sinAxisX;
- let sinAxisY;
- let sinAxisZ;
- sinAxisX = rotationX * rotationToSinAxisFactor;
- sinAxisY = rotationY * rotationToSinAxisFactor;
- sinAxisZ = rotationZ * rotationToSinAxisFactor;
- let dqX;
- let dqY;
- let dqZ;
- let dqW;
- dqX = sinAxisX;
- dqY = sinAxisY;
- dqZ = sinAxisZ;
- dqW = cosHalfTheta;
- let qX;
- let qY;
- let qZ;
- let qW;
- let e00 = this._transform._rotation00;
- let e11 = this._transform._rotation11;
- let e22 = this._transform._rotation22;
- let t = e00 + e11 + e22;
- let s;
- if(t > 0) {
- s = Math.sqrt(t + 1);
- qW = 0.5 * s;
- s = 0.5 / s;
- qX = (this._transform._rotation21 - this._transform._rotation12) * s;
- qY = (this._transform._rotation02 - this._transform._rotation20) * s;
- qZ = (this._transform._rotation10 - this._transform._rotation01) * s;
- } else if(e00 > e11) {
- if(e00 > e22) {
- s = Math.sqrt(e00 - e11 - e22 + 1);
- qX = 0.5 * s;
- s = 0.5 / s;
- qY = (this._transform._rotation01 + this._transform._rotation10) * s;
- qZ = (this._transform._rotation02 + this._transform._rotation20) * s;
- qW = (this._transform._rotation21 - this._transform._rotation12) * s;
- } else {
- s = Math.sqrt(e22 - e00 - e11 + 1);
- qZ = 0.5 * s;
- s = 0.5 / s;
- qX = (this._transform._rotation02 + this._transform._rotation20) * s;
- qY = (this._transform._rotation12 + this._transform._rotation21) * s;
- qW = (this._transform._rotation10 - this._transform._rotation01) * s;
- }
- } else if(e11 > e22) {
- s = Math.sqrt(e11 - e22 - e00 + 1);
- qY = 0.5 * s;
- s = 0.5 / s;
- qX = (this._transform._rotation01 + this._transform._rotation10) * s;
- qZ = (this._transform._rotation12 + this._transform._rotation21) * s;
- qW = (this._transform._rotation02 - this._transform._rotation20) * s;
- } else {
- s = Math.sqrt(e22 - e00 - e11 + 1);
- qZ = 0.5 * s;
- s = 0.5 / s;
- qX = (this._transform._rotation02 + this._transform._rotation20) * s;
- qY = (this._transform._rotation12 + this._transform._rotation21) * s;
- qW = (this._transform._rotation10 - this._transform._rotation01) * s;
- }
- qX = dqW * qX + dqX * qW + dqY * qZ - dqZ * qY;
- qY = dqW * qY - dqX * qZ + dqY * qW + dqZ * qX;
- qZ = dqW * qZ + dqX * qY - dqY * qX + dqZ * qW;
- qW = dqW * qW - dqX * qX - dqY * qY - dqZ * qZ;
- let l = qX * qX + qY * qY + qZ * qZ + qW * qW;
- if(l > 1e-32) {
- l = 1 / Math.sqrt(l);
- }
- qX *= l;
- qY *= l;
- qZ *= l;
- qW *= l;
- let x = qX;
- let y = qY;
- let z = qZ;
- let w = qW;
- let x2 = 2 * x;
- let y2 = 2 * y;
- let z2 = 2 * z;
- let xx = x * x2;
- let yy = y * y2;
- let zz = z * z2;
- let xy = x * y2;
- let yz = y * z2;
- let xz = x * z2;
- let wx = w * x2;
- let wy = w * y2;
- let wz = w * z2;
- this._transform._rotation00 = 1 - yy - zz;
- this._transform._rotation01 = xy - wz;
- this._transform._rotation02 = xz + wy;
- this._transform._rotation10 = xy + wz;
- this._transform._rotation11 = 1 - xx - zz;
- this._transform._rotation12 = yz - wx;
- this._transform._rotation20 = xz - wy;
- this._transform._rotation21 = yz + wx;
- this._transform._rotation22 = 1 - xx - yy;
- let __tmp__00;
- let __tmp__01;
- let __tmp__02;
- let __tmp__10;
- let __tmp__11;
- let __tmp__12;
- let __tmp__20;
- let __tmp__21;
- let __tmp__22;
- __tmp__00 = this._transform._rotation00 * this._invLocalInertia00 + this._transform._rotation01 * this._invLocalInertia10 + this._transform._rotation02 * this._invLocalInertia20;
- __tmp__01 = this._transform._rotation00 * this._invLocalInertia01 + this._transform._rotation01 * this._invLocalInertia11 + this._transform._rotation02 * this._invLocalInertia21;
- __tmp__02 = this._transform._rotation00 * this._invLocalInertia02 + this._transform._rotation01 * this._invLocalInertia12 + this._transform._rotation02 * this._invLocalInertia22;
- __tmp__10 = this._transform._rotation10 * this._invLocalInertia00 + this._transform._rotation11 * this._invLocalInertia10 + this._transform._rotation12 * this._invLocalInertia20;
- __tmp__11 = this._transform._rotation10 * this._invLocalInertia01 + this._transform._rotation11 * this._invLocalInertia11 + this._transform._rotation12 * this._invLocalInertia21;
- __tmp__12 = this._transform._rotation10 * this._invLocalInertia02 + this._transform._rotation11 * this._invLocalInertia12 + this._transform._rotation12 * this._invLocalInertia22;
- __tmp__20 = this._transform._rotation20 * this._invLocalInertia00 + this._transform._rotation21 * this._invLocalInertia10 + this._transform._rotation22 * this._invLocalInertia20;
- __tmp__21 = this._transform._rotation20 * this._invLocalInertia01 + this._transform._rotation21 * this._invLocalInertia11 + this._transform._rotation22 * this._invLocalInertia21;
- __tmp__22 = this._transform._rotation20 * this._invLocalInertia02 + this._transform._rotation21 * this._invLocalInertia12 + this._transform._rotation22 * this._invLocalInertia22;
- this._invInertia00 = __tmp__00;
- this._invInertia01 = __tmp__01;
- this._invInertia02 = __tmp__02;
- this._invInertia10 = __tmp__10;
- this._invInertia11 = __tmp__11;
- this._invInertia12 = __tmp__12;
- this._invInertia20 = __tmp__20;
- this._invInertia21 = __tmp__21;
- this._invInertia22 = __tmp__22;
- let __tmp__001;
- let __tmp__011;
- let __tmp__021;
- let __tmp__101;
- let __tmp__111;
- let __tmp__121;
- let __tmp__201;
- let __tmp__211;
- let __tmp__221;
- __tmp__001 = this._invInertia00 * this._transform._rotation00 + this._invInertia01 * this._transform._rotation01 + this._invInertia02 * this._transform._rotation02;
- __tmp__011 = this._invInertia00 * this._transform._rotation10 + this._invInertia01 * this._transform._rotation11 + this._invInertia02 * this._transform._rotation12;
- __tmp__021 = this._invInertia00 * this._transform._rotation20 + this._invInertia01 * this._transform._rotation21 + this._invInertia02 * this._transform._rotation22;
- __tmp__101 = this._invInertia10 * this._transform._rotation00 + this._invInertia11 * this._transform._rotation01 + this._invInertia12 * this._transform._rotation02;
- __tmp__111 = this._invInertia10 * this._transform._rotation10 + this._invInertia11 * this._transform._rotation11 + this._invInertia12 * this._transform._rotation12;
- __tmp__121 = this._invInertia10 * this._transform._rotation20 + this._invInertia11 * this._transform._rotation21 + this._invInertia12 * this._transform._rotation22;
- __tmp__201 = this._invInertia20 * this._transform._rotation00 + this._invInertia21 * this._transform._rotation01 + this._invInertia22 * this._transform._rotation02;
- __tmp__211 = this._invInertia20 * this._transform._rotation10 + this._invInertia21 * this._transform._rotation11 + this._invInertia22 * this._transform._rotation12;
- __tmp__221 = this._invInertia20 * this._transform._rotation20 + this._invInertia21 * this._transform._rotation21 + this._invInertia22 * this._transform._rotation22;
- this._invInertia00 = __tmp__001;
- this._invInertia01 = __tmp__011;
- this._invInertia02 = __tmp__021;
- this._invInertia10 = __tmp__101;
- this._invInertia11 = __tmp__111;
- this._invInertia12 = __tmp__121;
- this._invInertia20 = __tmp__201;
- this._invInertia21 = __tmp__211;
- this._invInertia22 = __tmp__221;
- this._invInertia00 *= this._rotFactor.x;
- this._invInertia01 *= this._rotFactor.x;
- this._invInertia02 *= this._rotFactor.x;
- this._invInertia10 *= this._rotFactor.y;
- this._invInertia11 *= this._rotFactor.y;
- this._invInertia12 *= this._rotFactor.y;
- this._invInertia20 *= this._rotFactor.z;
- this._invInertia21 *= this._rotFactor.z;
- this._invInertia22 *= this._rotFactor.z;
- break;
- }
- }
- _integratePseudoVelocity() {
- if(this._pseudoVelX * this._pseudoVelX + this._pseudoVelY * this._pseudoVelY + this._pseudoVelZ * this._pseudoVelZ == 0 && this._angPseudoVelX * this._angPseudoVelX + this._angPseudoVelY * this._angPseudoVelY + this._angPseudoVelZ * this._angPseudoVelZ == 0) {
- return;
- }
- switch(this._type) {
- case 1:
- this._pseudoVelX = 0;
- this._pseudoVelY = 0;
- this._pseudoVelZ = 0;
- this._angPseudoVelX = 0;
- this._angPseudoVelY = 0;
- this._angPseudoVelZ = 0;
- break;
- case 0:case 2:
- let translationX;
- let translationY;
- let translationZ;
- let rotationX;
- let rotationY;
- let rotationZ;
- translationX = this._pseudoVelX;
- translationY = this._pseudoVelY;
- translationZ = this._pseudoVelZ;
- rotationX = this._angPseudoVelX;
- rotationY = this._angPseudoVelY;
- rotationZ = this._angPseudoVelZ;
- this._pseudoVelX = 0;
- this._pseudoVelY = 0;
- this._pseudoVelZ = 0;
- this._angPseudoVelX = 0;
- this._angPseudoVelY = 0;
- this._angPseudoVelZ = 0;
- this._transform._positionX += translationX;
- this._transform._positionY += translationY;
- this._transform._positionZ += translationZ;
- let theta = Math.sqrt(rotationX * rotationX + rotationY * rotationY + rotationZ * rotationZ);
- let halfTheta = theta * 0.5;
- let rotationToSinAxisFactor;
- let cosHalfTheta;
- if(halfTheta < 0.5) {
- let ht2 = halfTheta * halfTheta;
- rotationToSinAxisFactor = 0.5 * (1 - ht2 * 0.16666666666666666 + ht2 * ht2 * 0.0083333333333333332);
- cosHalfTheta = 1 - ht2 * 0.5 + ht2 * ht2 * 0.041666666666666664;
- } else {
- rotationToSinAxisFactor = Math.sin(halfTheta) / theta;
- cosHalfTheta = Math.cos(halfTheta);
- }
- let sinAxisX;
- let sinAxisY;
- let sinAxisZ;
- sinAxisX = rotationX * rotationToSinAxisFactor;
- sinAxisY = rotationY * rotationToSinAxisFactor;
- sinAxisZ = rotationZ * rotationToSinAxisFactor;
- let dqX;
- let dqY;
- let dqZ;
- let dqW;
- dqX = sinAxisX;
- dqY = sinAxisY;
- dqZ = sinAxisZ;
- dqW = cosHalfTheta;
- let qX;
- let qY;
- let qZ;
- let qW;
- let e00 = this._transform._rotation00;
- let e11 = this._transform._rotation11;
- let e22 = this._transform._rotation22;
- let t = e00 + e11 + e22;
- let s;
- if(t > 0) {
- s = Math.sqrt(t + 1);
- qW = 0.5 * s;
- s = 0.5 / s;
- qX = (this._transform._rotation21 - this._transform._rotation12) * s;
- qY = (this._transform._rotation02 - this._transform._rotation20) * s;
- qZ = (this._transform._rotation10 - this._transform._rotation01) * s;
- } else if(e00 > e11) {
- if(e00 > e22) {
- s = Math.sqrt(e00 - e11 - e22 + 1);
- qX = 0.5 * s;
- s = 0.5 / s;
- qY = (this._transform._rotation01 + this._transform._rotation10) * s;
- qZ = (this._transform._rotation02 + this._transform._rotation20) * s;
- qW = (this._transform._rotation21 - this._transform._rotation12) * s;
- } else {
- s = Math.sqrt(e22 - e00 - e11 + 1);
- qZ = 0.5 * s;
- s = 0.5 / s;
- qX = (this._transform._rotation02 + this._transform._rotation20) * s;
- qY = (this._transform._rotation12 + this._transform._rotation21) * s;
- qW = (this._transform._rotation10 - this._transform._rotation01) * s;
- }
- } else if(e11 > e22) {
- s = Math.sqrt(e11 - e22 - e00 + 1);
- qY = 0.5 * s;
- s = 0.5 / s;
- qX = (this._transform._rotation01 + this._transform._rotation10) * s;
- qZ = (this._transform._rotation12 + this._transform._rotation21) * s;
- qW = (this._transform._rotation02 - this._transform._rotation20) * s;
- } else {
- s = Math.sqrt(e22 - e00 - e11 + 1);
- qZ = 0.5 * s;
- s = 0.5 / s;
- qX = (this._transform._rotation02 + this._transform._rotation20) * s;
- qY = (this._transform._rotation12 + this._transform._rotation21) * s;
- qW = (this._transform._rotation10 - this._transform._rotation01) * s;
- }
- qX = dqW * qX + dqX * qW + dqY * qZ - dqZ * qY;
- qY = dqW * qY - dqX * qZ + dqY * qW + dqZ * qX;
- qZ = dqW * qZ + dqX * qY - dqY * qX + dqZ * qW;
- qW = dqW * qW - dqX * qX - dqY * qY - dqZ * qZ;
- let l = qX * qX + qY * qY + qZ * qZ + qW * qW;
- if(l > 1e-32) {
- l = 1 / Math.sqrt(l);
- }
- qX *= l;
- qY *= l;
- qZ *= l;
- qW *= l;
- let x = qX;
- let y = qY;
- let z = qZ;
- let w = qW;
- let x2 = 2 * x;
- let y2 = 2 * y;
- let z2 = 2 * z;
- let xx = x * x2;
- let yy = y * y2;
- let zz = z * z2;
- let xy = x * y2;
- let yz = y * z2;
- let xz = x * z2;
- let wx = w * x2;
- let wy = w * y2;
- let wz = w * z2;
- this._transform._rotation00 = 1 - yy - zz;
- this._transform._rotation01 = xy - wz;
- this._transform._rotation02 = xz + wy;
- this._transform._rotation10 = xy + wz;
- this._transform._rotation11 = 1 - xx - zz;
- this._transform._rotation12 = yz - wx;
- this._transform._rotation20 = xz - wy;
- this._transform._rotation21 = yz + wx;
- this._transform._rotation22 = 1 - xx - yy;
- let __tmp__00;
- let __tmp__01;
- let __tmp__02;
- let __tmp__10;
- let __tmp__11;
- let __tmp__12;
- let __tmp__20;
- let __tmp__21;
- let __tmp__22;
- __tmp__00 = this._transform._rotation00 * this._invLocalInertia00 + this._transform._rotation01 * this._invLocalInertia10 + this._transform._rotation02 * this._invLocalInertia20;
- __tmp__01 = this._transform._rotation00 * this._invLocalInertia01 + this._transform._rotation01 * this._invLocalInertia11 + this._transform._rotation02 * this._invLocalInertia21;
- __tmp__02 = this._transform._rotation00 * this._invLocalInertia02 + this._transform._rotation01 * this._invLocalInertia12 + this._transform._rotation02 * this._invLocalInertia22;
- __tmp__10 = this._transform._rotation10 * this._invLocalInertia00 + this._transform._rotation11 * this._invLocalInertia10 + this._transform._rotation12 * this._invLocalInertia20;
- __tmp__11 = this._transform._rotation10 * this._invLocalInertia01 + this._transform._rotation11 * this._invLocalInertia11 + this._transform._rotation12 * this._invLocalInertia21;
- __tmp__12 = this._transform._rotation10 * this._invLocalInertia02 + this._transform._rotation11 * this._invLocalInertia12 + this._transform._rotation12 * this._invLocalInertia22;
- __tmp__20 = this._transform._rotation20 * this._invLocalInertia00 + this._transform._rotation21 * this._invLocalInertia10 + this._transform._rotation22 * this._invLocalInertia20;
- __tmp__21 = this._transform._rotation20 * this._invLocalInertia01 + this._transform._rotation21 * this._invLocalInertia11 + this._transform._rotation22 * this._invLocalInertia21;
- __tmp__22 = this._transform._rotation20 * this._invLocalInertia02 + this._transform._rotation21 * this._invLocalInertia12 + this._transform._rotation22 * this._invLocalInertia22;
- this._invInertia00 = __tmp__00;
- this._invInertia01 = __tmp__01;
- this._invInertia02 = __tmp__02;
- this._invInertia10 = __tmp__10;
- this._invInertia11 = __tmp__11;
- this._invInertia12 = __tmp__12;
- this._invInertia20 = __tmp__20;
- this._invInertia21 = __tmp__21;
- this._invInertia22 = __tmp__22;
- let __tmp__001;
- let __tmp__011;
- let __tmp__021;
- let __tmp__101;
- let __tmp__111;
- let __tmp__121;
- let __tmp__201;
- let __tmp__211;
- let __tmp__221;
- __tmp__001 = this._invInertia00 * this._transform._rotation00 + this._invInertia01 * this._transform._rotation01 + this._invInertia02 * this._transform._rotation02;
- __tmp__011 = this._invInertia00 * this._transform._rotation10 + this._invInertia01 * this._transform._rotation11 + this._invInertia02 * this._transform._rotation12;
- __tmp__021 = this._invInertia00 * this._transform._rotation20 + this._invInertia01 * this._transform._rotation21 + this._invInertia02 * this._transform._rotation22;
- __tmp__101 = this._invInertia10 * this._transform._rotation00 + this._invInertia11 * this._transform._rotation01 + this._invInertia12 * this._transform._rotation02;
- __tmp__111 = this._invInertia10 * this._transform._rotation10 + this._invInertia11 * this._transform._rotation11 + this._invInertia12 * this._transform._rotation12;
- __tmp__121 = this._invInertia10 * this._transform._rotation20 + this._invInertia11 * this._transform._rotation21 + this._invInertia12 * this._transform._rotation22;
- __tmp__201 = this._invInertia20 * this._transform._rotation00 + this._invInertia21 * this._transform._rotation01 + this._invInertia22 * this._transform._rotation02;
- __tmp__211 = this._invInertia20 * this._transform._rotation10 + this._invInertia21 * this._transform._rotation11 + this._invInertia22 * this._transform._rotation12;
- __tmp__221 = this._invInertia20 * this._transform._rotation20 + this._invInertia21 * this._transform._rotation21 + this._invInertia22 * this._transform._rotation22;
- this._invInertia00 = __tmp__001;
- this._invInertia01 = __tmp__011;
- this._invInertia02 = __tmp__021;
- this._invInertia10 = __tmp__101;
- this._invInertia11 = __tmp__111;
- this._invInertia12 = __tmp__121;
- this._invInertia20 = __tmp__201;
- this._invInertia21 = __tmp__211;
- this._invInertia22 = __tmp__221;
- this._invInertia00 *= this._rotFactor.x;
- this._invInertia01 *= this._rotFactor.x;
- this._invInertia02 *= this._rotFactor.x;
- this._invInertia10 *= this._rotFactor.y;
- this._invInertia11 *= this._rotFactor.y;
- this._invInertia12 *= this._rotFactor.y;
- this._invInertia20 *= this._rotFactor.z;
- this._invInertia21 *= this._rotFactor.z;
- this._invInertia22 *= this._rotFactor.z;
- break;
- }
- }
- updateMass() {
- let totalInertia00;
- let totalInertia01;
- let totalInertia02;
- let totalInertia10;
- let totalInertia11;
- let totalInertia12;
- let totalInertia20;
- let totalInertia21;
- let totalInertia22;
- totalInertia00 = 0;
- totalInertia01 = 0;
- totalInertia02 = 0;
- totalInertia10 = 0;
- totalInertia11 = 0;
- totalInertia12 = 0;
- totalInertia20 = 0;
- totalInertia21 = 0;
- totalInertia22 = 0;
- let totalMass = 0;
- let s = this._shapeList;
- while(s != null) {
- let n = s._next;
- let g = s._geom;
- g._updateMass();
- let mass = s._density * g._volume;
- let inertia00;
- let inertia01;
- let inertia02;
- let inertia10;
- let inertia11;
- let inertia12;
- let inertia20;
- let inertia21;
- let inertia22;
- let __tmp__00;
- let __tmp__01;
- let __tmp__02;
- let __tmp__10;
- let __tmp__11;
- let __tmp__12;
- let __tmp__20;
- let __tmp__21;
- let __tmp__22;
- __tmp__00 = s._localTransform._rotation00 * g._inertiaCoeff00 + s._localTransform._rotation01 * g._inertiaCoeff10 + s._localTransform._rotation02 * g._inertiaCoeff20;
- __tmp__01 = s._localTransform._rotation00 * g._inertiaCoeff01 + s._localTransform._rotation01 * g._inertiaCoeff11 + s._localTransform._rotation02 * g._inertiaCoeff21;
- __tmp__02 = s._localTransform._rotation00 * g._inertiaCoeff02 + s._localTransform._rotation01 * g._inertiaCoeff12 + s._localTransform._rotation02 * g._inertiaCoeff22;
- __tmp__10 = s._localTransform._rotation10 * g._inertiaCoeff00 + s._localTransform._rotation11 * g._inertiaCoeff10 + s._localTransform._rotation12 * g._inertiaCoeff20;
- __tmp__11 = s._localTransform._rotation10 * g._inertiaCoeff01 + s._localTransform._rotation11 * g._inertiaCoeff11 + s._localTransform._rotation12 * g._inertiaCoeff21;
- __tmp__12 = s._localTransform._rotation10 * g._inertiaCoeff02 + s._localTransform._rotation11 * g._inertiaCoeff12 + s._localTransform._rotation12 * g._inertiaCoeff22;
- __tmp__20 = s._localTransform._rotation20 * g._inertiaCoeff00 + s._localTransform._rotation21 * g._inertiaCoeff10 + s._localTransform._rotation22 * g._inertiaCoeff20;
- __tmp__21 = s._localTransform._rotation20 * g._inertiaCoeff01 + s._localTransform._rotation21 * g._inertiaCoeff11 + s._localTransform._rotation22 * g._inertiaCoeff21;
- __tmp__22 = s._localTransform._rotation20 * g._inertiaCoeff02 + s._localTransform._rotation21 * g._inertiaCoeff12 + s._localTransform._rotation22 * g._inertiaCoeff22;
- inertia00 = __tmp__00;
- inertia01 = __tmp__01;
- inertia02 = __tmp__02;
- inertia10 = __tmp__10;
- inertia11 = __tmp__11;
- inertia12 = __tmp__12;
- inertia20 = __tmp__20;
- inertia21 = __tmp__21;
- inertia22 = __tmp__22;
- let __tmp__001;
- let __tmp__011;
- let __tmp__021;
- let __tmp__101;
- let __tmp__111;
- let __tmp__121;
- let __tmp__201;
- let __tmp__211;
- let __tmp__221;
- __tmp__001 = inertia00 * s._localTransform._rotation00 + inertia01 * s._localTransform._rotation01 + inertia02 * s._localTransform._rotation02;
- __tmp__011 = inertia00 * s._localTransform._rotation10 + inertia01 * s._localTransform._rotation11 + inertia02 * s._localTransform._rotation12;
- __tmp__021 = inertia00 * s._localTransform._rotation20 + inertia01 * s._localTransform._rotation21 + inertia02 * s._localTransform._rotation22;
- __tmp__101 = inertia10 * s._localTransform._rotation00 + inertia11 * s._localTransform._rotation01 + inertia12 * s._localTransform._rotation02;
- __tmp__111 = inertia10 * s._localTransform._rotation10 + inertia11 * s._localTransform._rotation11 + inertia12 * s._localTransform._rotation12;
- __tmp__121 = inertia10 * s._localTransform._rotation20 + inertia11 * s._localTransform._rotation21 + inertia12 * s._localTransform._rotation22;
- __tmp__201 = inertia20 * s._localTransform._rotation00 + inertia21 * s._localTransform._rotation01 + inertia22 * s._localTransform._rotation02;
- __tmp__211 = inertia20 * s._localTransform._rotation10 + inertia21 * s._localTransform._rotation11 + inertia22 * s._localTransform._rotation12;
- __tmp__221 = inertia20 * s._localTransform._rotation20 + inertia21 * s._localTransform._rotation21 + inertia22 * s._localTransform._rotation22;
- inertia00 = __tmp__001;
- inertia01 = __tmp__011;
- inertia02 = __tmp__021;
- inertia10 = __tmp__101;
- inertia11 = __tmp__111;
- inertia12 = __tmp__121;
- inertia20 = __tmp__201;
- inertia21 = __tmp__211;
- inertia22 = __tmp__221;
- inertia00 *= mass;
- inertia01 *= mass;
- inertia02 *= mass;
- inertia10 *= mass;
- inertia11 *= mass;
- inertia12 *= mass;
- inertia20 *= mass;
- inertia21 *= mass;
- inertia22 *= mass;
- let cogInertia00;
- let cogInertia01;
- let cogInertia02;
- let cogInertia10;
- let cogInertia11;
- let cogInertia12;
- let cogInertia20;
- let cogInertia21;
- let cogInertia22;
- let xx = s._localTransform._positionX * s._localTransform._positionX;
- let yy = s._localTransform._positionY * s._localTransform._positionY;
- let zz = s._localTransform._positionZ * s._localTransform._positionZ;
- let xy = -s._localTransform._positionX * s._localTransform._positionY;
- let yz = -s._localTransform._positionY * s._localTransform._positionZ;
- let zx = -s._localTransform._positionZ * s._localTransform._positionX;
- cogInertia00 = yy + zz;
- cogInertia01 = xy;
- cogInertia02 = zx;
- cogInertia10 = xy;
- cogInertia11 = xx + zz;
- cogInertia12 = yz;
- cogInertia20 = zx;
- cogInertia21 = yz;
- cogInertia22 = xx + yy;
- inertia00 += cogInertia00 * mass;
- inertia01 += cogInertia01 * mass;
- inertia02 += cogInertia02 * mass;
- inertia10 += cogInertia10 * mass;
- inertia11 += cogInertia11 * mass;
- inertia12 += cogInertia12 * mass;
- inertia20 += cogInertia20 * mass;
- inertia21 += cogInertia21 * mass;
- inertia22 += cogInertia22 * mass;
- totalMass += mass;
- totalInertia00 += inertia00;
- totalInertia01 += inertia01;
- totalInertia02 += inertia02;
- totalInertia10 += inertia10;
- totalInertia11 += inertia11;
- totalInertia12 += inertia12;
- totalInertia20 += inertia20;
- totalInertia21 += inertia21;
- totalInertia22 += inertia22;
- s = n;
- }
- this._mass = totalMass;
- this._localInertia00 = totalInertia00;
- this._localInertia01 = totalInertia01;
- this._localInertia02 = totalInertia02;
- this._localInertia10 = totalInertia10;
- this._localInertia11 = totalInertia11;
- this._localInertia12 = totalInertia12;
- this._localInertia20 = totalInertia20;
- this._localInertia21 = totalInertia21;
- this._localInertia22 = totalInertia22;
- if(this._mass > 0 && this._localInertia00 * (this._localInertia11 * this._localInertia22 - this._localInertia12 * this._localInertia21) - this._localInertia01 * (this._localInertia10 * this._localInertia22 - this._localInertia12 * this._localInertia20) + this._localInertia02 * (this._localInertia10 * this._localInertia21 - this._localInertia11 * this._localInertia20) > 0 && this._type == 0) {
- this._invMass = 1 / this._mass;
- let d00 = this._localInertia11 * this._localInertia22 - this._localInertia12 * this._localInertia21;
- let d01 = this._localInertia10 * this._localInertia22 - this._localInertia12 * this._localInertia20;
- let d02 = this._localInertia10 * this._localInertia21 - this._localInertia11 * this._localInertia20;
- let d = this._localInertia00 * d00 - this._localInertia01 * d01 + this._localInertia02 * d02;
- if(d < -1e-32 || d > 1e-32) {
- d = 1 / d;
- }
- this._invLocalInertia00 = d00 * d;
- this._invLocalInertia01 = -(this._localInertia01 * this._localInertia22 - this._localInertia02 * this._localInertia21) * d;
- this._invLocalInertia02 = (this._localInertia01 * this._localInertia12 - this._localInertia02 * this._localInertia11) * d;
- this._invLocalInertia10 = -d01 * d;
- this._invLocalInertia11 = (this._localInertia00 * this._localInertia22 - this._localInertia02 * this._localInertia20) * d;
- this._invLocalInertia12 = -(this._localInertia00 * this._localInertia12 - this._localInertia02 * this._localInertia10) * d;
- this._invLocalInertia20 = d02 * d;
- this._invLocalInertia21 = -(this._localInertia00 * this._localInertia21 - this._localInertia01 * this._localInertia20) * d;
- this._invLocalInertia22 = (this._localInertia00 * this._localInertia11 - this._localInertia01 * this._localInertia10) * d;
- this._invLocalInertiaWithoutRotFactor00 = this._invLocalInertia00;
- this._invLocalInertiaWithoutRotFactor01 = this._invLocalInertia01;
- this._invLocalInertiaWithoutRotFactor02 = this._invLocalInertia02;
- this._invLocalInertiaWithoutRotFactor10 = this._invLocalInertia10;
- this._invLocalInertiaWithoutRotFactor11 = this._invLocalInertia11;
- this._invLocalInertiaWithoutRotFactor12 = this._invLocalInertia12;
- this._invLocalInertiaWithoutRotFactor20 = this._invLocalInertia20;
- this._invLocalInertiaWithoutRotFactor21 = this._invLocalInertia21;
- this._invLocalInertiaWithoutRotFactor22 = this._invLocalInertia22;
- this._invLocalInertia00 = this._invLocalInertiaWithoutRotFactor00 * this._rotFactor.x;
- this._invLocalInertia01 = this._invLocalInertiaWithoutRotFactor01 * this._rotFactor.x;
- this._invLocalInertia02 = this._invLocalInertiaWithoutRotFactor02 * this._rotFactor.x;
- this._invLocalInertia10 = this._invLocalInertiaWithoutRotFactor10 * this._rotFactor.y;
- this._invLocalInertia11 = this._invLocalInertiaWithoutRotFactor11 * this._rotFactor.y;
- this._invLocalInertia12 = this._invLocalInertiaWithoutRotFactor12 * this._rotFactor.y;
- this._invLocalInertia20 = this._invLocalInertiaWithoutRotFactor20 * this._rotFactor.z;
- this._invLocalInertia21 = this._invLocalInertiaWithoutRotFactor21 * this._rotFactor.z;
- this._invLocalInertia22 = this._invLocalInertiaWithoutRotFactor22 * this._rotFactor.z;
- } else {
- this._invMass = 0;
- this._invLocalInertia00 = 0;
- this._invLocalInertia01 = 0;
- this._invLocalInertia02 = 0;
- this._invLocalInertia10 = 0;
- this._invLocalInertia11 = 0;
- this._invLocalInertia12 = 0;
- this._invLocalInertia20 = 0;
- this._invLocalInertia21 = 0;
- this._invLocalInertia22 = 0;
- this._invLocalInertiaWithoutRotFactor00 = 0;
- this._invLocalInertiaWithoutRotFactor01 = 0;
- this._invLocalInertiaWithoutRotFactor02 = 0;
- this._invLocalInertiaWithoutRotFactor10 = 0;
- this._invLocalInertiaWithoutRotFactor11 = 0;
- this._invLocalInertiaWithoutRotFactor12 = 0;
- this._invLocalInertiaWithoutRotFactor20 = 0;
- this._invLocalInertiaWithoutRotFactor21 = 0;
- this._invLocalInertiaWithoutRotFactor22 = 0;
- if(this._type == 0) {
- this._type = 1;
- }
- }
- let __tmp__00;
- let __tmp__01;
- let __tmp__02;
- let __tmp__10;
- let __tmp__11;
- let __tmp__12;
- let __tmp__20;
- let __tmp__21;
- let __tmp__22;
- __tmp__00 = this._transform._rotation00 * this._invLocalInertia00 + this._transform._rotation01 * this._invLocalInertia10 + this._transform._rotation02 * this._invLocalInertia20;
- __tmp__01 = this._transform._rotation00 * this._invLocalInertia01 + this._transform._rotation01 * this._invLocalInertia11 + this._transform._rotation02 * this._invLocalInertia21;
- __tmp__02 = this._transform._rotation00 * this._invLocalInertia02 + this._transform._rotation01 * this._invLocalInertia12 + this._transform._rotation02 * this._invLocalInertia22;
- __tmp__10 = this._transform._rotation10 * this._invLocalInertia00 + this._transform._rotation11 * this._invLocalInertia10 + this._transform._rotation12 * this._invLocalInertia20;
- __tmp__11 = this._transform._rotation10 * this._invLocalInertia01 + this._transform._rotation11 * this._invLocalInertia11 + this._transform._rotation12 * this._invLocalInertia21;
- __tmp__12 = this._transform._rotation10 * this._invLocalInertia02 + this._transform._rotation11 * this._invLocalInertia12 + this._transform._rotation12 * this._invLocalInertia22;
- __tmp__20 = this._transform._rotation20 * this._invLocalInertia00 + this._transform._rotation21 * this._invLocalInertia10 + this._transform._rotation22 * this._invLocalInertia20;
- __tmp__21 = this._transform._rotation20 * this._invLocalInertia01 + this._transform._rotation21 * this._invLocalInertia11 + this._transform._rotation22 * this._invLocalInertia21;
- __tmp__22 = this._transform._rotation20 * this._invLocalInertia02 + this._transform._rotation21 * this._invLocalInertia12 + this._transform._rotation22 * this._invLocalInertia22;
- this._invInertia00 = __tmp__00;
- this._invInertia01 = __tmp__01;
- this._invInertia02 = __tmp__02;
- this._invInertia10 = __tmp__10;
- this._invInertia11 = __tmp__11;
- this._invInertia12 = __tmp__12;
- this._invInertia20 = __tmp__20;
- this._invInertia21 = __tmp__21;
- this._invInertia22 = __tmp__22;
- let __tmp__001;
- let __tmp__011;
- let __tmp__021;
- let __tmp__101;
- let __tmp__111;
- let __tmp__121;
- let __tmp__201;
- let __tmp__211;
- let __tmp__221;
- __tmp__001 = this._invInertia00 * this._transform._rotation00 + this._invInertia01 * this._transform._rotation01 + this._invInertia02 * this._transform._rotation02;
- __tmp__011 = this._invInertia00 * this._transform._rotation10 + this._invInertia01 * this._transform._rotation11 + this._invInertia02 * this._transform._rotation12;
- __tmp__021 = this._invInertia00 * this._transform._rotation20 + this._invInertia01 * this._transform._rotation21 + this._invInertia02 * this._transform._rotation22;
- __tmp__101 = this._invInertia10 * this._transform._rotation00 + this._invInertia11 * this._transform._rotation01 + this._invInertia12 * this._transform._rotation02;
- __tmp__111 = this._invInertia10 * this._transform._rotation10 + this._invInertia11 * this._transform._rotation11 + this._invInertia12 * this._transform._rotation12;
- __tmp__121 = this._invInertia10 * this._transform._rotation20 + this._invInertia11 * this._transform._rotation21 + this._invInertia12 * this._transform._rotation22;
- __tmp__201 = this._invInertia20 * this._transform._rotation00 + this._invInertia21 * this._transform._rotation01 + this._invInertia22 * this._transform._rotation02;
- __tmp__211 = this._invInertia20 * this._transform._rotation10 + this._invInertia21 * this._transform._rotation11 + this._invInertia22 * this._transform._rotation12;
- __tmp__221 = this._invInertia20 * this._transform._rotation20 + this._invInertia21 * this._transform._rotation21 + this._invInertia22 * this._transform._rotation22;
- this._invInertia00 = __tmp__001;
- this._invInertia01 = __tmp__011;
- this._invInertia02 = __tmp__021;
- this._invInertia10 = __tmp__101;
- this._invInertia11 = __tmp__111;
- this._invInertia12 = __tmp__121;
- this._invInertia20 = __tmp__201;
- this._invInertia21 = __tmp__211;
- this._invInertia22 = __tmp__221;
- this._invInertia00 *= this._rotFactor.x;
- this._invInertia01 *= this._rotFactor.x;
- this._invInertia02 *= this._rotFactor.x;
- this._invInertia10 *= this._rotFactor.y;
- this._invInertia11 *= this._rotFactor.y;
- this._invInertia12 *= this._rotFactor.y;
- this._invInertia20 *= this._rotFactor.z;
- this._invInertia21 *= this._rotFactor.z;
- this._invInertia22 *= this._rotFactor.z;
- this._sleeping = false;
- this._sleepTime = 0;
- }
- getPosition() {
- let v = new oimo.common.Vec3();
- v.x = this._transform._positionX;
- v.y = this._transform._positionY;
- v.z = this._transform._positionZ;
- return v;
- }
- getPositionTo(position) {
- position.x = this._transform._positionX;
- position.y = this._transform._positionY;
- position.z = this._transform._positionZ;
- }
- setPosition(position) {
- this._transform._positionX = position.x;
- this._transform._positionY = position.y;
- this._transform._positionZ = position.z;
- let dst = this._ptransform;
- let src = this._transform;
- dst._positionX = src._positionX;
- dst._positionY = src._positionY;
- dst._positionZ = src._positionZ;
- dst._rotation00 = src._rotation00;
- dst._rotation01 = src._rotation01;
- dst._rotation02 = src._rotation02;
- dst._rotation10 = src._rotation10;
- dst._rotation11 = src._rotation11;
- dst._rotation12 = src._rotation12;
- dst._rotation20 = src._rotation20;
- dst._rotation21 = src._rotation21;
- dst._rotation22 = src._rotation22;
- let s = this._shapeList;
- while(s != null) {
- let n = s._next;
- let tf1 = this._ptransform;
- let tf2 = this._transform;
- let dst = s._ptransform;
- let src1 = s._localTransform;
- let __tmp__00;
- let __tmp__01;
- let __tmp__02;
- let __tmp__10;
- let __tmp__11;
- let __tmp__12;
- let __tmp__20;
- let __tmp__21;
- let __tmp__22;
- __tmp__00 = tf1._rotation00 * src1._rotation00 + tf1._rotation01 * src1._rotation10 + tf1._rotation02 * src1._rotation20;
- __tmp__01 = tf1._rotation00 * src1._rotation01 + tf1._rotation01 * src1._rotation11 + tf1._rotation02 * src1._rotation21;
- __tmp__02 = tf1._rotation00 * src1._rotation02 + tf1._rotation01 * src1._rotation12 + tf1._rotation02 * src1._rotation22;
- __tmp__10 = tf1._rotation10 * src1._rotation00 + tf1._rotation11 * src1._rotation10 + tf1._rotation12 * src1._rotation20;
- __tmp__11 = tf1._rotation10 * src1._rotation01 + tf1._rotation11 * src1._rotation11 + tf1._rotation12 * src1._rotation21;
- __tmp__12 = tf1._rotation10 * src1._rotation02 + tf1._rotation11 * src1._rotation12 + tf1._rotation12 * src1._rotation22;
- __tmp__20 = tf1._rotation20 * src1._rotation00 + tf1._rotation21 * src1._rotation10 + tf1._rotation22 * src1._rotation20;
- __tmp__21 = tf1._rotation20 * src1._rotation01 + tf1._rotation21 * src1._rotation11 + tf1._rotation22 * src1._rotation21;
- __tmp__22 = tf1._rotation20 * src1._rotation02 + tf1._rotation21 * src1._rotation12 + tf1._rotation22 * src1._rotation22;
- dst._rotation00 = __tmp__00;
- dst._rotation01 = __tmp__01;
- dst._rotation02 = __tmp__02;
- dst._rotation10 = __tmp__10;
- dst._rotation11 = __tmp__11;
- dst._rotation12 = __tmp__12;
- dst._rotation20 = __tmp__20;
- dst._rotation21 = __tmp__21;
- dst._rotation22 = __tmp__22;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = tf1._rotation00 * src1._positionX + tf1._rotation01 * src1._positionY + tf1._rotation02 * src1._positionZ;
- __tmp__Y = tf1._rotation10 * src1._positionX + tf1._rotation11 * src1._positionY + tf1._rotation12 * src1._positionZ;
- __tmp__Z = tf1._rotation20 * src1._positionX + tf1._rotation21 * src1._positionY + tf1._rotation22 * src1._positionZ;
- dst._positionX = __tmp__X;
- dst._positionY = __tmp__Y;
- dst._positionZ = __tmp__Z;
- dst._positionX += tf1._positionX;
- dst._positionY += tf1._positionY;
- dst._positionZ += tf1._positionZ;
- let dst1 = s._transform;
- let src11 = s._localTransform;
- let __tmp__001;
- let __tmp__011;
- let __tmp__021;
- let __tmp__101;
- let __tmp__111;
- let __tmp__121;
- let __tmp__201;
- let __tmp__211;
- let __tmp__221;
- __tmp__001 = tf2._rotation00 * src11._rotation00 + tf2._rotation01 * src11._rotation10 + tf2._rotation02 * src11._rotation20;
- __tmp__011 = tf2._rotation00 * src11._rotation01 + tf2._rotation01 * src11._rotation11 + tf2._rotation02 * src11._rotation21;
- __tmp__021 = tf2._rotation00 * src11._rotation02 + tf2._rotation01 * src11._rotation12 + tf2._rotation02 * src11._rotation22;
- __tmp__101 = tf2._rotation10 * src11._rotation00 + tf2._rotation11 * src11._rotation10 + tf2._rotation12 * src11._rotation20;
- __tmp__111 = tf2._rotation10 * src11._rotation01 + tf2._rotation11 * src11._rotation11 + tf2._rotation12 * src11._rotation21;
- __tmp__121 = tf2._rotation10 * src11._rotation02 + tf2._rotation11 * src11._rotation12 + tf2._rotation12 * src11._rotation22;
- __tmp__201 = tf2._rotation20 * src11._rotation00 + tf2._rotation21 * src11._rotation10 + tf2._rotation22 * src11._rotation20;
- __tmp__211 = tf2._rotation20 * src11._rotation01 + tf2._rotation21 * src11._rotation11 + tf2._rotation22 * src11._rotation21;
- __tmp__221 = tf2._rotation20 * src11._rotation02 + tf2._rotation21 * src11._rotation12 + tf2._rotation22 * src11._rotation22;
- dst1._rotation00 = __tmp__001;
- dst1._rotation01 = __tmp__011;
- dst1._rotation02 = __tmp__021;
- dst1._rotation10 = __tmp__101;
- dst1._rotation11 = __tmp__111;
- dst1._rotation12 = __tmp__121;
- dst1._rotation20 = __tmp__201;
- dst1._rotation21 = __tmp__211;
- dst1._rotation22 = __tmp__221;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = tf2._rotation00 * src11._positionX + tf2._rotation01 * src11._positionY + tf2._rotation02 * src11._positionZ;
- __tmp__Y1 = tf2._rotation10 * src11._positionX + tf2._rotation11 * src11._positionY + tf2._rotation12 * src11._positionZ;
- __tmp__Z1 = tf2._rotation20 * src11._positionX + tf2._rotation21 * src11._positionY + tf2._rotation22 * src11._positionZ;
- dst1._positionX = __tmp__X1;
- dst1._positionY = __tmp__Y1;
- dst1._positionZ = __tmp__Z1;
- dst1._positionX += tf2._positionX;
- dst1._positionY += tf2._positionY;
- dst1._positionZ += tf2._positionZ;
- let minX;
- let minY;
- let minZ;
- let maxX;
- let maxY;
- let maxZ;
- s._geom._computeAabb(s._aabb,s._ptransform);
- minX = s._aabb._minX;
- minY = s._aabb._minY;
- minZ = s._aabb._minZ;
- maxX = s._aabb._maxX;
- maxY = s._aabb._maxY;
- maxZ = s._aabb._maxZ;
- s._geom._computeAabb(s._aabb,s._transform);
- s._aabb._minX = minX < s._aabb._minX ? minX : s._aabb._minX;
- s._aabb._minY = minY < s._aabb._minY ? minY : s._aabb._minY;
- s._aabb._minZ = minZ < s._aabb._minZ ? minZ : s._aabb._minZ;
- s._aabb._maxX = maxX > s._aabb._maxX ? maxX : s._aabb._maxX;
- s._aabb._maxY = maxY > s._aabb._maxY ? maxY : s._aabb._maxY;
- s._aabb._maxZ = maxZ > s._aabb._maxZ ? maxZ : s._aabb._maxZ;
- if(s._proxy != null) {
- let dX;
- let dY;
- let dZ;
- dX = s._transform._positionX - s._ptransform._positionX;
- dY = s._transform._positionY - s._ptransform._positionY;
- dZ = s._transform._positionZ - s._ptransform._positionZ;
- let v = s.displacement;
- v.x = dX;
- v.y = dY;
- v.z = dZ;
- s._rigidBody._world._broadPhase.moveProxy(s._proxy,s._aabb,s.displacement);
- }
- s = n;
- }
- this._sleeping = false;
- this._sleepTime = 0;
- }
- translate(translation) {
- let diffX;
- let diffY;
- let diffZ;
- diffX = translation.x;
- diffY = translation.y;
- diffZ = translation.z;
- this._transform._positionX += diffX;
- this._transform._positionY += diffY;
- this._transform._positionZ += diffZ;
- let dst = this._ptransform;
- let src = this._transform;
- dst._positionX = src._positionX;
- dst._positionY = src._positionY;
- dst._positionZ = src._positionZ;
- dst._rotation00 = src._rotation00;
- dst._rotation01 = src._rotation01;
- dst._rotation02 = src._rotation02;
- dst._rotation10 = src._rotation10;
- dst._rotation11 = src._rotation11;
- dst._rotation12 = src._rotation12;
- dst._rotation20 = src._rotation20;
- dst._rotation21 = src._rotation21;
- dst._rotation22 = src._rotation22;
- let s = this._shapeList;
- while(s != null) {
- let n = s._next;
- let tf1 = this._ptransform;
- let tf2 = this._transform;
- let dst = s._ptransform;
- let src1 = s._localTransform;
- let __tmp__00;
- let __tmp__01;
- let __tmp__02;
- let __tmp__10;
- let __tmp__11;
- let __tmp__12;
- let __tmp__20;
- let __tmp__21;
- let __tmp__22;
- __tmp__00 = tf1._rotation00 * src1._rotation00 + tf1._rotation01 * src1._rotation10 + tf1._rotation02 * src1._rotation20;
- __tmp__01 = tf1._rotation00 * src1._rotation01 + tf1._rotation01 * src1._rotation11 + tf1._rotation02 * src1._rotation21;
- __tmp__02 = tf1._rotation00 * src1._rotation02 + tf1._rotation01 * src1._rotation12 + tf1._rotation02 * src1._rotation22;
- __tmp__10 = tf1._rotation10 * src1._rotation00 + tf1._rotation11 * src1._rotation10 + tf1._rotation12 * src1._rotation20;
- __tmp__11 = tf1._rotation10 * src1._rotation01 + tf1._rotation11 * src1._rotation11 + tf1._rotation12 * src1._rotation21;
- __tmp__12 = tf1._rotation10 * src1._rotation02 + tf1._rotation11 * src1._rotation12 + tf1._rotation12 * src1._rotation22;
- __tmp__20 = tf1._rotation20 * src1._rotation00 + tf1._rotation21 * src1._rotation10 + tf1._rotation22 * src1._rotation20;
- __tmp__21 = tf1._rotation20 * src1._rotation01 + tf1._rotation21 * src1._rotation11 + tf1._rotation22 * src1._rotation21;
- __tmp__22 = tf1._rotation20 * src1._rotation02 + tf1._rotation21 * src1._rotation12 + tf1._rotation22 * src1._rotation22;
- dst._rotation00 = __tmp__00;
- dst._rotation01 = __tmp__01;
- dst._rotation02 = __tmp__02;
- dst._rotation10 = __tmp__10;
- dst._rotation11 = __tmp__11;
- dst._rotation12 = __tmp__12;
- dst._rotation20 = __tmp__20;
- dst._rotation21 = __tmp__21;
- dst._rotation22 = __tmp__22;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = tf1._rotation00 * src1._positionX + tf1._rotation01 * src1._positionY + tf1._rotation02 * src1._positionZ;
- __tmp__Y = tf1._rotation10 * src1._positionX + tf1._rotation11 * src1._positionY + tf1._rotation12 * src1._positionZ;
- __tmp__Z = tf1._rotation20 * src1._positionX + tf1._rotation21 * src1._positionY + tf1._rotation22 * src1._positionZ;
- dst._positionX = __tmp__X;
- dst._positionY = __tmp__Y;
- dst._positionZ = __tmp__Z;
- dst._positionX += tf1._positionX;
- dst._positionY += tf1._positionY;
- dst._positionZ += tf1._positionZ;
- let dst1 = s._transform;
- let src11 = s._localTransform;
- let __tmp__001;
- let __tmp__011;
- let __tmp__021;
- let __tmp__101;
- let __tmp__111;
- let __tmp__121;
- let __tmp__201;
- let __tmp__211;
- let __tmp__221;
- __tmp__001 = tf2._rotation00 * src11._rotation00 + tf2._rotation01 * src11._rotation10 + tf2._rotation02 * src11._rotation20;
- __tmp__011 = tf2._rotation00 * src11._rotation01 + tf2._rotation01 * src11._rotation11 + tf2._rotation02 * src11._rotation21;
- __tmp__021 = tf2._rotation00 * src11._rotation02 + tf2._rotation01 * src11._rotation12 + tf2._rotation02 * src11._rotation22;
- __tmp__101 = tf2._rotation10 * src11._rotation00 + tf2._rotation11 * src11._rotation10 + tf2._rotation12 * src11._rotation20;
- __tmp__111 = tf2._rotation10 * src11._rotation01 + tf2._rotation11 * src11._rotation11 + tf2._rotation12 * src11._rotation21;
- __tmp__121 = tf2._rotation10 * src11._rotation02 + tf2._rotation11 * src11._rotation12 + tf2._rotation12 * src11._rotation22;
- __tmp__201 = tf2._rotation20 * src11._rotation00 + tf2._rotation21 * src11._rotation10 + tf2._rotation22 * src11._rotation20;
- __tmp__211 = tf2._rotation20 * src11._rotation01 + tf2._rotation21 * src11._rotation11 + tf2._rotation22 * src11._rotation21;
- __tmp__221 = tf2._rotation20 * src11._rotation02 + tf2._rotation21 * src11._rotation12 + tf2._rotation22 * src11._rotation22;
- dst1._rotation00 = __tmp__001;
- dst1._rotation01 = __tmp__011;
- dst1._rotation02 = __tmp__021;
- dst1._rotation10 = __tmp__101;
- dst1._rotation11 = __tmp__111;
- dst1._rotation12 = __tmp__121;
- dst1._rotation20 = __tmp__201;
- dst1._rotation21 = __tmp__211;
- dst1._rotation22 = __tmp__221;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = tf2._rotation00 * src11._positionX + tf2._rotation01 * src11._positionY + tf2._rotation02 * src11._positionZ;
- __tmp__Y1 = tf2._rotation10 * src11._positionX + tf2._rotation11 * src11._positionY + tf2._rotation12 * src11._positionZ;
- __tmp__Z1 = tf2._rotation20 * src11._positionX + tf2._rotation21 * src11._positionY + tf2._rotation22 * src11._positionZ;
- dst1._positionX = __tmp__X1;
- dst1._positionY = __tmp__Y1;
- dst1._positionZ = __tmp__Z1;
- dst1._positionX += tf2._positionX;
- dst1._positionY += tf2._positionY;
- dst1._positionZ += tf2._positionZ;
- let minX;
- let minY;
- let minZ;
- let maxX;
- let maxY;
- let maxZ;
- s._geom._computeAabb(s._aabb,s._ptransform);
- minX = s._aabb._minX;
- minY = s._aabb._minY;
- minZ = s._aabb._minZ;
- maxX = s._aabb._maxX;
- maxY = s._aabb._maxY;
- maxZ = s._aabb._maxZ;
- s._geom._computeAabb(s._aabb,s._transform);
- s._aabb._minX = minX < s._aabb._minX ? minX : s._aabb._minX;
- s._aabb._minY = minY < s._aabb._minY ? minY : s._aabb._minY;
- s._aabb._minZ = minZ < s._aabb._minZ ? minZ : s._aabb._minZ;
- s._aabb._maxX = maxX > s._aabb._maxX ? maxX : s._aabb._maxX;
- s._aabb._maxY = maxY > s._aabb._maxY ? maxY : s._aabb._maxY;
- s._aabb._maxZ = maxZ > s._aabb._maxZ ? maxZ : s._aabb._maxZ;
- if(s._proxy != null) {
- let dX;
- let dY;
- let dZ;
- dX = s._transform._positionX - s._ptransform._positionX;
- dY = s._transform._positionY - s._ptransform._positionY;
- dZ = s._transform._positionZ - s._ptransform._positionZ;
- let v = s.displacement;
- v.x = dX;
- v.y = dY;
- v.z = dZ;
- s._rigidBody._world._broadPhase.moveProxy(s._proxy,s._aabb,s.displacement);
- }
- s = n;
- }
- this._sleeping = false;
- this._sleepTime = 0;
- }
- getRotation() {
- let m = new oimo.common.Mat3();
- m.e00 = this._transform._rotation00;
- m.e01 = this._transform._rotation01;
- m.e02 = this._transform._rotation02;
- m.e10 = this._transform._rotation10;
- m.e11 = this._transform._rotation11;
- m.e12 = this._transform._rotation12;
- m.e20 = this._transform._rotation20;
- m.e21 = this._transform._rotation21;
- m.e22 = this._transform._rotation22;
- return m;
- }
- getRotationTo(rotation) {
- rotation.e00 = this._transform._rotation00;
- rotation.e01 = this._transform._rotation01;
- rotation.e02 = this._transform._rotation02;
- rotation.e10 = this._transform._rotation10;
- rotation.e11 = this._transform._rotation11;
- rotation.e12 = this._transform._rotation12;
- rotation.e20 = this._transform._rotation20;
- rotation.e21 = this._transform._rotation21;
- rotation.e22 = this._transform._rotation22;
- }
- setRotation(rotation) {
- this._transform._rotation00 = rotation.e00;
- this._transform._rotation01 = rotation.e01;
- this._transform._rotation02 = rotation.e02;
- this._transform._rotation10 = rotation.e10;
- this._transform._rotation11 = rotation.e11;
- this._transform._rotation12 = rotation.e12;
- this._transform._rotation20 = rotation.e20;
- this._transform._rotation21 = rotation.e21;
- this._transform._rotation22 = rotation.e22;
- let __tmp__00;
- let __tmp__01;
- let __tmp__02;
- let __tmp__10;
- let __tmp__11;
- let __tmp__12;
- let __tmp__20;
- let __tmp__21;
- let __tmp__22;
- __tmp__00 = this._transform._rotation00 * this._invLocalInertia00 + this._transform._rotation01 * this._invLocalInertia10 + this._transform._rotation02 * this._invLocalInertia20;
- __tmp__01 = this._transform._rotation00 * this._invLocalInertia01 + this._transform._rotation01 * this._invLocalInertia11 + this._transform._rotation02 * this._invLocalInertia21;
- __tmp__02 = this._transform._rotation00 * this._invLocalInertia02 + this._transform._rotation01 * this._invLocalInertia12 + this._transform._rotation02 * this._invLocalInertia22;
- __tmp__10 = this._transform._rotation10 * this._invLocalInertia00 + this._transform._rotation11 * this._invLocalInertia10 + this._transform._rotation12 * this._invLocalInertia20;
- __tmp__11 = this._transform._rotation10 * this._invLocalInertia01 + this._transform._rotation11 * this._invLocalInertia11 + this._transform._rotation12 * this._invLocalInertia21;
- __tmp__12 = this._transform._rotation10 * this._invLocalInertia02 + this._transform._rotation11 * this._invLocalInertia12 + this._transform._rotation12 * this._invLocalInertia22;
- __tmp__20 = this._transform._rotation20 * this._invLocalInertia00 + this._transform._rotation21 * this._invLocalInertia10 + this._transform._rotation22 * this._invLocalInertia20;
- __tmp__21 = this._transform._rotation20 * this._invLocalInertia01 + this._transform._rotation21 * this._invLocalInertia11 + this._transform._rotation22 * this._invLocalInertia21;
- __tmp__22 = this._transform._rotation20 * this._invLocalInertia02 + this._transform._rotation21 * this._invLocalInertia12 + this._transform._rotation22 * this._invLocalInertia22;
- this._invInertia00 = __tmp__00;
- this._invInertia01 = __tmp__01;
- this._invInertia02 = __tmp__02;
- this._invInertia10 = __tmp__10;
- this._invInertia11 = __tmp__11;
- this._invInertia12 = __tmp__12;
- this._invInertia20 = __tmp__20;
- this._invInertia21 = __tmp__21;
- this._invInertia22 = __tmp__22;
- let __tmp__001;
- let __tmp__011;
- let __tmp__021;
- let __tmp__101;
- let __tmp__111;
- let __tmp__121;
- let __tmp__201;
- let __tmp__211;
- let __tmp__221;
- __tmp__001 = this._invInertia00 * this._transform._rotation00 + this._invInertia01 * this._transform._rotation01 + this._invInertia02 * this._transform._rotation02;
- __tmp__011 = this._invInertia00 * this._transform._rotation10 + this._invInertia01 * this._transform._rotation11 + this._invInertia02 * this._transform._rotation12;
- __tmp__021 = this._invInertia00 * this._transform._rotation20 + this._invInertia01 * this._transform._rotation21 + this._invInertia02 * this._transform._rotation22;
- __tmp__101 = this._invInertia10 * this._transform._rotation00 + this._invInertia11 * this._transform._rotation01 + this._invInertia12 * this._transform._rotation02;
- __tmp__111 = this._invInertia10 * this._transform._rotation10 + this._invInertia11 * this._transform._rotation11 + this._invInertia12 * this._transform._rotation12;
- __tmp__121 = this._invInertia10 * this._transform._rotation20 + this._invInertia11 * this._transform._rotation21 + this._invInertia12 * this._transform._rotation22;
- __tmp__201 = this._invInertia20 * this._transform._rotation00 + this._invInertia21 * this._transform._rotation01 + this._invInertia22 * this._transform._rotation02;
- __tmp__211 = this._invInertia20 * this._transform._rotation10 + this._invInertia21 * this._transform._rotation11 + this._invInertia22 * this._transform._rotation12;
- __tmp__221 = this._invInertia20 * this._transform._rotation20 + this._invInertia21 * this._transform._rotation21 + this._invInertia22 * this._transform._rotation22;
- this._invInertia00 = __tmp__001;
- this._invInertia01 = __tmp__011;
- this._invInertia02 = __tmp__021;
- this._invInertia10 = __tmp__101;
- this._invInertia11 = __tmp__111;
- this._invInertia12 = __tmp__121;
- this._invInertia20 = __tmp__201;
- this._invInertia21 = __tmp__211;
- this._invInertia22 = __tmp__221;
- this._invInertia00 *= this._rotFactor.x;
- this._invInertia01 *= this._rotFactor.x;
- this._invInertia02 *= this._rotFactor.x;
- this._invInertia10 *= this._rotFactor.y;
- this._invInertia11 *= this._rotFactor.y;
- this._invInertia12 *= this._rotFactor.y;
- this._invInertia20 *= this._rotFactor.z;
- this._invInertia21 *= this._rotFactor.z;
- this._invInertia22 *= this._rotFactor.z;
- let dst = this._ptransform;
- let src = this._transform;
- dst._positionX = src._positionX;
- dst._positionY = src._positionY;
- dst._positionZ = src._positionZ;
- dst._rotation00 = src._rotation00;
- dst._rotation01 = src._rotation01;
- dst._rotation02 = src._rotation02;
- dst._rotation10 = src._rotation10;
- dst._rotation11 = src._rotation11;
- dst._rotation12 = src._rotation12;
- dst._rotation20 = src._rotation20;
- dst._rotation21 = src._rotation21;
- dst._rotation22 = src._rotation22;
- let s = this._shapeList;
- while(s != null) {
- let n = s._next;
- let tf1 = this._ptransform;
- let tf2 = this._transform;
- let dst = s._ptransform;
- let src1 = s._localTransform;
- let __tmp__00;
- let __tmp__01;
- let __tmp__02;
- let __tmp__10;
- let __tmp__11;
- let __tmp__12;
- let __tmp__20;
- let __tmp__21;
- let __tmp__22;
- __tmp__00 = tf1._rotation00 * src1._rotation00 + tf1._rotation01 * src1._rotation10 + tf1._rotation02 * src1._rotation20;
- __tmp__01 = tf1._rotation00 * src1._rotation01 + tf1._rotation01 * src1._rotation11 + tf1._rotation02 * src1._rotation21;
- __tmp__02 = tf1._rotation00 * src1._rotation02 + tf1._rotation01 * src1._rotation12 + tf1._rotation02 * src1._rotation22;
- __tmp__10 = tf1._rotation10 * src1._rotation00 + tf1._rotation11 * src1._rotation10 + tf1._rotation12 * src1._rotation20;
- __tmp__11 = tf1._rotation10 * src1._rotation01 + tf1._rotation11 * src1._rotation11 + tf1._rotation12 * src1._rotation21;
- __tmp__12 = tf1._rotation10 * src1._rotation02 + tf1._rotation11 * src1._rotation12 + tf1._rotation12 * src1._rotation22;
- __tmp__20 = tf1._rotation20 * src1._rotation00 + tf1._rotation21 * src1._rotation10 + tf1._rotation22 * src1._rotation20;
- __tmp__21 = tf1._rotation20 * src1._rotation01 + tf1._rotation21 * src1._rotation11 + tf1._rotation22 * src1._rotation21;
- __tmp__22 = tf1._rotation20 * src1._rotation02 + tf1._rotation21 * src1._rotation12 + tf1._rotation22 * src1._rotation22;
- dst._rotation00 = __tmp__00;
- dst._rotation01 = __tmp__01;
- dst._rotation02 = __tmp__02;
- dst._rotation10 = __tmp__10;
- dst._rotation11 = __tmp__11;
- dst._rotation12 = __tmp__12;
- dst._rotation20 = __tmp__20;
- dst._rotation21 = __tmp__21;
- dst._rotation22 = __tmp__22;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = tf1._rotation00 * src1._positionX + tf1._rotation01 * src1._positionY + tf1._rotation02 * src1._positionZ;
- __tmp__Y = tf1._rotation10 * src1._positionX + tf1._rotation11 * src1._positionY + tf1._rotation12 * src1._positionZ;
- __tmp__Z = tf1._rotation20 * src1._positionX + tf1._rotation21 * src1._positionY + tf1._rotation22 * src1._positionZ;
- dst._positionX = __tmp__X;
- dst._positionY = __tmp__Y;
- dst._positionZ = __tmp__Z;
- dst._positionX += tf1._positionX;
- dst._positionY += tf1._positionY;
- dst._positionZ += tf1._positionZ;
- let dst1 = s._transform;
- let src11 = s._localTransform;
- let __tmp__001;
- let __tmp__011;
- let __tmp__021;
- let __tmp__101;
- let __tmp__111;
- let __tmp__121;
- let __tmp__201;
- let __tmp__211;
- let __tmp__221;
- __tmp__001 = tf2._rotation00 * src11._rotation00 + tf2._rotation01 * src11._rotation10 + tf2._rotation02 * src11._rotation20;
- __tmp__011 = tf2._rotation00 * src11._rotation01 + tf2._rotation01 * src11._rotation11 + tf2._rotation02 * src11._rotation21;
- __tmp__021 = tf2._rotation00 * src11._rotation02 + tf2._rotation01 * src11._rotation12 + tf2._rotation02 * src11._rotation22;
- __tmp__101 = tf2._rotation10 * src11._rotation00 + tf2._rotation11 * src11._rotation10 + tf2._rotation12 * src11._rotation20;
- __tmp__111 = tf2._rotation10 * src11._rotation01 + tf2._rotation11 * src11._rotation11 + tf2._rotation12 * src11._rotation21;
- __tmp__121 = tf2._rotation10 * src11._rotation02 + tf2._rotation11 * src11._rotation12 + tf2._rotation12 * src11._rotation22;
- __tmp__201 = tf2._rotation20 * src11._rotation00 + tf2._rotation21 * src11._rotation10 + tf2._rotation22 * src11._rotation20;
- __tmp__211 = tf2._rotation20 * src11._rotation01 + tf2._rotation21 * src11._rotation11 + tf2._rotation22 * src11._rotation21;
- __tmp__221 = tf2._rotation20 * src11._rotation02 + tf2._rotation21 * src11._rotation12 + tf2._rotation22 * src11._rotation22;
- dst1._rotation00 = __tmp__001;
- dst1._rotation01 = __tmp__011;
- dst1._rotation02 = __tmp__021;
- dst1._rotation10 = __tmp__101;
- dst1._rotation11 = __tmp__111;
- dst1._rotation12 = __tmp__121;
- dst1._rotation20 = __tmp__201;
- dst1._rotation21 = __tmp__211;
- dst1._rotation22 = __tmp__221;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = tf2._rotation00 * src11._positionX + tf2._rotation01 * src11._positionY + tf2._rotation02 * src11._positionZ;
- __tmp__Y1 = tf2._rotation10 * src11._positionX + tf2._rotation11 * src11._positionY + tf2._rotation12 * src11._positionZ;
- __tmp__Z1 = tf2._rotation20 * src11._positionX + tf2._rotation21 * src11._positionY + tf2._rotation22 * src11._positionZ;
- dst1._positionX = __tmp__X1;
- dst1._positionY = __tmp__Y1;
- dst1._positionZ = __tmp__Z1;
- dst1._positionX += tf2._positionX;
- dst1._positionY += tf2._positionY;
- dst1._positionZ += tf2._positionZ;
- let minX;
- let minY;
- let minZ;
- let maxX;
- let maxY;
- let maxZ;
- s._geom._computeAabb(s._aabb,s._ptransform);
- minX = s._aabb._minX;
- minY = s._aabb._minY;
- minZ = s._aabb._minZ;
- maxX = s._aabb._maxX;
- maxY = s._aabb._maxY;
- maxZ = s._aabb._maxZ;
- s._geom._computeAabb(s._aabb,s._transform);
- s._aabb._minX = minX < s._aabb._minX ? minX : s._aabb._minX;
- s._aabb._minY = minY < s._aabb._minY ? minY : s._aabb._minY;
- s._aabb._minZ = minZ < s._aabb._minZ ? minZ : s._aabb._minZ;
- s._aabb._maxX = maxX > s._aabb._maxX ? maxX : s._aabb._maxX;
- s._aabb._maxY = maxY > s._aabb._maxY ? maxY : s._aabb._maxY;
- s._aabb._maxZ = maxZ > s._aabb._maxZ ? maxZ : s._aabb._maxZ;
- if(s._proxy != null) {
- let dX;
- let dY;
- let dZ;
- dX = s._transform._positionX - s._ptransform._positionX;
- dY = s._transform._positionY - s._ptransform._positionY;
- dZ = s._transform._positionZ - s._ptransform._positionZ;
- let v = s.displacement;
- v.x = dX;
- v.y = dY;
- v.z = dZ;
- s._rigidBody._world._broadPhase.moveProxy(s._proxy,s._aabb,s.displacement);
- }
- s = n;
- }
- this._sleeping = false;
- this._sleepTime = 0;
- }
- setRotationXyz(eulerAngles) {
- let xyzX;
- let xyzY;
- let xyzZ;
- xyzX = eulerAngles.x;
- xyzY = eulerAngles.y;
- xyzZ = eulerAngles.z;
- let sx = Math.sin(xyzX);
- let sy = Math.sin(xyzY);
- let sz = Math.sin(xyzZ);
- let cx = Math.cos(xyzX);
- let cy = Math.cos(xyzY);
- let cz = Math.cos(xyzZ);
- this._transform._rotation00 = cy * cz;
- this._transform._rotation01 = -cy * sz;
- this._transform._rotation02 = sy;
- this._transform._rotation10 = cx * sz + cz * sx * sy;
- this._transform._rotation11 = cx * cz - sx * sy * sz;
- this._transform._rotation12 = -cy * sx;
- this._transform._rotation20 = sx * sz - cx * cz * sy;
- this._transform._rotation21 = cz * sx + cx * sy * sz;
- this._transform._rotation22 = cx * cy;
- let __tmp__00;
- let __tmp__01;
- let __tmp__02;
- let __tmp__10;
- let __tmp__11;
- let __tmp__12;
- let __tmp__20;
- let __tmp__21;
- let __tmp__22;
- __tmp__00 = this._transform._rotation00 * this._invLocalInertia00 + this._transform._rotation01 * this._invLocalInertia10 + this._transform._rotation02 * this._invLocalInertia20;
- __tmp__01 = this._transform._rotation00 * this._invLocalInertia01 + this._transform._rotation01 * this._invLocalInertia11 + this._transform._rotation02 * this._invLocalInertia21;
- __tmp__02 = this._transform._rotation00 * this._invLocalInertia02 + this._transform._rotation01 * this._invLocalInertia12 + this._transform._rotation02 * this._invLocalInertia22;
- __tmp__10 = this._transform._rotation10 * this._invLocalInertia00 + this._transform._rotation11 * this._invLocalInertia10 + this._transform._rotation12 * this._invLocalInertia20;
- __tmp__11 = this._transform._rotation10 * this._invLocalInertia01 + this._transform._rotation11 * this._invLocalInertia11 + this._transform._rotation12 * this._invLocalInertia21;
- __tmp__12 = this._transform._rotation10 * this._invLocalInertia02 + this._transform._rotation11 * this._invLocalInertia12 + this._transform._rotation12 * this._invLocalInertia22;
- __tmp__20 = this._transform._rotation20 * this._invLocalInertia00 + this._transform._rotation21 * this._invLocalInertia10 + this._transform._rotation22 * this._invLocalInertia20;
- __tmp__21 = this._transform._rotation20 * this._invLocalInertia01 + this._transform._rotation21 * this._invLocalInertia11 + this._transform._rotation22 * this._invLocalInertia21;
- __tmp__22 = this._transform._rotation20 * this._invLocalInertia02 + this._transform._rotation21 * this._invLocalInertia12 + this._transform._rotation22 * this._invLocalInertia22;
- this._invInertia00 = __tmp__00;
- this._invInertia01 = __tmp__01;
- this._invInertia02 = __tmp__02;
- this._invInertia10 = __tmp__10;
- this._invInertia11 = __tmp__11;
- this._invInertia12 = __tmp__12;
- this._invInertia20 = __tmp__20;
- this._invInertia21 = __tmp__21;
- this._invInertia22 = __tmp__22;
- let __tmp__001;
- let __tmp__011;
- let __tmp__021;
- let __tmp__101;
- let __tmp__111;
- let __tmp__121;
- let __tmp__201;
- let __tmp__211;
- let __tmp__221;
- __tmp__001 = this._invInertia00 * this._transform._rotation00 + this._invInertia01 * this._transform._rotation01 + this._invInertia02 * this._transform._rotation02;
- __tmp__011 = this._invInertia00 * this._transform._rotation10 + this._invInertia01 * this._transform._rotation11 + this._invInertia02 * this._transform._rotation12;
- __tmp__021 = this._invInertia00 * this._transform._rotation20 + this._invInertia01 * this._transform._rotation21 + this._invInertia02 * this._transform._rotation22;
- __tmp__101 = this._invInertia10 * this._transform._rotation00 + this._invInertia11 * this._transform._rotation01 + this._invInertia12 * this._transform._rotation02;
- __tmp__111 = this._invInertia10 * this._transform._rotation10 + this._invInertia11 * this._transform._rotation11 + this._invInertia12 * this._transform._rotation12;
- __tmp__121 = this._invInertia10 * this._transform._rotation20 + this._invInertia11 * this._transform._rotation21 + this._invInertia12 * this._transform._rotation22;
- __tmp__201 = this._invInertia20 * this._transform._rotation00 + this._invInertia21 * this._transform._rotation01 + this._invInertia22 * this._transform._rotation02;
- __tmp__211 = this._invInertia20 * this._transform._rotation10 + this._invInertia21 * this._transform._rotation11 + this._invInertia22 * this._transform._rotation12;
- __tmp__221 = this._invInertia20 * this._transform._rotation20 + this._invInertia21 * this._transform._rotation21 + this._invInertia22 * this._transform._rotation22;
- this._invInertia00 = __tmp__001;
- this._invInertia01 = __tmp__011;
- this._invInertia02 = __tmp__021;
- this._invInertia10 = __tmp__101;
- this._invInertia11 = __tmp__111;
- this._invInertia12 = __tmp__121;
- this._invInertia20 = __tmp__201;
- this._invInertia21 = __tmp__211;
- this._invInertia22 = __tmp__221;
- this._invInertia00 *= this._rotFactor.x;
- this._invInertia01 *= this._rotFactor.x;
- this._invInertia02 *= this._rotFactor.x;
- this._invInertia10 *= this._rotFactor.y;
- this._invInertia11 *= this._rotFactor.y;
- this._invInertia12 *= this._rotFactor.y;
- this._invInertia20 *= this._rotFactor.z;
- this._invInertia21 *= this._rotFactor.z;
- this._invInertia22 *= this._rotFactor.z;
- let dst = this._ptransform;
- let src = this._transform;
- dst._positionX = src._positionX;
- dst._positionY = src._positionY;
- dst._positionZ = src._positionZ;
- dst._rotation00 = src._rotation00;
- dst._rotation01 = src._rotation01;
- dst._rotation02 = src._rotation02;
- dst._rotation10 = src._rotation10;
- dst._rotation11 = src._rotation11;
- dst._rotation12 = src._rotation12;
- dst._rotation20 = src._rotation20;
- dst._rotation21 = src._rotation21;
- dst._rotation22 = src._rotation22;
- let s = this._shapeList;
- while(s != null) {
- let n = s._next;
- let tf1 = this._ptransform;
- let tf2 = this._transform;
- let dst = s._ptransform;
- let src1 = s._localTransform;
- let __tmp__00;
- let __tmp__01;
- let __tmp__02;
- let __tmp__10;
- let __tmp__11;
- let __tmp__12;
- let __tmp__20;
- let __tmp__21;
- let __tmp__22;
- __tmp__00 = tf1._rotation00 * src1._rotation00 + tf1._rotation01 * src1._rotation10 + tf1._rotation02 * src1._rotation20;
- __tmp__01 = tf1._rotation00 * src1._rotation01 + tf1._rotation01 * src1._rotation11 + tf1._rotation02 * src1._rotation21;
- __tmp__02 = tf1._rotation00 * src1._rotation02 + tf1._rotation01 * src1._rotation12 + tf1._rotation02 * src1._rotation22;
- __tmp__10 = tf1._rotation10 * src1._rotation00 + tf1._rotation11 * src1._rotation10 + tf1._rotation12 * src1._rotation20;
- __tmp__11 = tf1._rotation10 * src1._rotation01 + tf1._rotation11 * src1._rotation11 + tf1._rotation12 * src1._rotation21;
- __tmp__12 = tf1._rotation10 * src1._rotation02 + tf1._rotation11 * src1._rotation12 + tf1._rotation12 * src1._rotation22;
- __tmp__20 = tf1._rotation20 * src1._rotation00 + tf1._rotation21 * src1._rotation10 + tf1._rotation22 * src1._rotation20;
- __tmp__21 = tf1._rotation20 * src1._rotation01 + tf1._rotation21 * src1._rotation11 + tf1._rotation22 * src1._rotation21;
- __tmp__22 = tf1._rotation20 * src1._rotation02 + tf1._rotation21 * src1._rotation12 + tf1._rotation22 * src1._rotation22;
- dst._rotation00 = __tmp__00;
- dst._rotation01 = __tmp__01;
- dst._rotation02 = __tmp__02;
- dst._rotation10 = __tmp__10;
- dst._rotation11 = __tmp__11;
- dst._rotation12 = __tmp__12;
- dst._rotation20 = __tmp__20;
- dst._rotation21 = __tmp__21;
- dst._rotation22 = __tmp__22;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = tf1._rotation00 * src1._positionX + tf1._rotation01 * src1._positionY + tf1._rotation02 * src1._positionZ;
- __tmp__Y = tf1._rotation10 * src1._positionX + tf1._rotation11 * src1._positionY + tf1._rotation12 * src1._positionZ;
- __tmp__Z = tf1._rotation20 * src1._positionX + tf1._rotation21 * src1._positionY + tf1._rotation22 * src1._positionZ;
- dst._positionX = __tmp__X;
- dst._positionY = __tmp__Y;
- dst._positionZ = __tmp__Z;
- dst._positionX += tf1._positionX;
- dst._positionY += tf1._positionY;
- dst._positionZ += tf1._positionZ;
- let dst1 = s._transform;
- let src11 = s._localTransform;
- let __tmp__001;
- let __tmp__011;
- let __tmp__021;
- let __tmp__101;
- let __tmp__111;
- let __tmp__121;
- let __tmp__201;
- let __tmp__211;
- let __tmp__221;
- __tmp__001 = tf2._rotation00 * src11._rotation00 + tf2._rotation01 * src11._rotation10 + tf2._rotation02 * src11._rotation20;
- __tmp__011 = tf2._rotation00 * src11._rotation01 + tf2._rotation01 * src11._rotation11 + tf2._rotation02 * src11._rotation21;
- __tmp__021 = tf2._rotation00 * src11._rotation02 + tf2._rotation01 * src11._rotation12 + tf2._rotation02 * src11._rotation22;
- __tmp__101 = tf2._rotation10 * src11._rotation00 + tf2._rotation11 * src11._rotation10 + tf2._rotation12 * src11._rotation20;
- __tmp__111 = tf2._rotation10 * src11._rotation01 + tf2._rotation11 * src11._rotation11 + tf2._rotation12 * src11._rotation21;
- __tmp__121 = tf2._rotation10 * src11._rotation02 + tf2._rotation11 * src11._rotation12 + tf2._rotation12 * src11._rotation22;
- __tmp__201 = tf2._rotation20 * src11._rotation00 + tf2._rotation21 * src11._rotation10 + tf2._rotation22 * src11._rotation20;
- __tmp__211 = tf2._rotation20 * src11._rotation01 + tf2._rotation21 * src11._rotation11 + tf2._rotation22 * src11._rotation21;
- __tmp__221 = tf2._rotation20 * src11._rotation02 + tf2._rotation21 * src11._rotation12 + tf2._rotation22 * src11._rotation22;
- dst1._rotation00 = __tmp__001;
- dst1._rotation01 = __tmp__011;
- dst1._rotation02 = __tmp__021;
- dst1._rotation10 = __tmp__101;
- dst1._rotation11 = __tmp__111;
- dst1._rotation12 = __tmp__121;
- dst1._rotation20 = __tmp__201;
- dst1._rotation21 = __tmp__211;
- dst1._rotation22 = __tmp__221;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = tf2._rotation00 * src11._positionX + tf2._rotation01 * src11._positionY + tf2._rotation02 * src11._positionZ;
- __tmp__Y1 = tf2._rotation10 * src11._positionX + tf2._rotation11 * src11._positionY + tf2._rotation12 * src11._positionZ;
- __tmp__Z1 = tf2._rotation20 * src11._positionX + tf2._rotation21 * src11._positionY + tf2._rotation22 * src11._positionZ;
- dst1._positionX = __tmp__X1;
- dst1._positionY = __tmp__Y1;
- dst1._positionZ = __tmp__Z1;
- dst1._positionX += tf2._positionX;
- dst1._positionY += tf2._positionY;
- dst1._positionZ += tf2._positionZ;
- let minX;
- let minY;
- let minZ;
- let maxX;
- let maxY;
- let maxZ;
- s._geom._computeAabb(s._aabb,s._ptransform);
- minX = s._aabb._minX;
- minY = s._aabb._minY;
- minZ = s._aabb._minZ;
- maxX = s._aabb._maxX;
- maxY = s._aabb._maxY;
- maxZ = s._aabb._maxZ;
- s._geom._computeAabb(s._aabb,s._transform);
- s._aabb._minX = minX < s._aabb._minX ? minX : s._aabb._minX;
- s._aabb._minY = minY < s._aabb._minY ? minY : s._aabb._minY;
- s._aabb._minZ = minZ < s._aabb._minZ ? minZ : s._aabb._minZ;
- s._aabb._maxX = maxX > s._aabb._maxX ? maxX : s._aabb._maxX;
- s._aabb._maxY = maxY > s._aabb._maxY ? maxY : s._aabb._maxY;
- s._aabb._maxZ = maxZ > s._aabb._maxZ ? maxZ : s._aabb._maxZ;
- if(s._proxy != null) {
- let dX;
- let dY;
- let dZ;
- dX = s._transform._positionX - s._ptransform._positionX;
- dY = s._transform._positionY - s._ptransform._positionY;
- dZ = s._transform._positionZ - s._ptransform._positionZ;
- let v = s.displacement;
- v.x = dX;
- v.y = dY;
- v.z = dZ;
- s._rigidBody._world._broadPhase.moveProxy(s._proxy,s._aabb,s.displacement);
- }
- s = n;
- }
- this._sleeping = false;
- this._sleepTime = 0;
- }
- rotate(rotation) {
- let rot00;
- let rot01;
- let rot02;
- let rot10;
- let rot11;
- let rot12;
- let rot20;
- let rot21;
- let rot22;
- rot00 = rotation.e00;
- rot01 = rotation.e01;
- rot02 = rotation.e02;
- rot10 = rotation.e10;
- rot11 = rotation.e11;
- rot12 = rotation.e12;
- rot20 = rotation.e20;
- rot21 = rotation.e21;
- rot22 = rotation.e22;
- let __tmp__00;
- let __tmp__01;
- let __tmp__02;
- let __tmp__10;
- let __tmp__11;
- let __tmp__12;
- let __tmp__20;
- let __tmp__21;
- let __tmp__22;
- __tmp__00 = rot00 * this._transform._rotation00 + rot01 * this._transform._rotation10 + rot02 * this._transform._rotation20;
- __tmp__01 = rot00 * this._transform._rotation01 + rot01 * this._transform._rotation11 + rot02 * this._transform._rotation21;
- __tmp__02 = rot00 * this._transform._rotation02 + rot01 * this._transform._rotation12 + rot02 * this._transform._rotation22;
- __tmp__10 = rot10 * this._transform._rotation00 + rot11 * this._transform._rotation10 + rot12 * this._transform._rotation20;
- __tmp__11 = rot10 * this._transform._rotation01 + rot11 * this._transform._rotation11 + rot12 * this._transform._rotation21;
- __tmp__12 = rot10 * this._transform._rotation02 + rot11 * this._transform._rotation12 + rot12 * this._transform._rotation22;
- __tmp__20 = rot20 * this._transform._rotation00 + rot21 * this._transform._rotation10 + rot22 * this._transform._rotation20;
- __tmp__21 = rot20 * this._transform._rotation01 + rot21 * this._transform._rotation11 + rot22 * this._transform._rotation21;
- __tmp__22 = rot20 * this._transform._rotation02 + rot21 * this._transform._rotation12 + rot22 * this._transform._rotation22;
- this._transform._rotation00 = __tmp__00;
- this._transform._rotation01 = __tmp__01;
- this._transform._rotation02 = __tmp__02;
- this._transform._rotation10 = __tmp__10;
- this._transform._rotation11 = __tmp__11;
- this._transform._rotation12 = __tmp__12;
- this._transform._rotation20 = __tmp__20;
- this._transform._rotation21 = __tmp__21;
- this._transform._rotation22 = __tmp__22;
- let __tmp__001;
- let __tmp__011;
- let __tmp__021;
- let __tmp__101;
- let __tmp__111;
- let __tmp__121;
- let __tmp__201;
- let __tmp__211;
- let __tmp__221;
- __tmp__001 = this._transform._rotation00 * this._invLocalInertia00 + this._transform._rotation01 * this._invLocalInertia10 + this._transform._rotation02 * this._invLocalInertia20;
- __tmp__011 = this._transform._rotation00 * this._invLocalInertia01 + this._transform._rotation01 * this._invLocalInertia11 + this._transform._rotation02 * this._invLocalInertia21;
- __tmp__021 = this._transform._rotation00 * this._invLocalInertia02 + this._transform._rotation01 * this._invLocalInertia12 + this._transform._rotation02 * this._invLocalInertia22;
- __tmp__101 = this._transform._rotation10 * this._invLocalInertia00 + this._transform._rotation11 * this._invLocalInertia10 + this._transform._rotation12 * this._invLocalInertia20;
- __tmp__111 = this._transform._rotation10 * this._invLocalInertia01 + this._transform._rotation11 * this._invLocalInertia11 + this._transform._rotation12 * this._invLocalInertia21;
- __tmp__121 = this._transform._rotation10 * this._invLocalInertia02 + this._transform._rotation11 * this._invLocalInertia12 + this._transform._rotation12 * this._invLocalInertia22;
- __tmp__201 = this._transform._rotation20 * this._invLocalInertia00 + this._transform._rotation21 * this._invLocalInertia10 + this._transform._rotation22 * this._invLocalInertia20;
- __tmp__211 = this._transform._rotation20 * this._invLocalInertia01 + this._transform._rotation21 * this._invLocalInertia11 + this._transform._rotation22 * this._invLocalInertia21;
- __tmp__221 = this._transform._rotation20 * this._invLocalInertia02 + this._transform._rotation21 * this._invLocalInertia12 + this._transform._rotation22 * this._invLocalInertia22;
- this._invInertia00 = __tmp__001;
- this._invInertia01 = __tmp__011;
- this._invInertia02 = __tmp__021;
- this._invInertia10 = __tmp__101;
- this._invInertia11 = __tmp__111;
- this._invInertia12 = __tmp__121;
- this._invInertia20 = __tmp__201;
- this._invInertia21 = __tmp__211;
- this._invInertia22 = __tmp__221;
- let __tmp__002;
- let __tmp__012;
- let __tmp__022;
- let __tmp__102;
- let __tmp__112;
- let __tmp__122;
- let __tmp__202;
- let __tmp__212;
- let __tmp__222;
- __tmp__002 = this._invInertia00 * this._transform._rotation00 + this._invInertia01 * this._transform._rotation01 + this._invInertia02 * this._transform._rotation02;
- __tmp__012 = this._invInertia00 * this._transform._rotation10 + this._invInertia01 * this._transform._rotation11 + this._invInertia02 * this._transform._rotation12;
- __tmp__022 = this._invInertia00 * this._transform._rotation20 + this._invInertia01 * this._transform._rotation21 + this._invInertia02 * this._transform._rotation22;
- __tmp__102 = this._invInertia10 * this._transform._rotation00 + this._invInertia11 * this._transform._rotation01 + this._invInertia12 * this._transform._rotation02;
- __tmp__112 = this._invInertia10 * this._transform._rotation10 + this._invInertia11 * this._transform._rotation11 + this._invInertia12 * this._transform._rotation12;
- __tmp__122 = this._invInertia10 * this._transform._rotation20 + this._invInertia11 * this._transform._rotation21 + this._invInertia12 * this._transform._rotation22;
- __tmp__202 = this._invInertia20 * this._transform._rotation00 + this._invInertia21 * this._transform._rotation01 + this._invInertia22 * this._transform._rotation02;
- __tmp__212 = this._invInertia20 * this._transform._rotation10 + this._invInertia21 * this._transform._rotation11 + this._invInertia22 * this._transform._rotation12;
- __tmp__222 = this._invInertia20 * this._transform._rotation20 + this._invInertia21 * this._transform._rotation21 + this._invInertia22 * this._transform._rotation22;
- this._invInertia00 = __tmp__002;
- this._invInertia01 = __tmp__012;
- this._invInertia02 = __tmp__022;
- this._invInertia10 = __tmp__102;
- this._invInertia11 = __tmp__112;
- this._invInertia12 = __tmp__122;
- this._invInertia20 = __tmp__202;
- this._invInertia21 = __tmp__212;
- this._invInertia22 = __tmp__222;
- this._invInertia00 *= this._rotFactor.x;
- this._invInertia01 *= this._rotFactor.x;
- this._invInertia02 *= this._rotFactor.x;
- this._invInertia10 *= this._rotFactor.y;
- this._invInertia11 *= this._rotFactor.y;
- this._invInertia12 *= this._rotFactor.y;
- this._invInertia20 *= this._rotFactor.z;
- this._invInertia21 *= this._rotFactor.z;
- this._invInertia22 *= this._rotFactor.z;
- let dst = this._ptransform;
- let src = this._transform;
- dst._positionX = src._positionX;
- dst._positionY = src._positionY;
- dst._positionZ = src._positionZ;
- dst._rotation00 = src._rotation00;
- dst._rotation01 = src._rotation01;
- dst._rotation02 = src._rotation02;
- dst._rotation10 = src._rotation10;
- dst._rotation11 = src._rotation11;
- dst._rotation12 = src._rotation12;
- dst._rotation20 = src._rotation20;
- dst._rotation21 = src._rotation21;
- dst._rotation22 = src._rotation22;
- let s = this._shapeList;
- while(s != null) {
- let n = s._next;
- let tf1 = this._ptransform;
- let tf2 = this._transform;
- let dst = s._ptransform;
- let src1 = s._localTransform;
- let __tmp__00;
- let __tmp__01;
- let __tmp__02;
- let __tmp__10;
- let __tmp__11;
- let __tmp__12;
- let __tmp__20;
- let __tmp__21;
- let __tmp__22;
- __tmp__00 = tf1._rotation00 * src1._rotation00 + tf1._rotation01 * src1._rotation10 + tf1._rotation02 * src1._rotation20;
- __tmp__01 = tf1._rotation00 * src1._rotation01 + tf1._rotation01 * src1._rotation11 + tf1._rotation02 * src1._rotation21;
- __tmp__02 = tf1._rotation00 * src1._rotation02 + tf1._rotation01 * src1._rotation12 + tf1._rotation02 * src1._rotation22;
- __tmp__10 = tf1._rotation10 * src1._rotation00 + tf1._rotation11 * src1._rotation10 + tf1._rotation12 * src1._rotation20;
- __tmp__11 = tf1._rotation10 * src1._rotation01 + tf1._rotation11 * src1._rotation11 + tf1._rotation12 * src1._rotation21;
- __tmp__12 = tf1._rotation10 * src1._rotation02 + tf1._rotation11 * src1._rotation12 + tf1._rotation12 * src1._rotation22;
- __tmp__20 = tf1._rotation20 * src1._rotation00 + tf1._rotation21 * src1._rotation10 + tf1._rotation22 * src1._rotation20;
- __tmp__21 = tf1._rotation20 * src1._rotation01 + tf1._rotation21 * src1._rotation11 + tf1._rotation22 * src1._rotation21;
- __tmp__22 = tf1._rotation20 * src1._rotation02 + tf1._rotation21 * src1._rotation12 + tf1._rotation22 * src1._rotation22;
- dst._rotation00 = __tmp__00;
- dst._rotation01 = __tmp__01;
- dst._rotation02 = __tmp__02;
- dst._rotation10 = __tmp__10;
- dst._rotation11 = __tmp__11;
- dst._rotation12 = __tmp__12;
- dst._rotation20 = __tmp__20;
- dst._rotation21 = __tmp__21;
- dst._rotation22 = __tmp__22;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = tf1._rotation00 * src1._positionX + tf1._rotation01 * src1._positionY + tf1._rotation02 * src1._positionZ;
- __tmp__Y = tf1._rotation10 * src1._positionX + tf1._rotation11 * src1._positionY + tf1._rotation12 * src1._positionZ;
- __tmp__Z = tf1._rotation20 * src1._positionX + tf1._rotation21 * src1._positionY + tf1._rotation22 * src1._positionZ;
- dst._positionX = __tmp__X;
- dst._positionY = __tmp__Y;
- dst._positionZ = __tmp__Z;
- dst._positionX += tf1._positionX;
- dst._positionY += tf1._positionY;
- dst._positionZ += tf1._positionZ;
- let dst1 = s._transform;
- let src11 = s._localTransform;
- let __tmp__001;
- let __tmp__011;
- let __tmp__021;
- let __tmp__101;
- let __tmp__111;
- let __tmp__121;
- let __tmp__201;
- let __tmp__211;
- let __tmp__221;
- __tmp__001 = tf2._rotation00 * src11._rotation00 + tf2._rotation01 * src11._rotation10 + tf2._rotation02 * src11._rotation20;
- __tmp__011 = tf2._rotation00 * src11._rotation01 + tf2._rotation01 * src11._rotation11 + tf2._rotation02 * src11._rotation21;
- __tmp__021 = tf2._rotation00 * src11._rotation02 + tf2._rotation01 * src11._rotation12 + tf2._rotation02 * src11._rotation22;
- __tmp__101 = tf2._rotation10 * src11._rotation00 + tf2._rotation11 * src11._rotation10 + tf2._rotation12 * src11._rotation20;
- __tmp__111 = tf2._rotation10 * src11._rotation01 + tf2._rotation11 * src11._rotation11 + tf2._rotation12 * src11._rotation21;
- __tmp__121 = tf2._rotation10 * src11._rotation02 + tf2._rotation11 * src11._rotation12 + tf2._rotation12 * src11._rotation22;
- __tmp__201 = tf2._rotation20 * src11._rotation00 + tf2._rotation21 * src11._rotation10 + tf2._rotation22 * src11._rotation20;
- __tmp__211 = tf2._rotation20 * src11._rotation01 + tf2._rotation21 * src11._rotation11 + tf2._rotation22 * src11._rotation21;
- __tmp__221 = tf2._rotation20 * src11._rotation02 + tf2._rotation21 * src11._rotation12 + tf2._rotation22 * src11._rotation22;
- dst1._rotation00 = __tmp__001;
- dst1._rotation01 = __tmp__011;
- dst1._rotation02 = __tmp__021;
- dst1._rotation10 = __tmp__101;
- dst1._rotation11 = __tmp__111;
- dst1._rotation12 = __tmp__121;
- dst1._rotation20 = __tmp__201;
- dst1._rotation21 = __tmp__211;
- dst1._rotation22 = __tmp__221;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = tf2._rotation00 * src11._positionX + tf2._rotation01 * src11._positionY + tf2._rotation02 * src11._positionZ;
- __tmp__Y1 = tf2._rotation10 * src11._positionX + tf2._rotation11 * src11._positionY + tf2._rotation12 * src11._positionZ;
- __tmp__Z1 = tf2._rotation20 * src11._positionX + tf2._rotation21 * src11._positionY + tf2._rotation22 * src11._positionZ;
- dst1._positionX = __tmp__X1;
- dst1._positionY = __tmp__Y1;
- dst1._positionZ = __tmp__Z1;
- dst1._positionX += tf2._positionX;
- dst1._positionY += tf2._positionY;
- dst1._positionZ += tf2._positionZ;
- let minX;
- let minY;
- let minZ;
- let maxX;
- let maxY;
- let maxZ;
- s._geom._computeAabb(s._aabb,s._ptransform);
- minX = s._aabb._minX;
- minY = s._aabb._minY;
- minZ = s._aabb._minZ;
- maxX = s._aabb._maxX;
- maxY = s._aabb._maxY;
- maxZ = s._aabb._maxZ;
- s._geom._computeAabb(s._aabb,s._transform);
- s._aabb._minX = minX < s._aabb._minX ? minX : s._aabb._minX;
- s._aabb._minY = minY < s._aabb._minY ? minY : s._aabb._minY;
- s._aabb._minZ = minZ < s._aabb._minZ ? minZ : s._aabb._minZ;
- s._aabb._maxX = maxX > s._aabb._maxX ? maxX : s._aabb._maxX;
- s._aabb._maxY = maxY > s._aabb._maxY ? maxY : s._aabb._maxY;
- s._aabb._maxZ = maxZ > s._aabb._maxZ ? maxZ : s._aabb._maxZ;
- if(s._proxy != null) {
- let dX;
- let dY;
- let dZ;
- dX = s._transform._positionX - s._ptransform._positionX;
- dY = s._transform._positionY - s._ptransform._positionY;
- dZ = s._transform._positionZ - s._ptransform._positionZ;
- let v = s.displacement;
- v.x = dX;
- v.y = dY;
- v.z = dZ;
- s._rigidBody._world._broadPhase.moveProxy(s._proxy,s._aabb,s.displacement);
- }
- s = n;
- }
- this._sleeping = false;
- this._sleepTime = 0;
- }
- rotateXyz(eulerAngles) {
- let xyzX;
- let xyzY;
- let xyzZ;
- let rot00;
- let rot01;
- let rot02;
- let rot10;
- let rot11;
- let rot12;
- let rot20;
- let rot21;
- let rot22;
- xyzX = eulerAngles.x;
- xyzY = eulerAngles.y;
- xyzZ = eulerAngles.z;
- let sx = Math.sin(xyzX);
- let sy = Math.sin(xyzY);
- let sz = Math.sin(xyzZ);
- let cx = Math.cos(xyzX);
- let cy = Math.cos(xyzY);
- let cz = Math.cos(xyzZ);
- rot00 = cy * cz;
- rot01 = -cy * sz;
- rot02 = sy;
- rot10 = cx * sz + cz * sx * sy;
- rot11 = cx * cz - sx * sy * sz;
- rot12 = -cy * sx;
- rot20 = sx * sz - cx * cz * sy;
- rot21 = cz * sx + cx * sy * sz;
- rot22 = cx * cy;
- let __tmp__00;
- let __tmp__01;
- let __tmp__02;
- let __tmp__10;
- let __tmp__11;
- let __tmp__12;
- let __tmp__20;
- let __tmp__21;
- let __tmp__22;
- __tmp__00 = rot00 * this._transform._rotation00 + rot01 * this._transform._rotation10 + rot02 * this._transform._rotation20;
- __tmp__01 = rot00 * this._transform._rotation01 + rot01 * this._transform._rotation11 + rot02 * this._transform._rotation21;
- __tmp__02 = rot00 * this._transform._rotation02 + rot01 * this._transform._rotation12 + rot02 * this._transform._rotation22;
- __tmp__10 = rot10 * this._transform._rotation00 + rot11 * this._transform._rotation10 + rot12 * this._transform._rotation20;
- __tmp__11 = rot10 * this._transform._rotation01 + rot11 * this._transform._rotation11 + rot12 * this._transform._rotation21;
- __tmp__12 = rot10 * this._transform._rotation02 + rot11 * this._transform._rotation12 + rot12 * this._transform._rotation22;
- __tmp__20 = rot20 * this._transform._rotation00 + rot21 * this._transform._rotation10 + rot22 * this._transform._rotation20;
- __tmp__21 = rot20 * this._transform._rotation01 + rot21 * this._transform._rotation11 + rot22 * this._transform._rotation21;
- __tmp__22 = rot20 * this._transform._rotation02 + rot21 * this._transform._rotation12 + rot22 * this._transform._rotation22;
- this._transform._rotation00 = __tmp__00;
- this._transform._rotation01 = __tmp__01;
- this._transform._rotation02 = __tmp__02;
- this._transform._rotation10 = __tmp__10;
- this._transform._rotation11 = __tmp__11;
- this._transform._rotation12 = __tmp__12;
- this._transform._rotation20 = __tmp__20;
- this._transform._rotation21 = __tmp__21;
- this._transform._rotation22 = __tmp__22;
- let __tmp__001;
- let __tmp__011;
- let __tmp__021;
- let __tmp__101;
- let __tmp__111;
- let __tmp__121;
- let __tmp__201;
- let __tmp__211;
- let __tmp__221;
- __tmp__001 = this._transform._rotation00 * this._invLocalInertia00 + this._transform._rotation01 * this._invLocalInertia10 + this._transform._rotation02 * this._invLocalInertia20;
- __tmp__011 = this._transform._rotation00 * this._invLocalInertia01 + this._transform._rotation01 * this._invLocalInertia11 + this._transform._rotation02 * this._invLocalInertia21;
- __tmp__021 = this._transform._rotation00 * this._invLocalInertia02 + this._transform._rotation01 * this._invLocalInertia12 + this._transform._rotation02 * this._invLocalInertia22;
- __tmp__101 = this._transform._rotation10 * this._invLocalInertia00 + this._transform._rotation11 * this._invLocalInertia10 + this._transform._rotation12 * this._invLocalInertia20;
- __tmp__111 = this._transform._rotation10 * this._invLocalInertia01 + this._transform._rotation11 * this._invLocalInertia11 + this._transform._rotation12 * this._invLocalInertia21;
- __tmp__121 = this._transform._rotation10 * this._invLocalInertia02 + this._transform._rotation11 * this._invLocalInertia12 + this._transform._rotation12 * this._invLocalInertia22;
- __tmp__201 = this._transform._rotation20 * this._invLocalInertia00 + this._transform._rotation21 * this._invLocalInertia10 + this._transform._rotation22 * this._invLocalInertia20;
- __tmp__211 = this._transform._rotation20 * this._invLocalInertia01 + this._transform._rotation21 * this._invLocalInertia11 + this._transform._rotation22 * this._invLocalInertia21;
- __tmp__221 = this._transform._rotation20 * this._invLocalInertia02 + this._transform._rotation21 * this._invLocalInertia12 + this._transform._rotation22 * this._invLocalInertia22;
- this._invInertia00 = __tmp__001;
- this._invInertia01 = __tmp__011;
- this._invInertia02 = __tmp__021;
- this._invInertia10 = __tmp__101;
- this._invInertia11 = __tmp__111;
- this._invInertia12 = __tmp__121;
- this._invInertia20 = __tmp__201;
- this._invInertia21 = __tmp__211;
- this._invInertia22 = __tmp__221;
- let __tmp__002;
- let __tmp__012;
- let __tmp__022;
- let __tmp__102;
- let __tmp__112;
- let __tmp__122;
- let __tmp__202;
- let __tmp__212;
- let __tmp__222;
- __tmp__002 = this._invInertia00 * this._transform._rotation00 + this._invInertia01 * this._transform._rotation01 + this._invInertia02 * this._transform._rotation02;
- __tmp__012 = this._invInertia00 * this._transform._rotation10 + this._invInertia01 * this._transform._rotation11 + this._invInertia02 * this._transform._rotation12;
- __tmp__022 = this._invInertia00 * this._transform._rotation20 + this._invInertia01 * this._transform._rotation21 + this._invInertia02 * this._transform._rotation22;
- __tmp__102 = this._invInertia10 * this._transform._rotation00 + this._invInertia11 * this._transform._rotation01 + this._invInertia12 * this._transform._rotation02;
- __tmp__112 = this._invInertia10 * this._transform._rotation10 + this._invInertia11 * this._transform._rotation11 + this._invInertia12 * this._transform._rotation12;
- __tmp__122 = this._invInertia10 * this._transform._rotation20 + this._invInertia11 * this._transform._rotation21 + this._invInertia12 * this._transform._rotation22;
- __tmp__202 = this._invInertia20 * this._transform._rotation00 + this._invInertia21 * this._transform._rotation01 + this._invInertia22 * this._transform._rotation02;
- __tmp__212 = this._invInertia20 * this._transform._rotation10 + this._invInertia21 * this._transform._rotation11 + this._invInertia22 * this._transform._rotation12;
- __tmp__222 = this._invInertia20 * this._transform._rotation20 + this._invInertia21 * this._transform._rotation21 + this._invInertia22 * this._transform._rotation22;
- this._invInertia00 = __tmp__002;
- this._invInertia01 = __tmp__012;
- this._invInertia02 = __tmp__022;
- this._invInertia10 = __tmp__102;
- this._invInertia11 = __tmp__112;
- this._invInertia12 = __tmp__122;
- this._invInertia20 = __tmp__202;
- this._invInertia21 = __tmp__212;
- this._invInertia22 = __tmp__222;
- this._invInertia00 *= this._rotFactor.x;
- this._invInertia01 *= this._rotFactor.x;
- this._invInertia02 *= this._rotFactor.x;
- this._invInertia10 *= this._rotFactor.y;
- this._invInertia11 *= this._rotFactor.y;
- this._invInertia12 *= this._rotFactor.y;
- this._invInertia20 *= this._rotFactor.z;
- this._invInertia21 *= this._rotFactor.z;
- this._invInertia22 *= this._rotFactor.z;
- let dst = this._ptransform;
- let src = this._transform;
- dst._positionX = src._positionX;
- dst._positionY = src._positionY;
- dst._positionZ = src._positionZ;
- dst._rotation00 = src._rotation00;
- dst._rotation01 = src._rotation01;
- dst._rotation02 = src._rotation02;
- dst._rotation10 = src._rotation10;
- dst._rotation11 = src._rotation11;
- dst._rotation12 = src._rotation12;
- dst._rotation20 = src._rotation20;
- dst._rotation21 = src._rotation21;
- dst._rotation22 = src._rotation22;
- let s = this._shapeList;
- while(s != null) {
- let n = s._next;
- let tf1 = this._ptransform;
- let tf2 = this._transform;
- let dst = s._ptransform;
- let src1 = s._localTransform;
- let __tmp__00;
- let __tmp__01;
- let __tmp__02;
- let __tmp__10;
- let __tmp__11;
- let __tmp__12;
- let __tmp__20;
- let __tmp__21;
- let __tmp__22;
- __tmp__00 = tf1._rotation00 * src1._rotation00 + tf1._rotation01 * src1._rotation10 + tf1._rotation02 * src1._rotation20;
- __tmp__01 = tf1._rotation00 * src1._rotation01 + tf1._rotation01 * src1._rotation11 + tf1._rotation02 * src1._rotation21;
- __tmp__02 = tf1._rotation00 * src1._rotation02 + tf1._rotation01 * src1._rotation12 + tf1._rotation02 * src1._rotation22;
- __tmp__10 = tf1._rotation10 * src1._rotation00 + tf1._rotation11 * src1._rotation10 + tf1._rotation12 * src1._rotation20;
- __tmp__11 = tf1._rotation10 * src1._rotation01 + tf1._rotation11 * src1._rotation11 + tf1._rotation12 * src1._rotation21;
- __tmp__12 = tf1._rotation10 * src1._rotation02 + tf1._rotation11 * src1._rotation12 + tf1._rotation12 * src1._rotation22;
- __tmp__20 = tf1._rotation20 * src1._rotation00 + tf1._rotation21 * src1._rotation10 + tf1._rotation22 * src1._rotation20;
- __tmp__21 = tf1._rotation20 * src1._rotation01 + tf1._rotation21 * src1._rotation11 + tf1._rotation22 * src1._rotation21;
- __tmp__22 = tf1._rotation20 * src1._rotation02 + tf1._rotation21 * src1._rotation12 + tf1._rotation22 * src1._rotation22;
- dst._rotation00 = __tmp__00;
- dst._rotation01 = __tmp__01;
- dst._rotation02 = __tmp__02;
- dst._rotation10 = __tmp__10;
- dst._rotation11 = __tmp__11;
- dst._rotation12 = __tmp__12;
- dst._rotation20 = __tmp__20;
- dst._rotation21 = __tmp__21;
- dst._rotation22 = __tmp__22;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = tf1._rotation00 * src1._positionX + tf1._rotation01 * src1._positionY + tf1._rotation02 * src1._positionZ;
- __tmp__Y = tf1._rotation10 * src1._positionX + tf1._rotation11 * src1._positionY + tf1._rotation12 * src1._positionZ;
- __tmp__Z = tf1._rotation20 * src1._positionX + tf1._rotation21 * src1._positionY + tf1._rotation22 * src1._positionZ;
- dst._positionX = __tmp__X;
- dst._positionY = __tmp__Y;
- dst._positionZ = __tmp__Z;
- dst._positionX += tf1._positionX;
- dst._positionY += tf1._positionY;
- dst._positionZ += tf1._positionZ;
- let dst1 = s._transform;
- let src11 = s._localTransform;
- let __tmp__001;
- let __tmp__011;
- let __tmp__021;
- let __tmp__101;
- let __tmp__111;
- let __tmp__121;
- let __tmp__201;
- let __tmp__211;
- let __tmp__221;
- __tmp__001 = tf2._rotation00 * src11._rotation00 + tf2._rotation01 * src11._rotation10 + tf2._rotation02 * src11._rotation20;
- __tmp__011 = tf2._rotation00 * src11._rotation01 + tf2._rotation01 * src11._rotation11 + tf2._rotation02 * src11._rotation21;
- __tmp__021 = tf2._rotation00 * src11._rotation02 + tf2._rotation01 * src11._rotation12 + tf2._rotation02 * src11._rotation22;
- __tmp__101 = tf2._rotation10 * src11._rotation00 + tf2._rotation11 * src11._rotation10 + tf2._rotation12 * src11._rotation20;
- __tmp__111 = tf2._rotation10 * src11._rotation01 + tf2._rotation11 * src11._rotation11 + tf2._rotation12 * src11._rotation21;
- __tmp__121 = tf2._rotation10 * src11._rotation02 + tf2._rotation11 * src11._rotation12 + tf2._rotation12 * src11._rotation22;
- __tmp__201 = tf2._rotation20 * src11._rotation00 + tf2._rotation21 * src11._rotation10 + tf2._rotation22 * src11._rotation20;
- __tmp__211 = tf2._rotation20 * src11._rotation01 + tf2._rotation21 * src11._rotation11 + tf2._rotation22 * src11._rotation21;
- __tmp__221 = tf2._rotation20 * src11._rotation02 + tf2._rotation21 * src11._rotation12 + tf2._rotation22 * src11._rotation22;
- dst1._rotation00 = __tmp__001;
- dst1._rotation01 = __tmp__011;
- dst1._rotation02 = __tmp__021;
- dst1._rotation10 = __tmp__101;
- dst1._rotation11 = __tmp__111;
- dst1._rotation12 = __tmp__121;
- dst1._rotation20 = __tmp__201;
- dst1._rotation21 = __tmp__211;
- dst1._rotation22 = __tmp__221;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = tf2._rotation00 * src11._positionX + tf2._rotation01 * src11._positionY + tf2._rotation02 * src11._positionZ;
- __tmp__Y1 = tf2._rotation10 * src11._positionX + tf2._rotation11 * src11._positionY + tf2._rotation12 * src11._positionZ;
- __tmp__Z1 = tf2._rotation20 * src11._positionX + tf2._rotation21 * src11._positionY + tf2._rotation22 * src11._positionZ;
- dst1._positionX = __tmp__X1;
- dst1._positionY = __tmp__Y1;
- dst1._positionZ = __tmp__Z1;
- dst1._positionX += tf2._positionX;
- dst1._positionY += tf2._positionY;
- dst1._positionZ += tf2._positionZ;
- let minX;
- let minY;
- let minZ;
- let maxX;
- let maxY;
- let maxZ;
- s._geom._computeAabb(s._aabb,s._ptransform);
- minX = s._aabb._minX;
- minY = s._aabb._minY;
- minZ = s._aabb._minZ;
- maxX = s._aabb._maxX;
- maxY = s._aabb._maxY;
- maxZ = s._aabb._maxZ;
- s._geom._computeAabb(s._aabb,s._transform);
- s._aabb._minX = minX < s._aabb._minX ? minX : s._aabb._minX;
- s._aabb._minY = minY < s._aabb._minY ? minY : s._aabb._minY;
- s._aabb._minZ = minZ < s._aabb._minZ ? minZ : s._aabb._minZ;
- s._aabb._maxX = maxX > s._aabb._maxX ? maxX : s._aabb._maxX;
- s._aabb._maxY = maxY > s._aabb._maxY ? maxY : s._aabb._maxY;
- s._aabb._maxZ = maxZ > s._aabb._maxZ ? maxZ : s._aabb._maxZ;
- if(s._proxy != null) {
- let dX;
- let dY;
- let dZ;
- dX = s._transform._positionX - s._ptransform._positionX;
- dY = s._transform._positionY - s._ptransform._positionY;
- dZ = s._transform._positionZ - s._ptransform._positionZ;
- let v = s.displacement;
- v.x = dX;
- v.y = dY;
- v.z = dZ;
- s._rigidBody._world._broadPhase.moveProxy(s._proxy,s._aabb,s.displacement);
- }
- s = n;
- }
- this._sleeping = false;
- this._sleepTime = 0;
- }
- getOrientation() {
- let q = new oimo.common.Quat();
- let iqX;
- let iqY;
- let iqZ;
- let iqW;
- let e00 = this._transform._rotation00;
- let e11 = this._transform._rotation11;
- let e22 = this._transform._rotation22;
- let t = e00 + e11 + e22;
- let s;
- if(t > 0) {
- s = Math.sqrt(t + 1);
- iqW = 0.5 * s;
- s = 0.5 / s;
- iqX = (this._transform._rotation21 - this._transform._rotation12) * s;
- iqY = (this._transform._rotation02 - this._transform._rotation20) * s;
- iqZ = (this._transform._rotation10 - this._transform._rotation01) * s;
- } else if(e00 > e11) {
- if(e00 > e22) {
- s = Math.sqrt(e00 - e11 - e22 + 1);
- iqX = 0.5 * s;
- s = 0.5 / s;
- iqY = (this._transform._rotation01 + this._transform._rotation10) * s;
- iqZ = (this._transform._rotation02 + this._transform._rotation20) * s;
- iqW = (this._transform._rotation21 - this._transform._rotation12) * s;
- } else {
- s = Math.sqrt(e22 - e00 - e11 + 1);
- iqZ = 0.5 * s;
- s = 0.5 / s;
- iqX = (this._transform._rotation02 + this._transform._rotation20) * s;
- iqY = (this._transform._rotation12 + this._transform._rotation21) * s;
- iqW = (this._transform._rotation10 - this._transform._rotation01) * s;
- }
- } else if(e11 > e22) {
- s = Math.sqrt(e11 - e22 - e00 + 1);
- iqY = 0.5 * s;
- s = 0.5 / s;
- iqX = (this._transform._rotation01 + this._transform._rotation10) * s;
- iqZ = (this._transform._rotation12 + this._transform._rotation21) * s;
- iqW = (this._transform._rotation02 - this._transform._rotation20) * s;
- } else {
- s = Math.sqrt(e22 - e00 - e11 + 1);
- iqZ = 0.5 * s;
- s = 0.5 / s;
- iqX = (this._transform._rotation02 + this._transform._rotation20) * s;
- iqY = (this._transform._rotation12 + this._transform._rotation21) * s;
- iqW = (this._transform._rotation10 - this._transform._rotation01) * s;
- }
- q.x = iqX;
- q.y = iqY;
- q.z = iqZ;
- q.w = iqW;
- return q;
- }
- getOrientationTo(orientation) {
- let iqX;
- let iqY;
- let iqZ;
- let iqW;
- let e00 = this._transform._rotation00;
- let e11 = this._transform._rotation11;
- let e22 = this._transform._rotation22;
- let t = e00 + e11 + e22;
- let s;
- if(t > 0) {
- s = Math.sqrt(t + 1);
- iqW = 0.5 * s;
- s = 0.5 / s;
- iqX = (this._transform._rotation21 - this._transform._rotation12) * s;
- iqY = (this._transform._rotation02 - this._transform._rotation20) * s;
- iqZ = (this._transform._rotation10 - this._transform._rotation01) * s;
- } else if(e00 > e11) {
- if(e00 > e22) {
- s = Math.sqrt(e00 - e11 - e22 + 1);
- iqX = 0.5 * s;
- s = 0.5 / s;
- iqY = (this._transform._rotation01 + this._transform._rotation10) * s;
- iqZ = (this._transform._rotation02 + this._transform._rotation20) * s;
- iqW = (this._transform._rotation21 - this._transform._rotation12) * s;
- } else {
- s = Math.sqrt(e22 - e00 - e11 + 1);
- iqZ = 0.5 * s;
- s = 0.5 / s;
- iqX = (this._transform._rotation02 + this._transform._rotation20) * s;
- iqY = (this._transform._rotation12 + this._transform._rotation21) * s;
- iqW = (this._transform._rotation10 - this._transform._rotation01) * s;
- }
- } else if(e11 > e22) {
- s = Math.sqrt(e11 - e22 - e00 + 1);
- iqY = 0.5 * s;
- s = 0.5 / s;
- iqX = (this._transform._rotation01 + this._transform._rotation10) * s;
- iqZ = (this._transform._rotation12 + this._transform._rotation21) * s;
- iqW = (this._transform._rotation02 - this._transform._rotation20) * s;
- } else {
- s = Math.sqrt(e22 - e00 - e11 + 1);
- iqZ = 0.5 * s;
- s = 0.5 / s;
- iqX = (this._transform._rotation02 + this._transform._rotation20) * s;
- iqY = (this._transform._rotation12 + this._transform._rotation21) * s;
- iqW = (this._transform._rotation10 - this._transform._rotation01) * s;
- }
- orientation.x = iqX;
- orientation.y = iqY;
- orientation.z = iqZ;
- orientation.w = iqW;
- }
- setOrientation(quaternion) {
- let qX;
- let qY;
- let qZ;
- let qW;
- qX = quaternion.x;
- qY = quaternion.y;
- qZ = quaternion.z;
- qW = quaternion.w;
- let x = qX;
- let y = qY;
- let z = qZ;
- let w = qW;
- let x2 = 2 * x;
- let y2 = 2 * y;
- let z2 = 2 * z;
- let xx = x * x2;
- let yy = y * y2;
- let zz = z * z2;
- let xy = x * y2;
- let yz = y * z2;
- let xz = x * z2;
- let wx = w * x2;
- let wy = w * y2;
- let wz = w * z2;
- this._transform._rotation00 = 1 - yy - zz;
- this._transform._rotation01 = xy - wz;
- this._transform._rotation02 = xz + wy;
- this._transform._rotation10 = xy + wz;
- this._transform._rotation11 = 1 - xx - zz;
- this._transform._rotation12 = yz - wx;
- this._transform._rotation20 = xz - wy;
- this._transform._rotation21 = yz + wx;
- this._transform._rotation22 = 1 - xx - yy;
- let __tmp__00;
- let __tmp__01;
- let __tmp__02;
- let __tmp__10;
- let __tmp__11;
- let __tmp__12;
- let __tmp__20;
- let __tmp__21;
- let __tmp__22;
- __tmp__00 = this._transform._rotation00 * this._invLocalInertia00 + this._transform._rotation01 * this._invLocalInertia10 + this._transform._rotation02 * this._invLocalInertia20;
- __tmp__01 = this._transform._rotation00 * this._invLocalInertia01 + this._transform._rotation01 * this._invLocalInertia11 + this._transform._rotation02 * this._invLocalInertia21;
- __tmp__02 = this._transform._rotation00 * this._invLocalInertia02 + this._transform._rotation01 * this._invLocalInertia12 + this._transform._rotation02 * this._invLocalInertia22;
- __tmp__10 = this._transform._rotation10 * this._invLocalInertia00 + this._transform._rotation11 * this._invLocalInertia10 + this._transform._rotation12 * this._invLocalInertia20;
- __tmp__11 = this._transform._rotation10 * this._invLocalInertia01 + this._transform._rotation11 * this._invLocalInertia11 + this._transform._rotation12 * this._invLocalInertia21;
- __tmp__12 = this._transform._rotation10 * this._invLocalInertia02 + this._transform._rotation11 * this._invLocalInertia12 + this._transform._rotation12 * this._invLocalInertia22;
- __tmp__20 = this._transform._rotation20 * this._invLocalInertia00 + this._transform._rotation21 * this._invLocalInertia10 + this._transform._rotation22 * this._invLocalInertia20;
- __tmp__21 = this._transform._rotation20 * this._invLocalInertia01 + this._transform._rotation21 * this._invLocalInertia11 + this._transform._rotation22 * this._invLocalInertia21;
- __tmp__22 = this._transform._rotation20 * this._invLocalInertia02 + this._transform._rotation21 * this._invLocalInertia12 + this._transform._rotation22 * this._invLocalInertia22;
- this._invInertia00 = __tmp__00;
- this._invInertia01 = __tmp__01;
- this._invInertia02 = __tmp__02;
- this._invInertia10 = __tmp__10;
- this._invInertia11 = __tmp__11;
- this._invInertia12 = __tmp__12;
- this._invInertia20 = __tmp__20;
- this._invInertia21 = __tmp__21;
- this._invInertia22 = __tmp__22;
- let __tmp__001;
- let __tmp__011;
- let __tmp__021;
- let __tmp__101;
- let __tmp__111;
- let __tmp__121;
- let __tmp__201;
- let __tmp__211;
- let __tmp__221;
- __tmp__001 = this._invInertia00 * this._transform._rotation00 + this._invInertia01 * this._transform._rotation01 + this._invInertia02 * this._transform._rotation02;
- __tmp__011 = this._invInertia00 * this._transform._rotation10 + this._invInertia01 * this._transform._rotation11 + this._invInertia02 * this._transform._rotation12;
- __tmp__021 = this._invInertia00 * this._transform._rotation20 + this._invInertia01 * this._transform._rotation21 + this._invInertia02 * this._transform._rotation22;
- __tmp__101 = this._invInertia10 * this._transform._rotation00 + this._invInertia11 * this._transform._rotation01 + this._invInertia12 * this._transform._rotation02;
- __tmp__111 = this._invInertia10 * this._transform._rotation10 + this._invInertia11 * this._transform._rotation11 + this._invInertia12 * this._transform._rotation12;
- __tmp__121 = this._invInertia10 * this._transform._rotation20 + this._invInertia11 * this._transform._rotation21 + this._invInertia12 * this._transform._rotation22;
- __tmp__201 = this._invInertia20 * this._transform._rotation00 + this._invInertia21 * this._transform._rotation01 + this._invInertia22 * this._transform._rotation02;
- __tmp__211 = this._invInertia20 * this._transform._rotation10 + this._invInertia21 * this._transform._rotation11 + this._invInertia22 * this._transform._rotation12;
- __tmp__221 = this._invInertia20 * this._transform._rotation20 + this._invInertia21 * this._transform._rotation21 + this._invInertia22 * this._transform._rotation22;
- this._invInertia00 = __tmp__001;
- this._invInertia01 = __tmp__011;
- this._invInertia02 = __tmp__021;
- this._invInertia10 = __tmp__101;
- this._invInertia11 = __tmp__111;
- this._invInertia12 = __tmp__121;
- this._invInertia20 = __tmp__201;
- this._invInertia21 = __tmp__211;
- this._invInertia22 = __tmp__221;
- this._invInertia00 *= this._rotFactor.x;
- this._invInertia01 *= this._rotFactor.x;
- this._invInertia02 *= this._rotFactor.x;
- this._invInertia10 *= this._rotFactor.y;
- this._invInertia11 *= this._rotFactor.y;
- this._invInertia12 *= this._rotFactor.y;
- this._invInertia20 *= this._rotFactor.z;
- this._invInertia21 *= this._rotFactor.z;
- this._invInertia22 *= this._rotFactor.z;
- let dst = this._ptransform;
- let src = this._transform;
- dst._positionX = src._positionX;
- dst._positionY = src._positionY;
- dst._positionZ = src._positionZ;
- dst._rotation00 = src._rotation00;
- dst._rotation01 = src._rotation01;
- dst._rotation02 = src._rotation02;
- dst._rotation10 = src._rotation10;
- dst._rotation11 = src._rotation11;
- dst._rotation12 = src._rotation12;
- dst._rotation20 = src._rotation20;
- dst._rotation21 = src._rotation21;
- dst._rotation22 = src._rotation22;
- let s = this._shapeList;
- while(s != null) {
- let n = s._next;
- let tf1 = this._ptransform;
- let tf2 = this._transform;
- let dst = s._ptransform;
- let src1 = s._localTransform;
- let __tmp__00;
- let __tmp__01;
- let __tmp__02;
- let __tmp__10;
- let __tmp__11;
- let __tmp__12;
- let __tmp__20;
- let __tmp__21;
- let __tmp__22;
- __tmp__00 = tf1._rotation00 * src1._rotation00 + tf1._rotation01 * src1._rotation10 + tf1._rotation02 * src1._rotation20;
- __tmp__01 = tf1._rotation00 * src1._rotation01 + tf1._rotation01 * src1._rotation11 + tf1._rotation02 * src1._rotation21;
- __tmp__02 = tf1._rotation00 * src1._rotation02 + tf1._rotation01 * src1._rotation12 + tf1._rotation02 * src1._rotation22;
- __tmp__10 = tf1._rotation10 * src1._rotation00 + tf1._rotation11 * src1._rotation10 + tf1._rotation12 * src1._rotation20;
- __tmp__11 = tf1._rotation10 * src1._rotation01 + tf1._rotation11 * src1._rotation11 + tf1._rotation12 * src1._rotation21;
- __tmp__12 = tf1._rotation10 * src1._rotation02 + tf1._rotation11 * src1._rotation12 + tf1._rotation12 * src1._rotation22;
- __tmp__20 = tf1._rotation20 * src1._rotation00 + tf1._rotation21 * src1._rotation10 + tf1._rotation22 * src1._rotation20;
- __tmp__21 = tf1._rotation20 * src1._rotation01 + tf1._rotation21 * src1._rotation11 + tf1._rotation22 * src1._rotation21;
- __tmp__22 = tf1._rotation20 * src1._rotation02 + tf1._rotation21 * src1._rotation12 + tf1._rotation22 * src1._rotation22;
- dst._rotation00 = __tmp__00;
- dst._rotation01 = __tmp__01;
- dst._rotation02 = __tmp__02;
- dst._rotation10 = __tmp__10;
- dst._rotation11 = __tmp__11;
- dst._rotation12 = __tmp__12;
- dst._rotation20 = __tmp__20;
- dst._rotation21 = __tmp__21;
- dst._rotation22 = __tmp__22;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = tf1._rotation00 * src1._positionX + tf1._rotation01 * src1._positionY + tf1._rotation02 * src1._positionZ;
- __tmp__Y = tf1._rotation10 * src1._positionX + tf1._rotation11 * src1._positionY + tf1._rotation12 * src1._positionZ;
- __tmp__Z = tf1._rotation20 * src1._positionX + tf1._rotation21 * src1._positionY + tf1._rotation22 * src1._positionZ;
- dst._positionX = __tmp__X;
- dst._positionY = __tmp__Y;
- dst._positionZ = __tmp__Z;
- dst._positionX += tf1._positionX;
- dst._positionY += tf1._positionY;
- dst._positionZ += tf1._positionZ;
- let dst1 = s._transform;
- let src11 = s._localTransform;
- let __tmp__001;
- let __tmp__011;
- let __tmp__021;
- let __tmp__101;
- let __tmp__111;
- let __tmp__121;
- let __tmp__201;
- let __tmp__211;
- let __tmp__221;
- __tmp__001 = tf2._rotation00 * src11._rotation00 + tf2._rotation01 * src11._rotation10 + tf2._rotation02 * src11._rotation20;
- __tmp__011 = tf2._rotation00 * src11._rotation01 + tf2._rotation01 * src11._rotation11 + tf2._rotation02 * src11._rotation21;
- __tmp__021 = tf2._rotation00 * src11._rotation02 + tf2._rotation01 * src11._rotation12 + tf2._rotation02 * src11._rotation22;
- __tmp__101 = tf2._rotation10 * src11._rotation00 + tf2._rotation11 * src11._rotation10 + tf2._rotation12 * src11._rotation20;
- __tmp__111 = tf2._rotation10 * src11._rotation01 + tf2._rotation11 * src11._rotation11 + tf2._rotation12 * src11._rotation21;
- __tmp__121 = tf2._rotation10 * src11._rotation02 + tf2._rotation11 * src11._rotation12 + tf2._rotation12 * src11._rotation22;
- __tmp__201 = tf2._rotation20 * src11._rotation00 + tf2._rotation21 * src11._rotation10 + tf2._rotation22 * src11._rotation20;
- __tmp__211 = tf2._rotation20 * src11._rotation01 + tf2._rotation21 * src11._rotation11 + tf2._rotation22 * src11._rotation21;
- __tmp__221 = tf2._rotation20 * src11._rotation02 + tf2._rotation21 * src11._rotation12 + tf2._rotation22 * src11._rotation22;
- dst1._rotation00 = __tmp__001;
- dst1._rotation01 = __tmp__011;
- dst1._rotation02 = __tmp__021;
- dst1._rotation10 = __tmp__101;
- dst1._rotation11 = __tmp__111;
- dst1._rotation12 = __tmp__121;
- dst1._rotation20 = __tmp__201;
- dst1._rotation21 = __tmp__211;
- dst1._rotation22 = __tmp__221;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = tf2._rotation00 * src11._positionX + tf2._rotation01 * src11._positionY + tf2._rotation02 * src11._positionZ;
- __tmp__Y1 = tf2._rotation10 * src11._positionX + tf2._rotation11 * src11._positionY + tf2._rotation12 * src11._positionZ;
- __tmp__Z1 = tf2._rotation20 * src11._positionX + tf2._rotation21 * src11._positionY + tf2._rotation22 * src11._positionZ;
- dst1._positionX = __tmp__X1;
- dst1._positionY = __tmp__Y1;
- dst1._positionZ = __tmp__Z1;
- dst1._positionX += tf2._positionX;
- dst1._positionY += tf2._positionY;
- dst1._positionZ += tf2._positionZ;
- let minX;
- let minY;
- let minZ;
- let maxX;
- let maxY;
- let maxZ;
- s._geom._computeAabb(s._aabb,s._ptransform);
- minX = s._aabb._minX;
- minY = s._aabb._minY;
- minZ = s._aabb._minZ;
- maxX = s._aabb._maxX;
- maxY = s._aabb._maxY;
- maxZ = s._aabb._maxZ;
- s._geom._computeAabb(s._aabb,s._transform);
- s._aabb._minX = minX < s._aabb._minX ? minX : s._aabb._minX;
- s._aabb._minY = minY < s._aabb._minY ? minY : s._aabb._minY;
- s._aabb._minZ = minZ < s._aabb._minZ ? minZ : s._aabb._minZ;
- s._aabb._maxX = maxX > s._aabb._maxX ? maxX : s._aabb._maxX;
- s._aabb._maxY = maxY > s._aabb._maxY ? maxY : s._aabb._maxY;
- s._aabb._maxZ = maxZ > s._aabb._maxZ ? maxZ : s._aabb._maxZ;
- if(s._proxy != null) {
- let dX;
- let dY;
- let dZ;
- dX = s._transform._positionX - s._ptransform._positionX;
- dY = s._transform._positionY - s._ptransform._positionY;
- dZ = s._transform._positionZ - s._ptransform._positionZ;
- let v = s.displacement;
- v.x = dX;
- v.y = dY;
- v.z = dZ;
- s._rigidBody._world._broadPhase.moveProxy(s._proxy,s._aabb,s.displacement);
- }
- s = n;
- }
- this._sleeping = false;
- this._sleepTime = 0;
- }
- getTransform() {
- let _this = this._transform;
- let tf = new oimo.common.Transform();
- tf._positionX = _this._positionX;
- tf._positionY = _this._positionY;
- tf._positionZ = _this._positionZ;
- tf._rotation00 = _this._rotation00;
- tf._rotation01 = _this._rotation01;
- tf._rotation02 = _this._rotation02;
- tf._rotation10 = _this._rotation10;
- tf._rotation11 = _this._rotation11;
- tf._rotation12 = _this._rotation12;
- tf._rotation20 = _this._rotation20;
- tf._rotation21 = _this._rotation21;
- tf._rotation22 = _this._rotation22;
- return tf;
- }
- getTransformTo(transform) {
- let transform1 = this._transform;
- transform._positionX = transform1._positionX;
- transform._positionY = transform1._positionY;
- transform._positionZ = transform1._positionZ;
- transform._rotation00 = transform1._rotation00;
- transform._rotation01 = transform1._rotation01;
- transform._rotation02 = transform1._rotation02;
- transform._rotation10 = transform1._rotation10;
- transform._rotation11 = transform1._rotation11;
- transform._rotation12 = transform1._rotation12;
- transform._rotation20 = transform1._rotation20;
- transform._rotation21 = transform1._rotation21;
- transform._rotation22 = transform1._rotation22;
- }
- setTransform(transform) {
- this._transform._positionX = transform._positionX;
- this._transform._positionY = transform._positionY;
- this._transform._positionZ = transform._positionZ;
- this._transform._rotation00 = transform._rotation00;
- this._transform._rotation01 = transform._rotation01;
- this._transform._rotation02 = transform._rotation02;
- this._transform._rotation10 = transform._rotation10;
- this._transform._rotation11 = transform._rotation11;
- this._transform._rotation12 = transform._rotation12;
- this._transform._rotation20 = transform._rotation20;
- this._transform._rotation21 = transform._rotation21;
- this._transform._rotation22 = transform._rotation22;
- let __tmp__00;
- let __tmp__01;
- let __tmp__02;
- let __tmp__10;
- let __tmp__11;
- let __tmp__12;
- let __tmp__20;
- let __tmp__21;
- let __tmp__22;
- __tmp__00 = this._transform._rotation00 * this._invLocalInertia00 + this._transform._rotation01 * this._invLocalInertia10 + this._transform._rotation02 * this._invLocalInertia20;
- __tmp__01 = this._transform._rotation00 * this._invLocalInertia01 + this._transform._rotation01 * this._invLocalInertia11 + this._transform._rotation02 * this._invLocalInertia21;
- __tmp__02 = this._transform._rotation00 * this._invLocalInertia02 + this._transform._rotation01 * this._invLocalInertia12 + this._transform._rotation02 * this._invLocalInertia22;
- __tmp__10 = this._transform._rotation10 * this._invLocalInertia00 + this._transform._rotation11 * this._invLocalInertia10 + this._transform._rotation12 * this._invLocalInertia20;
- __tmp__11 = this._transform._rotation10 * this._invLocalInertia01 + this._transform._rotation11 * this._invLocalInertia11 + this._transform._rotation12 * this._invLocalInertia21;
- __tmp__12 = this._transform._rotation10 * this._invLocalInertia02 + this._transform._rotation11 * this._invLocalInertia12 + this._transform._rotation12 * this._invLocalInertia22;
- __tmp__20 = this._transform._rotation20 * this._invLocalInertia00 + this._transform._rotation21 * this._invLocalInertia10 + this._transform._rotation22 * this._invLocalInertia20;
- __tmp__21 = this._transform._rotation20 * this._invLocalInertia01 + this._transform._rotation21 * this._invLocalInertia11 + this._transform._rotation22 * this._invLocalInertia21;
- __tmp__22 = this._transform._rotation20 * this._invLocalInertia02 + this._transform._rotation21 * this._invLocalInertia12 + this._transform._rotation22 * this._invLocalInertia22;
- this._invInertia00 = __tmp__00;
- this._invInertia01 = __tmp__01;
- this._invInertia02 = __tmp__02;
- this._invInertia10 = __tmp__10;
- this._invInertia11 = __tmp__11;
- this._invInertia12 = __tmp__12;
- this._invInertia20 = __tmp__20;
- this._invInertia21 = __tmp__21;
- this._invInertia22 = __tmp__22;
- let __tmp__001;
- let __tmp__011;
- let __tmp__021;
- let __tmp__101;
- let __tmp__111;
- let __tmp__121;
- let __tmp__201;
- let __tmp__211;
- let __tmp__221;
- __tmp__001 = this._invInertia00 * this._transform._rotation00 + this._invInertia01 * this._transform._rotation01 + this._invInertia02 * this._transform._rotation02;
- __tmp__011 = this._invInertia00 * this._transform._rotation10 + this._invInertia01 * this._transform._rotation11 + this._invInertia02 * this._transform._rotation12;
- __tmp__021 = this._invInertia00 * this._transform._rotation20 + this._invInertia01 * this._transform._rotation21 + this._invInertia02 * this._transform._rotation22;
- __tmp__101 = this._invInertia10 * this._transform._rotation00 + this._invInertia11 * this._transform._rotation01 + this._invInertia12 * this._transform._rotation02;
- __tmp__111 = this._invInertia10 * this._transform._rotation10 + this._invInertia11 * this._transform._rotation11 + this._invInertia12 * this._transform._rotation12;
- __tmp__121 = this._invInertia10 * this._transform._rotation20 + this._invInertia11 * this._transform._rotation21 + this._invInertia12 * this._transform._rotation22;
- __tmp__201 = this._invInertia20 * this._transform._rotation00 + this._invInertia21 * this._transform._rotation01 + this._invInertia22 * this._transform._rotation02;
- __tmp__211 = this._invInertia20 * this._transform._rotation10 + this._invInertia21 * this._transform._rotation11 + this._invInertia22 * this._transform._rotation12;
- __tmp__221 = this._invInertia20 * this._transform._rotation20 + this._invInertia21 * this._transform._rotation21 + this._invInertia22 * this._transform._rotation22;
- this._invInertia00 = __tmp__001;
- this._invInertia01 = __tmp__011;
- this._invInertia02 = __tmp__021;
- this._invInertia10 = __tmp__101;
- this._invInertia11 = __tmp__111;
- this._invInertia12 = __tmp__121;
- this._invInertia20 = __tmp__201;
- this._invInertia21 = __tmp__211;
- this._invInertia22 = __tmp__221;
- this._invInertia00 *= this._rotFactor.x;
- this._invInertia01 *= this._rotFactor.x;
- this._invInertia02 *= this._rotFactor.x;
- this._invInertia10 *= this._rotFactor.y;
- this._invInertia11 *= this._rotFactor.y;
- this._invInertia12 *= this._rotFactor.y;
- this._invInertia20 *= this._rotFactor.z;
- this._invInertia21 *= this._rotFactor.z;
- this._invInertia22 *= this._rotFactor.z;
- let dst = this._ptransform;
- let src = this._transform;
- dst._positionX = src._positionX;
- dst._positionY = src._positionY;
- dst._positionZ = src._positionZ;
- dst._rotation00 = src._rotation00;
- dst._rotation01 = src._rotation01;
- dst._rotation02 = src._rotation02;
- dst._rotation10 = src._rotation10;
- dst._rotation11 = src._rotation11;
- dst._rotation12 = src._rotation12;
- dst._rotation20 = src._rotation20;
- dst._rotation21 = src._rotation21;
- dst._rotation22 = src._rotation22;
- let s = this._shapeList;
- while(s != null) {
- let n = s._next;
- let tf1 = this._ptransform;
- let tf2 = this._transform;
- let dst = s._ptransform;
- let src1 = s._localTransform;
- let __tmp__00;
- let __tmp__01;
- let __tmp__02;
- let __tmp__10;
- let __tmp__11;
- let __tmp__12;
- let __tmp__20;
- let __tmp__21;
- let __tmp__22;
- __tmp__00 = tf1._rotation00 * src1._rotation00 + tf1._rotation01 * src1._rotation10 + tf1._rotation02 * src1._rotation20;
- __tmp__01 = tf1._rotation00 * src1._rotation01 + tf1._rotation01 * src1._rotation11 + tf1._rotation02 * src1._rotation21;
- __tmp__02 = tf1._rotation00 * src1._rotation02 + tf1._rotation01 * src1._rotation12 + tf1._rotation02 * src1._rotation22;
- __tmp__10 = tf1._rotation10 * src1._rotation00 + tf1._rotation11 * src1._rotation10 + tf1._rotation12 * src1._rotation20;
- __tmp__11 = tf1._rotation10 * src1._rotation01 + tf1._rotation11 * src1._rotation11 + tf1._rotation12 * src1._rotation21;
- __tmp__12 = tf1._rotation10 * src1._rotation02 + tf1._rotation11 * src1._rotation12 + tf1._rotation12 * src1._rotation22;
- __tmp__20 = tf1._rotation20 * src1._rotation00 + tf1._rotation21 * src1._rotation10 + tf1._rotation22 * src1._rotation20;
- __tmp__21 = tf1._rotation20 * src1._rotation01 + tf1._rotation21 * src1._rotation11 + tf1._rotation22 * src1._rotation21;
- __tmp__22 = tf1._rotation20 * src1._rotation02 + tf1._rotation21 * src1._rotation12 + tf1._rotation22 * src1._rotation22;
- dst._rotation00 = __tmp__00;
- dst._rotation01 = __tmp__01;
- dst._rotation02 = __tmp__02;
- dst._rotation10 = __tmp__10;
- dst._rotation11 = __tmp__11;
- dst._rotation12 = __tmp__12;
- dst._rotation20 = __tmp__20;
- dst._rotation21 = __tmp__21;
- dst._rotation22 = __tmp__22;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = tf1._rotation00 * src1._positionX + tf1._rotation01 * src1._positionY + tf1._rotation02 * src1._positionZ;
- __tmp__Y = tf1._rotation10 * src1._positionX + tf1._rotation11 * src1._positionY + tf1._rotation12 * src1._positionZ;
- __tmp__Z = tf1._rotation20 * src1._positionX + tf1._rotation21 * src1._positionY + tf1._rotation22 * src1._positionZ;
- dst._positionX = __tmp__X;
- dst._positionY = __tmp__Y;
- dst._positionZ = __tmp__Z;
- dst._positionX += tf1._positionX;
- dst._positionY += tf1._positionY;
- dst._positionZ += tf1._positionZ;
- let dst1 = s._transform;
- let src11 = s._localTransform;
- let __tmp__001;
- let __tmp__011;
- let __tmp__021;
- let __tmp__101;
- let __tmp__111;
- let __tmp__121;
- let __tmp__201;
- let __tmp__211;
- let __tmp__221;
- __tmp__001 = tf2._rotation00 * src11._rotation00 + tf2._rotation01 * src11._rotation10 + tf2._rotation02 * src11._rotation20;
- __tmp__011 = tf2._rotation00 * src11._rotation01 + tf2._rotation01 * src11._rotation11 + tf2._rotation02 * src11._rotation21;
- __tmp__021 = tf2._rotation00 * src11._rotation02 + tf2._rotation01 * src11._rotation12 + tf2._rotation02 * src11._rotation22;
- __tmp__101 = tf2._rotation10 * src11._rotation00 + tf2._rotation11 * src11._rotation10 + tf2._rotation12 * src11._rotation20;
- __tmp__111 = tf2._rotation10 * src11._rotation01 + tf2._rotation11 * src11._rotation11 + tf2._rotation12 * src11._rotation21;
- __tmp__121 = tf2._rotation10 * src11._rotation02 + tf2._rotation11 * src11._rotation12 + tf2._rotation12 * src11._rotation22;
- __tmp__201 = tf2._rotation20 * src11._rotation00 + tf2._rotation21 * src11._rotation10 + tf2._rotation22 * src11._rotation20;
- __tmp__211 = tf2._rotation20 * src11._rotation01 + tf2._rotation21 * src11._rotation11 + tf2._rotation22 * src11._rotation21;
- __tmp__221 = tf2._rotation20 * src11._rotation02 + tf2._rotation21 * src11._rotation12 + tf2._rotation22 * src11._rotation22;
- dst1._rotation00 = __tmp__001;
- dst1._rotation01 = __tmp__011;
- dst1._rotation02 = __tmp__021;
- dst1._rotation10 = __tmp__101;
- dst1._rotation11 = __tmp__111;
- dst1._rotation12 = __tmp__121;
- dst1._rotation20 = __tmp__201;
- dst1._rotation21 = __tmp__211;
- dst1._rotation22 = __tmp__221;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = tf2._rotation00 * src11._positionX + tf2._rotation01 * src11._positionY + tf2._rotation02 * src11._positionZ;
- __tmp__Y1 = tf2._rotation10 * src11._positionX + tf2._rotation11 * src11._positionY + tf2._rotation12 * src11._positionZ;
- __tmp__Z1 = tf2._rotation20 * src11._positionX + tf2._rotation21 * src11._positionY + tf2._rotation22 * src11._positionZ;
- dst1._positionX = __tmp__X1;
- dst1._positionY = __tmp__Y1;
- dst1._positionZ = __tmp__Z1;
- dst1._positionX += tf2._positionX;
- dst1._positionY += tf2._positionY;
- dst1._positionZ += tf2._positionZ;
- let minX;
- let minY;
- let minZ;
- let maxX;
- let maxY;
- let maxZ;
- s._geom._computeAabb(s._aabb,s._ptransform);
- minX = s._aabb._minX;
- minY = s._aabb._minY;
- minZ = s._aabb._minZ;
- maxX = s._aabb._maxX;
- maxY = s._aabb._maxY;
- maxZ = s._aabb._maxZ;
- s._geom._computeAabb(s._aabb,s._transform);
- s._aabb._minX = minX < s._aabb._minX ? minX : s._aabb._minX;
- s._aabb._minY = minY < s._aabb._minY ? minY : s._aabb._minY;
- s._aabb._minZ = minZ < s._aabb._minZ ? minZ : s._aabb._minZ;
- s._aabb._maxX = maxX > s._aabb._maxX ? maxX : s._aabb._maxX;
- s._aabb._maxY = maxY > s._aabb._maxY ? maxY : s._aabb._maxY;
- s._aabb._maxZ = maxZ > s._aabb._maxZ ? maxZ : s._aabb._maxZ;
- if(s._proxy != null) {
- let dX;
- let dY;
- let dZ;
- dX = s._transform._positionX - s._ptransform._positionX;
- dY = s._transform._positionY - s._ptransform._positionY;
- dZ = s._transform._positionZ - s._ptransform._positionZ;
- let v = s.displacement;
- v.x = dX;
- v.y = dY;
- v.z = dZ;
- s._rigidBody._world._broadPhase.moveProxy(s._proxy,s._aabb,s.displacement);
- }
- s = n;
- }
- this._sleeping = false;
- this._sleepTime = 0;
- }
- getMass() {
- return this._mass;
- }
- getLocalInertia() {
- let m = new oimo.common.Mat3();
- m.e00 = this._localInertia00;
- m.e01 = this._localInertia01;
- m.e02 = this._localInertia02;
- m.e10 = this._localInertia10;
- m.e11 = this._localInertia11;
- m.e12 = this._localInertia12;
- m.e20 = this._localInertia20;
- m.e21 = this._localInertia21;
- m.e22 = this._localInertia22;
- return m;
- }
- getLocalInertiaTo(inertia) {
- inertia.e00 = this._localInertia00;
- inertia.e01 = this._localInertia01;
- inertia.e02 = this._localInertia02;
- inertia.e10 = this._localInertia10;
- inertia.e11 = this._localInertia11;
- inertia.e12 = this._localInertia12;
- inertia.e20 = this._localInertia20;
- inertia.e21 = this._localInertia21;
- inertia.e22 = this._localInertia22;
- }
- getMassData() {
- let md = new oimo.dynamics.rigidbody.MassData();
- md.mass = this._mass;
- let m = md.localInertia;
- m.e00 = this._localInertia00;
- m.e01 = this._localInertia01;
- m.e02 = this._localInertia02;
- m.e10 = this._localInertia10;
- m.e11 = this._localInertia11;
- m.e12 = this._localInertia12;
- m.e20 = this._localInertia20;
- m.e21 = this._localInertia21;
- m.e22 = this._localInertia22;
- return md;
- }
- getMassDataTo(massData) {
- massData.mass = this._mass;
- let m = massData.localInertia;
- m.e00 = this._localInertia00;
- m.e01 = this._localInertia01;
- m.e02 = this._localInertia02;
- m.e10 = this._localInertia10;
- m.e11 = this._localInertia11;
- m.e12 = this._localInertia12;
- m.e20 = this._localInertia20;
- m.e21 = this._localInertia21;
- m.e22 = this._localInertia22;
- }
- setMassData(massData) {
- this._mass = massData.mass;
- let m = massData.localInertia;
- this._localInertia00 = m.e00;
- this._localInertia01 = m.e01;
- this._localInertia02 = m.e02;
- this._localInertia10 = m.e10;
- this._localInertia11 = m.e11;
- this._localInertia12 = m.e12;
- this._localInertia20 = m.e20;
- this._localInertia21 = m.e21;
- this._localInertia22 = m.e22;
- if(this._mass > 0 && this._localInertia00 * (this._localInertia11 * this._localInertia22 - this._localInertia12 * this._localInertia21) - this._localInertia01 * (this._localInertia10 * this._localInertia22 - this._localInertia12 * this._localInertia20) + this._localInertia02 * (this._localInertia10 * this._localInertia21 - this._localInertia11 * this._localInertia20) > 0 && this._type == 0) {
- this._invMass = 1 / this._mass;
- let d00 = this._localInertia11 * this._localInertia22 - this._localInertia12 * this._localInertia21;
- let d01 = this._localInertia10 * this._localInertia22 - this._localInertia12 * this._localInertia20;
- let d02 = this._localInertia10 * this._localInertia21 - this._localInertia11 * this._localInertia20;
- let d = this._localInertia00 * d00 - this._localInertia01 * d01 + this._localInertia02 * d02;
- if(d < -1e-32 || d > 1e-32) {
- d = 1 / d;
- }
- this._invLocalInertia00 = d00 * d;
- this._invLocalInertia01 = -(this._localInertia01 * this._localInertia22 - this._localInertia02 * this._localInertia21) * d;
- this._invLocalInertia02 = (this._localInertia01 * this._localInertia12 - this._localInertia02 * this._localInertia11) * d;
- this._invLocalInertia10 = -d01 * d;
- this._invLocalInertia11 = (this._localInertia00 * this._localInertia22 - this._localInertia02 * this._localInertia20) * d;
- this._invLocalInertia12 = -(this._localInertia00 * this._localInertia12 - this._localInertia02 * this._localInertia10) * d;
- this._invLocalInertia20 = d02 * d;
- this._invLocalInertia21 = -(this._localInertia00 * this._localInertia21 - this._localInertia01 * this._localInertia20) * d;
- this._invLocalInertia22 = (this._localInertia00 * this._localInertia11 - this._localInertia01 * this._localInertia10) * d;
- this._invLocalInertiaWithoutRotFactor00 = this._invLocalInertia00;
- this._invLocalInertiaWithoutRotFactor01 = this._invLocalInertia01;
- this._invLocalInertiaWithoutRotFactor02 = this._invLocalInertia02;
- this._invLocalInertiaWithoutRotFactor10 = this._invLocalInertia10;
- this._invLocalInertiaWithoutRotFactor11 = this._invLocalInertia11;
- this._invLocalInertiaWithoutRotFactor12 = this._invLocalInertia12;
- this._invLocalInertiaWithoutRotFactor20 = this._invLocalInertia20;
- this._invLocalInertiaWithoutRotFactor21 = this._invLocalInertia21;
- this._invLocalInertiaWithoutRotFactor22 = this._invLocalInertia22;
- this._invLocalInertia00 = this._invLocalInertiaWithoutRotFactor00 * this._rotFactor.x;
- this._invLocalInertia01 = this._invLocalInertiaWithoutRotFactor01 * this._rotFactor.x;
- this._invLocalInertia02 = this._invLocalInertiaWithoutRotFactor02 * this._rotFactor.x;
- this._invLocalInertia10 = this._invLocalInertiaWithoutRotFactor10 * this._rotFactor.y;
- this._invLocalInertia11 = this._invLocalInertiaWithoutRotFactor11 * this._rotFactor.y;
- this._invLocalInertia12 = this._invLocalInertiaWithoutRotFactor12 * this._rotFactor.y;
- this._invLocalInertia20 = this._invLocalInertiaWithoutRotFactor20 * this._rotFactor.z;
- this._invLocalInertia21 = this._invLocalInertiaWithoutRotFactor21 * this._rotFactor.z;
- this._invLocalInertia22 = this._invLocalInertiaWithoutRotFactor22 * this._rotFactor.z;
- } else {
- this._invMass = 0;
- this._invLocalInertia00 = 0;
- this._invLocalInertia01 = 0;
- this._invLocalInertia02 = 0;
- this._invLocalInertia10 = 0;
- this._invLocalInertia11 = 0;
- this._invLocalInertia12 = 0;
- this._invLocalInertia20 = 0;
- this._invLocalInertia21 = 0;
- this._invLocalInertia22 = 0;
- this._invLocalInertiaWithoutRotFactor00 = 0;
- this._invLocalInertiaWithoutRotFactor01 = 0;
- this._invLocalInertiaWithoutRotFactor02 = 0;
- this._invLocalInertiaWithoutRotFactor10 = 0;
- this._invLocalInertiaWithoutRotFactor11 = 0;
- this._invLocalInertiaWithoutRotFactor12 = 0;
- this._invLocalInertiaWithoutRotFactor20 = 0;
- this._invLocalInertiaWithoutRotFactor21 = 0;
- this._invLocalInertiaWithoutRotFactor22 = 0;
- if(this._type == 0) {
- this._type = 1;
- }
- }
- let __tmp__00;
- let __tmp__01;
- let __tmp__02;
- let __tmp__10;
- let __tmp__11;
- let __tmp__12;
- let __tmp__20;
- let __tmp__21;
- let __tmp__22;
- __tmp__00 = this._transform._rotation00 * this._invLocalInertia00 + this._transform._rotation01 * this._invLocalInertia10 + this._transform._rotation02 * this._invLocalInertia20;
- __tmp__01 = this._transform._rotation00 * this._invLocalInertia01 + this._transform._rotation01 * this._invLocalInertia11 + this._transform._rotation02 * this._invLocalInertia21;
- __tmp__02 = this._transform._rotation00 * this._invLocalInertia02 + this._transform._rotation01 * this._invLocalInertia12 + this._transform._rotation02 * this._invLocalInertia22;
- __tmp__10 = this._transform._rotation10 * this._invLocalInertia00 + this._transform._rotation11 * this._invLocalInertia10 + this._transform._rotation12 * this._invLocalInertia20;
- __tmp__11 = this._transform._rotation10 * this._invLocalInertia01 + this._transform._rotation11 * this._invLocalInertia11 + this._transform._rotation12 * this._invLocalInertia21;
- __tmp__12 = this._transform._rotation10 * this._invLocalInertia02 + this._transform._rotation11 * this._invLocalInertia12 + this._transform._rotation12 * this._invLocalInertia22;
- __tmp__20 = this._transform._rotation20 * this._invLocalInertia00 + this._transform._rotation21 * this._invLocalInertia10 + this._transform._rotation22 * this._invLocalInertia20;
- __tmp__21 = this._transform._rotation20 * this._invLocalInertia01 + this._transform._rotation21 * this._invLocalInertia11 + this._transform._rotation22 * this._invLocalInertia21;
- __tmp__22 = this._transform._rotation20 * this._invLocalInertia02 + this._transform._rotation21 * this._invLocalInertia12 + this._transform._rotation22 * this._invLocalInertia22;
- this._invInertia00 = __tmp__00;
- this._invInertia01 = __tmp__01;
- this._invInertia02 = __tmp__02;
- this._invInertia10 = __tmp__10;
- this._invInertia11 = __tmp__11;
- this._invInertia12 = __tmp__12;
- this._invInertia20 = __tmp__20;
- this._invInertia21 = __tmp__21;
- this._invInertia22 = __tmp__22;
- let __tmp__001;
- let __tmp__011;
- let __tmp__021;
- let __tmp__101;
- let __tmp__111;
- let __tmp__121;
- let __tmp__201;
- let __tmp__211;
- let __tmp__221;
- __tmp__001 = this._invInertia00 * this._transform._rotation00 + this._invInertia01 * this._transform._rotation01 + this._invInertia02 * this._transform._rotation02;
- __tmp__011 = this._invInertia00 * this._transform._rotation10 + this._invInertia01 * this._transform._rotation11 + this._invInertia02 * this._transform._rotation12;
- __tmp__021 = this._invInertia00 * this._transform._rotation20 + this._invInertia01 * this._transform._rotation21 + this._invInertia02 * this._transform._rotation22;
- __tmp__101 = this._invInertia10 * this._transform._rotation00 + this._invInertia11 * this._transform._rotation01 + this._invInertia12 * this._transform._rotation02;
- __tmp__111 = this._invInertia10 * this._transform._rotation10 + this._invInertia11 * this._transform._rotation11 + this._invInertia12 * this._transform._rotation12;
- __tmp__121 = this._invInertia10 * this._transform._rotation20 + this._invInertia11 * this._transform._rotation21 + this._invInertia12 * this._transform._rotation22;
- __tmp__201 = this._invInertia20 * this._transform._rotation00 + this._invInertia21 * this._transform._rotation01 + this._invInertia22 * this._transform._rotation02;
- __tmp__211 = this._invInertia20 * this._transform._rotation10 + this._invInertia21 * this._transform._rotation11 + this._invInertia22 * this._transform._rotation12;
- __tmp__221 = this._invInertia20 * this._transform._rotation20 + this._invInertia21 * this._transform._rotation21 + this._invInertia22 * this._transform._rotation22;
- this._invInertia00 = __tmp__001;
- this._invInertia01 = __tmp__011;
- this._invInertia02 = __tmp__021;
- this._invInertia10 = __tmp__101;
- this._invInertia11 = __tmp__111;
- this._invInertia12 = __tmp__121;
- this._invInertia20 = __tmp__201;
- this._invInertia21 = __tmp__211;
- this._invInertia22 = __tmp__221;
- this._invInertia00 *= this._rotFactor.x;
- this._invInertia01 *= this._rotFactor.x;
- this._invInertia02 *= this._rotFactor.x;
- this._invInertia10 *= this._rotFactor.y;
- this._invInertia11 *= this._rotFactor.y;
- this._invInertia12 *= this._rotFactor.y;
- this._invInertia20 *= this._rotFactor.z;
- this._invInertia21 *= this._rotFactor.z;
- this._invInertia22 *= this._rotFactor.z;
- this._sleeping = false;
- this._sleepTime = 0;
- }
- getRotationFactor() {
- let _this = this._rotFactor;
- return new oimo.common.Vec3(_this.x,_this.y,_this.z);
- }
- setRotationFactor(rotationFactor) {
- let _this = this._rotFactor;
- _this.x = rotationFactor.x;
- _this.y = rotationFactor.y;
- _this.z = rotationFactor.z;
- let __tmp__00;
- let __tmp__01;
- let __tmp__02;
- let __tmp__10;
- let __tmp__11;
- let __tmp__12;
- let __tmp__20;
- let __tmp__21;
- let __tmp__22;
- __tmp__00 = this._transform._rotation00 * this._invLocalInertia00 + this._transform._rotation01 * this._invLocalInertia10 + this._transform._rotation02 * this._invLocalInertia20;
- __tmp__01 = this._transform._rotation00 * this._invLocalInertia01 + this._transform._rotation01 * this._invLocalInertia11 + this._transform._rotation02 * this._invLocalInertia21;
- __tmp__02 = this._transform._rotation00 * this._invLocalInertia02 + this._transform._rotation01 * this._invLocalInertia12 + this._transform._rotation02 * this._invLocalInertia22;
- __tmp__10 = this._transform._rotation10 * this._invLocalInertia00 + this._transform._rotation11 * this._invLocalInertia10 + this._transform._rotation12 * this._invLocalInertia20;
- __tmp__11 = this._transform._rotation10 * this._invLocalInertia01 + this._transform._rotation11 * this._invLocalInertia11 + this._transform._rotation12 * this._invLocalInertia21;
- __tmp__12 = this._transform._rotation10 * this._invLocalInertia02 + this._transform._rotation11 * this._invLocalInertia12 + this._transform._rotation12 * this._invLocalInertia22;
- __tmp__20 = this._transform._rotation20 * this._invLocalInertia00 + this._transform._rotation21 * this._invLocalInertia10 + this._transform._rotation22 * this._invLocalInertia20;
- __tmp__21 = this._transform._rotation20 * this._invLocalInertia01 + this._transform._rotation21 * this._invLocalInertia11 + this._transform._rotation22 * this._invLocalInertia21;
- __tmp__22 = this._transform._rotation20 * this._invLocalInertia02 + this._transform._rotation21 * this._invLocalInertia12 + this._transform._rotation22 * this._invLocalInertia22;
- this._invInertia00 = __tmp__00;
- this._invInertia01 = __tmp__01;
- this._invInertia02 = __tmp__02;
- this._invInertia10 = __tmp__10;
- this._invInertia11 = __tmp__11;
- this._invInertia12 = __tmp__12;
- this._invInertia20 = __tmp__20;
- this._invInertia21 = __tmp__21;
- this._invInertia22 = __tmp__22;
- let __tmp__001;
- let __tmp__011;
- let __tmp__021;
- let __tmp__101;
- let __tmp__111;
- let __tmp__121;
- let __tmp__201;
- let __tmp__211;
- let __tmp__221;
- __tmp__001 = this._invInertia00 * this._transform._rotation00 + this._invInertia01 * this._transform._rotation01 + this._invInertia02 * this._transform._rotation02;
- __tmp__011 = this._invInertia00 * this._transform._rotation10 + this._invInertia01 * this._transform._rotation11 + this._invInertia02 * this._transform._rotation12;
- __tmp__021 = this._invInertia00 * this._transform._rotation20 + this._invInertia01 * this._transform._rotation21 + this._invInertia02 * this._transform._rotation22;
- __tmp__101 = this._invInertia10 * this._transform._rotation00 + this._invInertia11 * this._transform._rotation01 + this._invInertia12 * this._transform._rotation02;
- __tmp__111 = this._invInertia10 * this._transform._rotation10 + this._invInertia11 * this._transform._rotation11 + this._invInertia12 * this._transform._rotation12;
- __tmp__121 = this._invInertia10 * this._transform._rotation20 + this._invInertia11 * this._transform._rotation21 + this._invInertia12 * this._transform._rotation22;
- __tmp__201 = this._invInertia20 * this._transform._rotation00 + this._invInertia21 * this._transform._rotation01 + this._invInertia22 * this._transform._rotation02;
- __tmp__211 = this._invInertia20 * this._transform._rotation10 + this._invInertia21 * this._transform._rotation11 + this._invInertia22 * this._transform._rotation12;
- __tmp__221 = this._invInertia20 * this._transform._rotation20 + this._invInertia21 * this._transform._rotation21 + this._invInertia22 * this._transform._rotation22;
- this._invInertia00 = __tmp__001;
- this._invInertia01 = __tmp__011;
- this._invInertia02 = __tmp__021;
- this._invInertia10 = __tmp__101;
- this._invInertia11 = __tmp__111;
- this._invInertia12 = __tmp__121;
- this._invInertia20 = __tmp__201;
- this._invInertia21 = __tmp__211;
- this._invInertia22 = __tmp__221;
- this._invInertia00 *= this._rotFactor.x;
- this._invInertia01 *= this._rotFactor.x;
- this._invInertia02 *= this._rotFactor.x;
- this._invInertia10 *= this._rotFactor.y;
- this._invInertia11 *= this._rotFactor.y;
- this._invInertia12 *= this._rotFactor.y;
- this._invInertia20 *= this._rotFactor.z;
- this._invInertia21 *= this._rotFactor.z;
- this._invInertia22 *= this._rotFactor.z;
- this._sleeping = false;
- this._sleepTime = 0;
- }
- getLinearVelocity() {
- let v = new oimo.common.Vec3();
- v.x = this._velX;
- v.y = this._velY;
- v.z = this._velZ;
- return v;
- }
- getLinearVelocityTo(linearVelocity) {
- linearVelocity.x = this._velX;
- linearVelocity.y = this._velY;
- linearVelocity.z = this._velZ;
- }
- setLinearVelocity(linearVelocity) {
- if(this._type == 1) {
- this._velX = 0;
- this._velY = 0;
- this._velZ = 0;
- } else {
- this._velX = linearVelocity.x;
- this._velY = linearVelocity.y;
- this._velZ = linearVelocity.z;
- }
- this._sleeping = false;
- this._sleepTime = 0;
- }
- getAngularVelocity() {
- let v = new oimo.common.Vec3();
- v.x = this._angVelX;
- v.y = this._angVelY;
- v.z = this._angVelZ;
- return v;
- }
- getAngularVelocityTo(angularVelocity) {
- angularVelocity.x = this._velX;
- angularVelocity.y = this._velY;
- angularVelocity.z = this._velZ;
- }
- setAngularVelocity(angularVelocity) {
- if(this._type == 1) {
- this._angVelX = 0;
- this._angVelY = 0;
- this._angVelZ = 0;
- } else {
- this._angVelX = angularVelocity.x;
- this._angVelY = angularVelocity.y;
- this._angVelZ = angularVelocity.z;
- }
- this._sleeping = false;
- this._sleepTime = 0;
- }
- addLinearVelocity(linearVelocityChange) {
- if(this._type != 1) {
- let dX;
- let dY;
- let dZ;
- dX = linearVelocityChange.x;
- dY = linearVelocityChange.y;
- dZ = linearVelocityChange.z;
- this._velX += dX;
- this._velY += dY;
- this._velZ += dZ;
- }
- this._sleeping = false;
- this._sleepTime = 0;
- }
- addAngularVelocity(angularVelocityChange) {
- if(this._type != 1) {
- let dX;
- let dY;
- let dZ;
- dX = angularVelocityChange.x;
- dY = angularVelocityChange.y;
- dZ = angularVelocityChange.z;
- this._angVelX += dX;
- this._angVelY += dY;
- this._angVelZ += dZ;
- }
- this._sleeping = false;
- this._sleepTime = 0;
- }
- applyImpulse(impulse,positionInWorld) {
- let impX;
- let impY;
- let impZ;
- impX = impulse.x;
- impY = impulse.y;
- impZ = impulse.z;
- this._velX += impX * this._invMass;
- this._velY += impY * this._invMass;
- this._velZ += impZ * this._invMass;
- let aimpX;
- let aimpY;
- let aimpZ;
- let posX;
- let posY;
- let posZ;
- posX = positionInWorld.x;
- posY = positionInWorld.y;
- posZ = positionInWorld.z;
- posX -= this._transform._positionX;
- posY -= this._transform._positionY;
- posZ -= this._transform._positionZ;
- aimpX = posY * impZ - posZ * impY;
- aimpY = posZ * impX - posX * impZ;
- aimpZ = posX * impY - posY * impX;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = this._invInertia00 * aimpX + this._invInertia01 * aimpY + this._invInertia02 * aimpZ;
- __tmp__Y = this._invInertia10 * aimpX + this._invInertia11 * aimpY + this._invInertia12 * aimpZ;
- __tmp__Z = this._invInertia20 * aimpX + this._invInertia21 * aimpY + this._invInertia22 * aimpZ;
- aimpX = __tmp__X;
- aimpY = __tmp__Y;
- aimpZ = __tmp__Z;
- this._angVelX += aimpX;
- this._angVelY += aimpY;
- this._angVelZ += aimpZ;
- this._sleeping = false;
- this._sleepTime = 0;
- }
- applyLinearImpulse(impulse) {
- let impX;
- let impY;
- let impZ;
- impX = impulse.x;
- impY = impulse.y;
- impZ = impulse.z;
- this._velX += impX * this._invMass;
- this._velY += impY * this._invMass;
- this._velZ += impZ * this._invMass;
- this._sleeping = false;
- this._sleepTime = 0;
- }
- applyAngularImpulse(impulse) {
- let impX;
- let impY;
- let impZ;
- impX = impulse.x;
- impY = impulse.y;
- impZ = impulse.z;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = this._invInertia00 * impX + this._invInertia01 * impY + this._invInertia02 * impZ;
- __tmp__Y = this._invInertia10 * impX + this._invInertia11 * impY + this._invInertia12 * impZ;
- __tmp__Z = this._invInertia20 * impX + this._invInertia21 * impY + this._invInertia22 * impZ;
- impX = __tmp__X;
- impY = __tmp__Y;
- impZ = __tmp__Z;
- this._angVelX += impX;
- this._angVelY += impY;
- this._angVelZ += impZ;
- this._sleeping = false;
- this._sleepTime = 0;
- }
- applyForce(force,positionInWorld) {
- let iforceX;
- let iforceY;
- let iforceZ;
- iforceX = force.x;
- iforceY = force.y;
- iforceZ = force.z;
- this._forceX += iforceX;
- this._forceY += iforceY;
- this._forceZ += iforceZ;
- let itorqueX;
- let itorqueY;
- let itorqueZ;
- let posX;
- let posY;
- let posZ;
- posX = positionInWorld.x;
- posY = positionInWorld.y;
- posZ = positionInWorld.z;
- posX -= this._transform._positionX;
- posY -= this._transform._positionY;
- posZ -= this._transform._positionZ;
- itorqueX = posY * iforceZ - posZ * iforceY;
- itorqueY = posZ * iforceX - posX * iforceZ;
- itorqueZ = posX * iforceY - posY * iforceX;
- this._torqueX += itorqueX;
- this._torqueY += itorqueY;
- this._torqueZ += itorqueZ;
- this._sleeping = false;
- this._sleepTime = 0;
- }
- applyForceToCenter(force) {
- let iforceX;
- let iforceY;
- let iforceZ;
- iforceX = force.x;
- iforceY = force.y;
- iforceZ = force.z;
- this._forceX += iforceX;
- this._forceY += iforceY;
- this._forceZ += iforceZ;
- this._sleeping = false;
- this._sleepTime = 0;
- }
- applyTorque(torque) {
- let itorqueX;
- let itorqueY;
- let itorqueZ;
- itorqueX = torque.x;
- itorqueY = torque.y;
- itorqueZ = torque.z;
- this._torqueX += itorqueX;
- this._torqueY += itorqueY;
- this._torqueZ += itorqueZ;
- this._sleeping = false;
- this._sleepTime = 0;
- }
- getLinearContactImpulse() {
- let res = new oimo.common.Vec3();
- res.x = this._linearContactImpulseX;
- res.y = this._linearContactImpulseY;
- res.z = this._linearContactImpulseZ;
- return res;
- }
- getLinearContactImpulseTo(linearContactImpulse) {
- linearContactImpulse.x = this._linearContactImpulseX;
- linearContactImpulse.y = this._linearContactImpulseY;
- linearContactImpulse.z = this._linearContactImpulseZ;
- }
- getAngularContactImpulse() {
- let res = new oimo.common.Vec3();
- res.x = this._angularContactImpulseX;
- res.y = this._angularContactImpulseY;
- res.z = this._angularContactImpulseZ;
- return res;
- }
- getAngularContactImpulseTo(angularContactImpulse) {
- angularContactImpulse.x = this._angularContactImpulseX;
- angularContactImpulse.y = this._angularContactImpulseY;
- angularContactImpulse.z = this._angularContactImpulseZ;
- }
- getGravityScale() {
- return this._gravityScale;
- }
- setGravityScale(gravityScale) {
- this._gravityScale = gravityScale;
- this._sleeping = false;
- this._sleepTime = 0;
- }
- getLocalPoint(worldPoint) {
- let vX;
- let vY;
- let vZ;
- vX = worldPoint.x;
- vY = worldPoint.y;
- vZ = worldPoint.z;
- vX -= this._transform._positionX;
- vY -= this._transform._positionY;
- vZ -= this._transform._positionZ;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = this._transform._rotation00 * vX + this._transform._rotation10 * vY + this._transform._rotation20 * vZ;
- __tmp__Y = this._transform._rotation01 * vX + this._transform._rotation11 * vY + this._transform._rotation21 * vZ;
- __tmp__Z = this._transform._rotation02 * vX + this._transform._rotation12 * vY + this._transform._rotation22 * vZ;
- vX = __tmp__X;
- vY = __tmp__Y;
- vZ = __tmp__Z;
- let res = new oimo.common.Vec3();
- res.x = vX;
- res.y = vY;
- res.z = vZ;
- return res;
- }
- getLocalPointTo(worldPoint,localPoint) {
- let vX;
- let vY;
- let vZ;
- vX = worldPoint.x;
- vY = worldPoint.y;
- vZ = worldPoint.z;
- vX -= this._transform._positionX;
- vY -= this._transform._positionY;
- vZ -= this._transform._positionZ;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = this._transform._rotation00 * vX + this._transform._rotation10 * vY + this._transform._rotation20 * vZ;
- __tmp__Y = this._transform._rotation01 * vX + this._transform._rotation11 * vY + this._transform._rotation21 * vZ;
- __tmp__Z = this._transform._rotation02 * vX + this._transform._rotation12 * vY + this._transform._rotation22 * vZ;
- vX = __tmp__X;
- vY = __tmp__Y;
- vZ = __tmp__Z;
- localPoint.x = vX;
- localPoint.y = vY;
- localPoint.z = vZ;
- }
- getLocalVector(worldVector) {
- let vX;
- let vY;
- let vZ;
- vX = worldVector.x;
- vY = worldVector.y;
- vZ = worldVector.z;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = this._transform._rotation00 * vX + this._transform._rotation10 * vY + this._transform._rotation20 * vZ;
- __tmp__Y = this._transform._rotation01 * vX + this._transform._rotation11 * vY + this._transform._rotation21 * vZ;
- __tmp__Z = this._transform._rotation02 * vX + this._transform._rotation12 * vY + this._transform._rotation22 * vZ;
- vX = __tmp__X;
- vY = __tmp__Y;
- vZ = __tmp__Z;
- let res = new oimo.common.Vec3();
- res.x = vX;
- res.y = vY;
- res.z = vZ;
- return res;
- }
- getLocalVectorTo(worldVector,localVector) {
- let vX;
- let vY;
- let vZ;
- vX = worldVector.x;
- vY = worldVector.y;
- vZ = worldVector.z;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = this._transform._rotation00 * vX + this._transform._rotation10 * vY + this._transform._rotation20 * vZ;
- __tmp__Y = this._transform._rotation01 * vX + this._transform._rotation11 * vY + this._transform._rotation21 * vZ;
- __tmp__Z = this._transform._rotation02 * vX + this._transform._rotation12 * vY + this._transform._rotation22 * vZ;
- vX = __tmp__X;
- vY = __tmp__Y;
- vZ = __tmp__Z;
- localVector.x = vX;
- localVector.y = vY;
- localVector.z = vZ;
- }
- getWorldPoint(localPoint) {
- let vX;
- let vY;
- let vZ;
- vX = localPoint.x;
- vY = localPoint.y;
- vZ = localPoint.z;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = this._transform._rotation00 * vX + this._transform._rotation01 * vY + this._transform._rotation02 * vZ;
- __tmp__Y = this._transform._rotation10 * vX + this._transform._rotation11 * vY + this._transform._rotation12 * vZ;
- __tmp__Z = this._transform._rotation20 * vX + this._transform._rotation21 * vY + this._transform._rotation22 * vZ;
- vX = __tmp__X;
- vY = __tmp__Y;
- vZ = __tmp__Z;
- vX += this._transform._positionX;
- vY += this._transform._positionY;
- vZ += this._transform._positionZ;
- let res = new oimo.common.Vec3();
- res.x = vX;
- res.y = vY;
- res.z = vZ;
- return res;
- }
- getWorldPointTo(localPoint,worldPoint) {
- let vX;
- let vY;
- let vZ;
- vX = localPoint.x;
- vY = localPoint.y;
- vZ = localPoint.z;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = this._transform._rotation00 * vX + this._transform._rotation01 * vY + this._transform._rotation02 * vZ;
- __tmp__Y = this._transform._rotation10 * vX + this._transform._rotation11 * vY + this._transform._rotation12 * vZ;
- __tmp__Z = this._transform._rotation20 * vX + this._transform._rotation21 * vY + this._transform._rotation22 * vZ;
- vX = __tmp__X;
- vY = __tmp__Y;
- vZ = __tmp__Z;
- vX += this._transform._positionX;
- vY += this._transform._positionY;
- vZ += this._transform._positionZ;
- worldPoint.x = vX;
- worldPoint.y = vY;
- worldPoint.z = vZ;
- }
- getWorldVector(localVector) {
- let vX;
- let vY;
- let vZ;
- vX = localVector.x;
- vY = localVector.y;
- vZ = localVector.z;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = this._transform._rotation00 * vX + this._transform._rotation01 * vY + this._transform._rotation02 * vZ;
- __tmp__Y = this._transform._rotation10 * vX + this._transform._rotation11 * vY + this._transform._rotation12 * vZ;
- __tmp__Z = this._transform._rotation20 * vX + this._transform._rotation21 * vY + this._transform._rotation22 * vZ;
- vX = __tmp__X;
- vY = __tmp__Y;
- vZ = __tmp__Z;
- let res = new oimo.common.Vec3();
- res.x = vX;
- res.y = vY;
- res.z = vZ;
- return res;
- }
- getWorldVectorTo(localVector,worldVector) {
- let vX;
- let vY;
- let vZ;
- vX = localVector.x;
- vY = localVector.y;
- vZ = localVector.z;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = this._transform._rotation00 * vX + this._transform._rotation01 * vY + this._transform._rotation02 * vZ;
- __tmp__Y = this._transform._rotation10 * vX + this._transform._rotation11 * vY + this._transform._rotation12 * vZ;
- __tmp__Z = this._transform._rotation20 * vX + this._transform._rotation21 * vY + this._transform._rotation22 * vZ;
- vX = __tmp__X;
- vY = __tmp__Y;
- vZ = __tmp__Z;
- worldVector.x = vX;
- worldVector.y = vY;
- worldVector.z = vZ;
- }
- getNumShapes() {
- return this._numShapes;
- }
- getShapeList() {
- return this._shapeList;
- }
- getNumContectLinks() {
- return this._numContactLinks;
- }
- getContactLinkList() {
- return this._contactLinkList;
- }
- getNumJointLinks() {
- return this._numJointLinks;
- }
- getJointLinkList() {
- return this._jointLinkList;
- }
- addShape(shape) {
- if(this._shapeList == null) {
- this._shapeList = shape;
- this._shapeListLast = shape;
- } else {
- this._shapeListLast._next = shape;
- shape._prev = this._shapeListLast;
- this._shapeListLast = shape;
- }
- this._numShapes++;
- shape._rigidBody = this;
- if(this._world != null) {
- let _this = this._world;
- shape._proxy = _this._broadPhase.createProxy(shape,shape._aabb);
- shape._id = _this._shapeIdCount++;
- _this._numShapes++;
- }
- this.updateMass();
- let s = this._shapeList;
- while(s != null) {
- let n = s._next;
- let tf1 = this._ptransform;
- let tf2 = this._transform;
- let dst = s._ptransform;
- let src1 = s._localTransform;
- let __tmp__00;
- let __tmp__01;
- let __tmp__02;
- let __tmp__10;
- let __tmp__11;
- let __tmp__12;
- let __tmp__20;
- let __tmp__21;
- let __tmp__22;
- __tmp__00 = tf1._rotation00 * src1._rotation00 + tf1._rotation01 * src1._rotation10 + tf1._rotation02 * src1._rotation20;
- __tmp__01 = tf1._rotation00 * src1._rotation01 + tf1._rotation01 * src1._rotation11 + tf1._rotation02 * src1._rotation21;
- __tmp__02 = tf1._rotation00 * src1._rotation02 + tf1._rotation01 * src1._rotation12 + tf1._rotation02 * src1._rotation22;
- __tmp__10 = tf1._rotation10 * src1._rotation00 + tf1._rotation11 * src1._rotation10 + tf1._rotation12 * src1._rotation20;
- __tmp__11 = tf1._rotation10 * src1._rotation01 + tf1._rotation11 * src1._rotation11 + tf1._rotation12 * src1._rotation21;
- __tmp__12 = tf1._rotation10 * src1._rotation02 + tf1._rotation11 * src1._rotation12 + tf1._rotation12 * src1._rotation22;
- __tmp__20 = tf1._rotation20 * src1._rotation00 + tf1._rotation21 * src1._rotation10 + tf1._rotation22 * src1._rotation20;
- __tmp__21 = tf1._rotation20 * src1._rotation01 + tf1._rotation21 * src1._rotation11 + tf1._rotation22 * src1._rotation21;
- __tmp__22 = tf1._rotation20 * src1._rotation02 + tf1._rotation21 * src1._rotation12 + tf1._rotation22 * src1._rotation22;
- dst._rotation00 = __tmp__00;
- dst._rotation01 = __tmp__01;
- dst._rotation02 = __tmp__02;
- dst._rotation10 = __tmp__10;
- dst._rotation11 = __tmp__11;
- dst._rotation12 = __tmp__12;
- dst._rotation20 = __tmp__20;
- dst._rotation21 = __tmp__21;
- dst._rotation22 = __tmp__22;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = tf1._rotation00 * src1._positionX + tf1._rotation01 * src1._positionY + tf1._rotation02 * src1._positionZ;
- __tmp__Y = tf1._rotation10 * src1._positionX + tf1._rotation11 * src1._positionY + tf1._rotation12 * src1._positionZ;
- __tmp__Z = tf1._rotation20 * src1._positionX + tf1._rotation21 * src1._positionY + tf1._rotation22 * src1._positionZ;
- dst._positionX = __tmp__X;
- dst._positionY = __tmp__Y;
- dst._positionZ = __tmp__Z;
- dst._positionX += tf1._positionX;
- dst._positionY += tf1._positionY;
- dst._positionZ += tf1._positionZ;
- let dst1 = s._transform;
- let src11 = s._localTransform;
- let __tmp__001;
- let __tmp__011;
- let __tmp__021;
- let __tmp__101;
- let __tmp__111;
- let __tmp__121;
- let __tmp__201;
- let __tmp__211;
- let __tmp__221;
- __tmp__001 = tf2._rotation00 * src11._rotation00 + tf2._rotation01 * src11._rotation10 + tf2._rotation02 * src11._rotation20;
- __tmp__011 = tf2._rotation00 * src11._rotation01 + tf2._rotation01 * src11._rotation11 + tf2._rotation02 * src11._rotation21;
- __tmp__021 = tf2._rotation00 * src11._rotation02 + tf2._rotation01 * src11._rotation12 + tf2._rotation02 * src11._rotation22;
- __tmp__101 = tf2._rotation10 * src11._rotation00 + tf2._rotation11 * src11._rotation10 + tf2._rotation12 * src11._rotation20;
- __tmp__111 = tf2._rotation10 * src11._rotation01 + tf2._rotation11 * src11._rotation11 + tf2._rotation12 * src11._rotation21;
- __tmp__121 = tf2._rotation10 * src11._rotation02 + tf2._rotation11 * src11._rotation12 + tf2._rotation12 * src11._rotation22;
- __tmp__201 = tf2._rotation20 * src11._rotation00 + tf2._rotation21 * src11._rotation10 + tf2._rotation22 * src11._rotation20;
- __tmp__211 = tf2._rotation20 * src11._rotation01 + tf2._rotation21 * src11._rotation11 + tf2._rotation22 * src11._rotation21;
- __tmp__221 = tf2._rotation20 * src11._rotation02 + tf2._rotation21 * src11._rotation12 + tf2._rotation22 * src11._rotation22;
- dst1._rotation00 = __tmp__001;
- dst1._rotation01 = __tmp__011;
- dst1._rotation02 = __tmp__021;
- dst1._rotation10 = __tmp__101;
- dst1._rotation11 = __tmp__111;
- dst1._rotation12 = __tmp__121;
- dst1._rotation20 = __tmp__201;
- dst1._rotation21 = __tmp__211;
- dst1._rotation22 = __tmp__221;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = tf2._rotation00 * src11._positionX + tf2._rotation01 * src11._positionY + tf2._rotation02 * src11._positionZ;
- __tmp__Y1 = tf2._rotation10 * src11._positionX + tf2._rotation11 * src11._positionY + tf2._rotation12 * src11._positionZ;
- __tmp__Z1 = tf2._rotation20 * src11._positionX + tf2._rotation21 * src11._positionY + tf2._rotation22 * src11._positionZ;
- dst1._positionX = __tmp__X1;
- dst1._positionY = __tmp__Y1;
- dst1._positionZ = __tmp__Z1;
- dst1._positionX += tf2._positionX;
- dst1._positionY += tf2._positionY;
- dst1._positionZ += tf2._positionZ;
- let minX;
- let minY;
- let minZ;
- let maxX;
- let maxY;
- let maxZ;
- s._geom._computeAabb(s._aabb,s._ptransform);
- minX = s._aabb._minX;
- minY = s._aabb._minY;
- minZ = s._aabb._minZ;
- maxX = s._aabb._maxX;
- maxY = s._aabb._maxY;
- maxZ = s._aabb._maxZ;
- s._geom._computeAabb(s._aabb,s._transform);
- s._aabb._minX = minX < s._aabb._minX ? minX : s._aabb._minX;
- s._aabb._minY = minY < s._aabb._minY ? minY : s._aabb._minY;
- s._aabb._minZ = minZ < s._aabb._minZ ? minZ : s._aabb._minZ;
- s._aabb._maxX = maxX > s._aabb._maxX ? maxX : s._aabb._maxX;
- s._aabb._maxY = maxY > s._aabb._maxY ? maxY : s._aabb._maxY;
- s._aabb._maxZ = maxZ > s._aabb._maxZ ? maxZ : s._aabb._maxZ;
- if(s._proxy != null) {
- let dX;
- let dY;
- let dZ;
- dX = s._transform._positionX - s._ptransform._positionX;
- dY = s._transform._positionY - s._ptransform._positionY;
- dZ = s._transform._positionZ - s._ptransform._positionZ;
- let v = s.displacement;
- v.x = dX;
- v.y = dY;
- v.z = dZ;
- s._rigidBody._world._broadPhase.moveProxy(s._proxy,s._aabb,s.displacement);
- }
- s = n;
- }
- }
- removeShape(shape) {
- let prev = shape._prev;
- let next = shape._next;
- if(prev != null) {
- prev._next = next;
- }
- if(next != null) {
- next._prev = prev;
- }
- if(shape == this._shapeList) {
- this._shapeList = this._shapeList._next;
- }
- if(shape == this._shapeListLast) {
- this._shapeListLast = this._shapeListLast._prev;
- }
- shape._next = null;
- shape._prev = null;
- this._numShapes--;
- shape._rigidBody = null;
- if(this._world != null) {
- let _this = this._world;
- _this._broadPhase.destroyProxy(shape._proxy);
- shape._proxy = null;
- shape._id = -1;
- let cl = shape._rigidBody._contactLinkList;
- while(cl != null) {
- let n = cl._next;
- let c = cl._contact;
- if(c._s1 == shape || c._s2 == shape) {
- let _this1 = cl._other;
- _this1._sleeping = false;
- _this1._sleepTime = 0;
- let _this2 = _this._contactManager;
- let prev = c._prev;
- let next = c._next;
- if(prev != null) {
- prev._next = next;
- }
- if(next != null) {
- next._prev = prev;
- }
- if(c == _this2._contactList) {
- _this2._contactList = _this2._contactList._next;
- }
- if(c == _this2._contactListLast) {
- _this2._contactListLast = _this2._contactListLast._prev;
- }
- c._next = null;
- c._prev = null;
- if(c._touching) {
- let cc1 = c._s1._contactCallback;
- let cc2 = c._s2._contactCallback;
- if(cc1 == cc2) {
- cc2 = null;
- }
- if(cc1 != null) {
- cc1.endContact(c);
- }
- if(cc2 != null) {
- cc2.endContact(c);
- }
- }
- let prev1 = c._link1._prev;
- let next1 = c._link1._next;
- if(prev1 != null) {
- prev1._next = next1;
- }
- if(next1 != null) {
- next1._prev = prev1;
- }
- if(c._link1 == c._b1._contactLinkList) {
- c._b1._contactLinkList = c._b1._contactLinkList._next;
- }
- if(c._link1 == c._b1._contactLinkListLast) {
- c._b1._contactLinkListLast = c._b1._contactLinkListLast._prev;
- }
- c._link1._next = null;
- c._link1._prev = null;
- let prev2 = c._link2._prev;
- let next2 = c._link2._next;
- if(prev2 != null) {
- prev2._next = next2;
- }
- if(next2 != null) {
- next2._prev = prev2;
- }
- if(c._link2 == c._b2._contactLinkList) {
- c._b2._contactLinkList = c._b2._contactLinkList._next;
- }
- if(c._link2 == c._b2._contactLinkListLast) {
- c._b2._contactLinkListLast = c._b2._contactLinkListLast._prev;
- }
- c._link2._next = null;
- c._link2._prev = null;
- c._b1._numContactLinks--;
- c._b2._numContactLinks--;
- c._link1._other = null;
- c._link2._other = null;
- c._link1._contact = null;
- c._link2._contact = null;
- c._s1 = null;
- c._s2 = null;
- c._b1 = null;
- c._b2 = null;
- c._touching = false;
- c._cachedDetectorData._clear();
- c._manifold._clear();
- c._detector = null;
- let _this3 = c._contactConstraint;
- _this3._s1 = null;
- _this3._s2 = null;
- _this3._b1 = null;
- _this3._b2 = null;
- _this3._tf1 = null;
- _this3._tf2 = null;
- c._next = _this2._contactPool;
- _this2._contactPool = c;
- _this2._numContacts--;
- }
- cl = n;
- }
- _this._numShapes--;
- }
- this.updateMass();
- let s = this._shapeList;
- while(s != null) {
- let n = s._next;
- let tf1 = this._ptransform;
- let tf2 = this._transform;
- let dst = s._ptransform;
- let src1 = s._localTransform;
- let __tmp__00;
- let __tmp__01;
- let __tmp__02;
- let __tmp__10;
- let __tmp__11;
- let __tmp__12;
- let __tmp__20;
- let __tmp__21;
- let __tmp__22;
- __tmp__00 = tf1._rotation00 * src1._rotation00 + tf1._rotation01 * src1._rotation10 + tf1._rotation02 * src1._rotation20;
- __tmp__01 = tf1._rotation00 * src1._rotation01 + tf1._rotation01 * src1._rotation11 + tf1._rotation02 * src1._rotation21;
- __tmp__02 = tf1._rotation00 * src1._rotation02 + tf1._rotation01 * src1._rotation12 + tf1._rotation02 * src1._rotation22;
- __tmp__10 = tf1._rotation10 * src1._rotation00 + tf1._rotation11 * src1._rotation10 + tf1._rotation12 * src1._rotation20;
- __tmp__11 = tf1._rotation10 * src1._rotation01 + tf1._rotation11 * src1._rotation11 + tf1._rotation12 * src1._rotation21;
- __tmp__12 = tf1._rotation10 * src1._rotation02 + tf1._rotation11 * src1._rotation12 + tf1._rotation12 * src1._rotation22;
- __tmp__20 = tf1._rotation20 * src1._rotation00 + tf1._rotation21 * src1._rotation10 + tf1._rotation22 * src1._rotation20;
- __tmp__21 = tf1._rotation20 * src1._rotation01 + tf1._rotation21 * src1._rotation11 + tf1._rotation22 * src1._rotation21;
- __tmp__22 = tf1._rotation20 * src1._rotation02 + tf1._rotation21 * src1._rotation12 + tf1._rotation22 * src1._rotation22;
- dst._rotation00 = __tmp__00;
- dst._rotation01 = __tmp__01;
- dst._rotation02 = __tmp__02;
- dst._rotation10 = __tmp__10;
- dst._rotation11 = __tmp__11;
- dst._rotation12 = __tmp__12;
- dst._rotation20 = __tmp__20;
- dst._rotation21 = __tmp__21;
- dst._rotation22 = __tmp__22;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = tf1._rotation00 * src1._positionX + tf1._rotation01 * src1._positionY + tf1._rotation02 * src1._positionZ;
- __tmp__Y = tf1._rotation10 * src1._positionX + tf1._rotation11 * src1._positionY + tf1._rotation12 * src1._positionZ;
- __tmp__Z = tf1._rotation20 * src1._positionX + tf1._rotation21 * src1._positionY + tf1._rotation22 * src1._positionZ;
- dst._positionX = __tmp__X;
- dst._positionY = __tmp__Y;
- dst._positionZ = __tmp__Z;
- dst._positionX += tf1._positionX;
- dst._positionY += tf1._positionY;
- dst._positionZ += tf1._positionZ;
- let dst1 = s._transform;
- let src11 = s._localTransform;
- let __tmp__001;
- let __tmp__011;
- let __tmp__021;
- let __tmp__101;
- let __tmp__111;
- let __tmp__121;
- let __tmp__201;
- let __tmp__211;
- let __tmp__221;
- __tmp__001 = tf2._rotation00 * src11._rotation00 + tf2._rotation01 * src11._rotation10 + tf2._rotation02 * src11._rotation20;
- __tmp__011 = tf2._rotation00 * src11._rotation01 + tf2._rotation01 * src11._rotation11 + tf2._rotation02 * src11._rotation21;
- __tmp__021 = tf2._rotation00 * src11._rotation02 + tf2._rotation01 * src11._rotation12 + tf2._rotation02 * src11._rotation22;
- __tmp__101 = tf2._rotation10 * src11._rotation00 + tf2._rotation11 * src11._rotation10 + tf2._rotation12 * src11._rotation20;
- __tmp__111 = tf2._rotation10 * src11._rotation01 + tf2._rotation11 * src11._rotation11 + tf2._rotation12 * src11._rotation21;
- __tmp__121 = tf2._rotation10 * src11._rotation02 + tf2._rotation11 * src11._rotation12 + tf2._rotation12 * src11._rotation22;
- __tmp__201 = tf2._rotation20 * src11._rotation00 + tf2._rotation21 * src11._rotation10 + tf2._rotation22 * src11._rotation20;
- __tmp__211 = tf2._rotation20 * src11._rotation01 + tf2._rotation21 * src11._rotation11 + tf2._rotation22 * src11._rotation21;
- __tmp__221 = tf2._rotation20 * src11._rotation02 + tf2._rotation21 * src11._rotation12 + tf2._rotation22 * src11._rotation22;
- dst1._rotation00 = __tmp__001;
- dst1._rotation01 = __tmp__011;
- dst1._rotation02 = __tmp__021;
- dst1._rotation10 = __tmp__101;
- dst1._rotation11 = __tmp__111;
- dst1._rotation12 = __tmp__121;
- dst1._rotation20 = __tmp__201;
- dst1._rotation21 = __tmp__211;
- dst1._rotation22 = __tmp__221;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = tf2._rotation00 * src11._positionX + tf2._rotation01 * src11._positionY + tf2._rotation02 * src11._positionZ;
- __tmp__Y1 = tf2._rotation10 * src11._positionX + tf2._rotation11 * src11._positionY + tf2._rotation12 * src11._positionZ;
- __tmp__Z1 = tf2._rotation20 * src11._positionX + tf2._rotation21 * src11._positionY + tf2._rotation22 * src11._positionZ;
- dst1._positionX = __tmp__X1;
- dst1._positionY = __tmp__Y1;
- dst1._positionZ = __tmp__Z1;
- dst1._positionX += tf2._positionX;
- dst1._positionY += tf2._positionY;
- dst1._positionZ += tf2._positionZ;
- let minX;
- let minY;
- let minZ;
- let maxX;
- let maxY;
- let maxZ;
- s._geom._computeAabb(s._aabb,s._ptransform);
- minX = s._aabb._minX;
- minY = s._aabb._minY;
- minZ = s._aabb._minZ;
- maxX = s._aabb._maxX;
- maxY = s._aabb._maxY;
- maxZ = s._aabb._maxZ;
- s._geom._computeAabb(s._aabb,s._transform);
- s._aabb._minX = minX < s._aabb._minX ? minX : s._aabb._minX;
- s._aabb._minY = minY < s._aabb._minY ? minY : s._aabb._minY;
- s._aabb._minZ = minZ < s._aabb._minZ ? minZ : s._aabb._minZ;
- s._aabb._maxX = maxX > s._aabb._maxX ? maxX : s._aabb._maxX;
- s._aabb._maxY = maxY > s._aabb._maxY ? maxY : s._aabb._maxY;
- s._aabb._maxZ = maxZ > s._aabb._maxZ ? maxZ : s._aabb._maxZ;
- if(s._proxy != null) {
- let dX;
- let dY;
- let dZ;
- dX = s._transform._positionX - s._ptransform._positionX;
- dY = s._transform._positionY - s._ptransform._positionY;
- dZ = s._transform._positionZ - s._ptransform._positionZ;
- let v = s.displacement;
- v.x = dX;
- v.y = dY;
- v.z = dZ;
- s._rigidBody._world._broadPhase.moveProxy(s._proxy,s._aabb,s.displacement);
- }
- s = n;
- }
- }
- getType() {
- return this._type;
- }
- setType(type) {
- this._type = type;
- this.updateMass();
- }
- wakeUp() {
- this._sleeping = false;
- this._sleepTime = 0;
- }
- sleep() {
- this._sleeping = true;
- this._sleepTime = 0;
- }
- isSleeping() {
- return this._sleeping;
- }
- getSleepTime() {
- return this._sleepTime;
- }
- setAutoSleep(autoSleepEnabled) {
- this._autoSleep = autoSleepEnabled;
- this._sleeping = false;
- this._sleepTime = 0;
- }
- getLinearDamping() {
- return this._linearDamping;
- }
- setLinearDamping(damping) {
- this._linearDamping = damping;
- }
- getAngularDamping() {
- return this._angularDamping;
- }
- setAngularDamping(damping) {
- this._angularDamping = damping;
- }
- getPrev() {
- return this._prev;
- }
- getNext() {
- return this._next;
- }
- }
- oimo.dynamics.rigidbody.RigidBodyConfig = class oimo_dynamics_rigidbody_RigidBodyConfig {
- constructor() {
- this.position = new oimo.common.Vec3();
- this.rotation = new oimo.common.Mat3();
- this.linearVelocity = new oimo.common.Vec3();
- this.angularVelocity = new oimo.common.Vec3();
- this.type = 0;
- this.autoSleep = true;
- this.linearDamping = 0;
- this.angularDamping = 0;
- }
- }
- oimo.dynamics.rigidbody.RigidBodyType = class oimo_dynamics_rigidbody_RigidBodyType {
- }
- oimo.dynamics.rigidbody.Shape = class oimo_dynamics_rigidbody_Shape {
- constructor(config) {
- this._id = -1;
- this._localTransform = new oimo.common.Transform();
- this._ptransform = new oimo.common.Transform();
- this._transform = new oimo.common.Transform();
- let v = config.position;
- this._localTransform._positionX = v.x;
- this._localTransform._positionY = v.y;
- this._localTransform._positionZ = v.z;
- let m = config.rotation;
- this._localTransform._rotation00 = m.e00;
- this._localTransform._rotation01 = m.e01;
- this._localTransform._rotation02 = m.e02;
- this._localTransform._rotation10 = m.e10;
- this._localTransform._rotation11 = m.e11;
- this._localTransform._rotation12 = m.e12;
- this._localTransform._rotation20 = m.e20;
- this._localTransform._rotation21 = m.e21;
- this._localTransform._rotation22 = m.e22;
- let dst = this._ptransform;
- let src = this._localTransform;
- dst._positionX = src._positionX;
- dst._positionY = src._positionY;
- dst._positionZ = src._positionZ;
- dst._rotation00 = src._rotation00;
- dst._rotation01 = src._rotation01;
- dst._rotation02 = src._rotation02;
- dst._rotation10 = src._rotation10;
- dst._rotation11 = src._rotation11;
- dst._rotation12 = src._rotation12;
- dst._rotation20 = src._rotation20;
- dst._rotation21 = src._rotation21;
- dst._rotation22 = src._rotation22;
- let dst1 = this._transform;
- let src1 = this._localTransform;
- dst1._positionX = src1._positionX;
- dst1._positionY = src1._positionY;
- dst1._positionZ = src1._positionZ;
- dst1._rotation00 = src1._rotation00;
- dst1._rotation01 = src1._rotation01;
- dst1._rotation02 = src1._rotation02;
- dst1._rotation10 = src1._rotation10;
- dst1._rotation11 = src1._rotation11;
- dst1._rotation12 = src1._rotation12;
- dst1._rotation20 = src1._rotation20;
- dst1._rotation21 = src1._rotation21;
- dst1._rotation22 = src1._rotation22;
- this._restitution = config.restitution;
- this._friction = config.friction;
- this._density = config.density;
- this._geom = config.geometry;
- this._collisionGroup = config.collisionGroup;
- this._collisionMask = config.collisionMask;
- this._contactCallback = config.contactCallback;
- this._aabb = new oimo.collision.geometry.Aabb();
- this._proxy = null;
- this.displacement = new oimo.common.Vec3();
- }
- getFriction() {
- return this._friction;
- }
- setFriction(friction) {
- this._friction = friction;
- }
- getRestitution() {
- return this._restitution;
- }
- setRestitution(restitution) {
- this._restitution = restitution;
- }
- getLocalTransform() {
- let _this = this._localTransform;
- let tf = new oimo.common.Transform();
- tf._positionX = _this._positionX;
- tf._positionY = _this._positionY;
- tf._positionZ = _this._positionZ;
- tf._rotation00 = _this._rotation00;
- tf._rotation01 = _this._rotation01;
- tf._rotation02 = _this._rotation02;
- tf._rotation10 = _this._rotation10;
- tf._rotation11 = _this._rotation11;
- tf._rotation12 = _this._rotation12;
- tf._rotation20 = _this._rotation20;
- tf._rotation21 = _this._rotation21;
- tf._rotation22 = _this._rotation22;
- return tf;
- }
- getLocalTransformTo(transform) {
- let transform1 = this._localTransform;
- transform._positionX = transform1._positionX;
- transform._positionY = transform1._positionY;
- transform._positionZ = transform1._positionZ;
- transform._rotation00 = transform1._rotation00;
- transform._rotation01 = transform1._rotation01;
- transform._rotation02 = transform1._rotation02;
- transform._rotation10 = transform1._rotation10;
- transform._rotation11 = transform1._rotation11;
- transform._rotation12 = transform1._rotation12;
- transform._rotation20 = transform1._rotation20;
- transform._rotation21 = transform1._rotation21;
- transform._rotation22 = transform1._rotation22;
- }
- getTransform() {
- let _this = this._transform;
- let tf = new oimo.common.Transform();
- tf._positionX = _this._positionX;
- tf._positionY = _this._positionY;
- tf._positionZ = _this._positionZ;
- tf._rotation00 = _this._rotation00;
- tf._rotation01 = _this._rotation01;
- tf._rotation02 = _this._rotation02;
- tf._rotation10 = _this._rotation10;
- tf._rotation11 = _this._rotation11;
- tf._rotation12 = _this._rotation12;
- tf._rotation20 = _this._rotation20;
- tf._rotation21 = _this._rotation21;
- tf._rotation22 = _this._rotation22;
- return tf;
- }
- getTransformTo(transform) {
- let transform1 = this._transform;
- transform._positionX = transform1._positionX;
- transform._positionY = transform1._positionY;
- transform._positionZ = transform1._positionZ;
- transform._rotation00 = transform1._rotation00;
- transform._rotation01 = transform1._rotation01;
- transform._rotation02 = transform1._rotation02;
- transform._rotation10 = transform1._rotation10;
- transform._rotation11 = transform1._rotation11;
- transform._rotation12 = transform1._rotation12;
- transform._rotation20 = transform1._rotation20;
- transform._rotation21 = transform1._rotation21;
- transform._rotation22 = transform1._rotation22;
- }
- setLocalTransform(transform) {
- let _this = this._localTransform;
- _this._positionX = transform._positionX;
- _this._positionY = transform._positionY;
- _this._positionZ = transform._positionZ;
- _this._rotation00 = transform._rotation00;
- _this._rotation01 = transform._rotation01;
- _this._rotation02 = transform._rotation02;
- _this._rotation10 = transform._rotation10;
- _this._rotation11 = transform._rotation11;
- _this._rotation12 = transform._rotation12;
- _this._rotation20 = transform._rotation20;
- _this._rotation21 = transform._rotation21;
- _this._rotation22 = transform._rotation22;
- if(this._rigidBody != null) {
- let _this = this._rigidBody;
- _this.updateMass();
- let s = _this._shapeList;
- while(s != null) {
- let n = s._next;
- let tf1 = _this._ptransform;
- let tf2 = _this._transform;
- let dst = s._ptransform;
- let src1 = s._localTransform;
- let __tmp__00;
- let __tmp__01;
- let __tmp__02;
- let __tmp__10;
- let __tmp__11;
- let __tmp__12;
- let __tmp__20;
- let __tmp__21;
- let __tmp__22;
- __tmp__00 = tf1._rotation00 * src1._rotation00 + tf1._rotation01 * src1._rotation10 + tf1._rotation02 * src1._rotation20;
- __tmp__01 = tf1._rotation00 * src1._rotation01 + tf1._rotation01 * src1._rotation11 + tf1._rotation02 * src1._rotation21;
- __tmp__02 = tf1._rotation00 * src1._rotation02 + tf1._rotation01 * src1._rotation12 + tf1._rotation02 * src1._rotation22;
- __tmp__10 = tf1._rotation10 * src1._rotation00 + tf1._rotation11 * src1._rotation10 + tf1._rotation12 * src1._rotation20;
- __tmp__11 = tf1._rotation10 * src1._rotation01 + tf1._rotation11 * src1._rotation11 + tf1._rotation12 * src1._rotation21;
- __tmp__12 = tf1._rotation10 * src1._rotation02 + tf1._rotation11 * src1._rotation12 + tf1._rotation12 * src1._rotation22;
- __tmp__20 = tf1._rotation20 * src1._rotation00 + tf1._rotation21 * src1._rotation10 + tf1._rotation22 * src1._rotation20;
- __tmp__21 = tf1._rotation20 * src1._rotation01 + tf1._rotation21 * src1._rotation11 + tf1._rotation22 * src1._rotation21;
- __tmp__22 = tf1._rotation20 * src1._rotation02 + tf1._rotation21 * src1._rotation12 + tf1._rotation22 * src1._rotation22;
- dst._rotation00 = __tmp__00;
- dst._rotation01 = __tmp__01;
- dst._rotation02 = __tmp__02;
- dst._rotation10 = __tmp__10;
- dst._rotation11 = __tmp__11;
- dst._rotation12 = __tmp__12;
- dst._rotation20 = __tmp__20;
- dst._rotation21 = __tmp__21;
- dst._rotation22 = __tmp__22;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = tf1._rotation00 * src1._positionX + tf1._rotation01 * src1._positionY + tf1._rotation02 * src1._positionZ;
- __tmp__Y = tf1._rotation10 * src1._positionX + tf1._rotation11 * src1._positionY + tf1._rotation12 * src1._positionZ;
- __tmp__Z = tf1._rotation20 * src1._positionX + tf1._rotation21 * src1._positionY + tf1._rotation22 * src1._positionZ;
- dst._positionX = __tmp__X;
- dst._positionY = __tmp__Y;
- dst._positionZ = __tmp__Z;
- dst._positionX += tf1._positionX;
- dst._positionY += tf1._positionY;
- dst._positionZ += tf1._positionZ;
- let dst1 = s._transform;
- let src11 = s._localTransform;
- let __tmp__001;
- let __tmp__011;
- let __tmp__021;
- let __tmp__101;
- let __tmp__111;
- let __tmp__121;
- let __tmp__201;
- let __tmp__211;
- let __tmp__221;
- __tmp__001 = tf2._rotation00 * src11._rotation00 + tf2._rotation01 * src11._rotation10 + tf2._rotation02 * src11._rotation20;
- __tmp__011 = tf2._rotation00 * src11._rotation01 + tf2._rotation01 * src11._rotation11 + tf2._rotation02 * src11._rotation21;
- __tmp__021 = tf2._rotation00 * src11._rotation02 + tf2._rotation01 * src11._rotation12 + tf2._rotation02 * src11._rotation22;
- __tmp__101 = tf2._rotation10 * src11._rotation00 + tf2._rotation11 * src11._rotation10 + tf2._rotation12 * src11._rotation20;
- __tmp__111 = tf2._rotation10 * src11._rotation01 + tf2._rotation11 * src11._rotation11 + tf2._rotation12 * src11._rotation21;
- __tmp__121 = tf2._rotation10 * src11._rotation02 + tf2._rotation11 * src11._rotation12 + tf2._rotation12 * src11._rotation22;
- __tmp__201 = tf2._rotation20 * src11._rotation00 + tf2._rotation21 * src11._rotation10 + tf2._rotation22 * src11._rotation20;
- __tmp__211 = tf2._rotation20 * src11._rotation01 + tf2._rotation21 * src11._rotation11 + tf2._rotation22 * src11._rotation21;
- __tmp__221 = tf2._rotation20 * src11._rotation02 + tf2._rotation21 * src11._rotation12 + tf2._rotation22 * src11._rotation22;
- dst1._rotation00 = __tmp__001;
- dst1._rotation01 = __tmp__011;
- dst1._rotation02 = __tmp__021;
- dst1._rotation10 = __tmp__101;
- dst1._rotation11 = __tmp__111;
- dst1._rotation12 = __tmp__121;
- dst1._rotation20 = __tmp__201;
- dst1._rotation21 = __tmp__211;
- dst1._rotation22 = __tmp__221;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = tf2._rotation00 * src11._positionX + tf2._rotation01 * src11._positionY + tf2._rotation02 * src11._positionZ;
- __tmp__Y1 = tf2._rotation10 * src11._positionX + tf2._rotation11 * src11._positionY + tf2._rotation12 * src11._positionZ;
- __tmp__Z1 = tf2._rotation20 * src11._positionX + tf2._rotation21 * src11._positionY + tf2._rotation22 * src11._positionZ;
- dst1._positionX = __tmp__X1;
- dst1._positionY = __tmp__Y1;
- dst1._positionZ = __tmp__Z1;
- dst1._positionX += tf2._positionX;
- dst1._positionY += tf2._positionY;
- dst1._positionZ += tf2._positionZ;
- let minX;
- let minY;
- let minZ;
- let maxX;
- let maxY;
- let maxZ;
- s._geom._computeAabb(s._aabb,s._ptransform);
- minX = s._aabb._minX;
- minY = s._aabb._minY;
- minZ = s._aabb._minZ;
- maxX = s._aabb._maxX;
- maxY = s._aabb._maxY;
- maxZ = s._aabb._maxZ;
- s._geom._computeAabb(s._aabb,s._transform);
- s._aabb._minX = minX < s._aabb._minX ? minX : s._aabb._minX;
- s._aabb._minY = minY < s._aabb._minY ? minY : s._aabb._minY;
- s._aabb._minZ = minZ < s._aabb._minZ ? minZ : s._aabb._minZ;
- s._aabb._maxX = maxX > s._aabb._maxX ? maxX : s._aabb._maxX;
- s._aabb._maxY = maxY > s._aabb._maxY ? maxY : s._aabb._maxY;
- s._aabb._maxZ = maxZ > s._aabb._maxZ ? maxZ : s._aabb._maxZ;
- if(s._proxy != null) {
- let dX;
- let dY;
- let dZ;
- dX = s._transform._positionX - s._ptransform._positionX;
- dY = s._transform._positionY - s._ptransform._positionY;
- dZ = s._transform._positionZ - s._ptransform._positionZ;
- let v = s.displacement;
- v.x = dX;
- v.y = dY;
- v.z = dZ;
- s._rigidBody._world._broadPhase.moveProxy(s._proxy,s._aabb,s.displacement);
- }
- s = n;
- }
- }
- }
- getDensity() {
- return this._density;
- }
- setDensity(density) {
- this._density = density;
- if(this._rigidBody != null) {
- let _this = this._rigidBody;
- _this.updateMass();
- let s = _this._shapeList;
- while(s != null) {
- let n = s._next;
- let tf1 = _this._ptransform;
- let tf2 = _this._transform;
- let dst = s._ptransform;
- let src1 = s._localTransform;
- let __tmp__00;
- let __tmp__01;
- let __tmp__02;
- let __tmp__10;
- let __tmp__11;
- let __tmp__12;
- let __tmp__20;
- let __tmp__21;
- let __tmp__22;
- __tmp__00 = tf1._rotation00 * src1._rotation00 + tf1._rotation01 * src1._rotation10 + tf1._rotation02 * src1._rotation20;
- __tmp__01 = tf1._rotation00 * src1._rotation01 + tf1._rotation01 * src1._rotation11 + tf1._rotation02 * src1._rotation21;
- __tmp__02 = tf1._rotation00 * src1._rotation02 + tf1._rotation01 * src1._rotation12 + tf1._rotation02 * src1._rotation22;
- __tmp__10 = tf1._rotation10 * src1._rotation00 + tf1._rotation11 * src1._rotation10 + tf1._rotation12 * src1._rotation20;
- __tmp__11 = tf1._rotation10 * src1._rotation01 + tf1._rotation11 * src1._rotation11 + tf1._rotation12 * src1._rotation21;
- __tmp__12 = tf1._rotation10 * src1._rotation02 + tf1._rotation11 * src1._rotation12 + tf1._rotation12 * src1._rotation22;
- __tmp__20 = tf1._rotation20 * src1._rotation00 + tf1._rotation21 * src1._rotation10 + tf1._rotation22 * src1._rotation20;
- __tmp__21 = tf1._rotation20 * src1._rotation01 + tf1._rotation21 * src1._rotation11 + tf1._rotation22 * src1._rotation21;
- __tmp__22 = tf1._rotation20 * src1._rotation02 + tf1._rotation21 * src1._rotation12 + tf1._rotation22 * src1._rotation22;
- dst._rotation00 = __tmp__00;
- dst._rotation01 = __tmp__01;
- dst._rotation02 = __tmp__02;
- dst._rotation10 = __tmp__10;
- dst._rotation11 = __tmp__11;
- dst._rotation12 = __tmp__12;
- dst._rotation20 = __tmp__20;
- dst._rotation21 = __tmp__21;
- dst._rotation22 = __tmp__22;
- let __tmp__X;
- let __tmp__Y;
- let __tmp__Z;
- __tmp__X = tf1._rotation00 * src1._positionX + tf1._rotation01 * src1._positionY + tf1._rotation02 * src1._positionZ;
- __tmp__Y = tf1._rotation10 * src1._positionX + tf1._rotation11 * src1._positionY + tf1._rotation12 * src1._positionZ;
- __tmp__Z = tf1._rotation20 * src1._positionX + tf1._rotation21 * src1._positionY + tf1._rotation22 * src1._positionZ;
- dst._positionX = __tmp__X;
- dst._positionY = __tmp__Y;
- dst._positionZ = __tmp__Z;
- dst._positionX += tf1._positionX;
- dst._positionY += tf1._positionY;
- dst._positionZ += tf1._positionZ;
- let dst1 = s._transform;
- let src11 = s._localTransform;
- let __tmp__001;
- let __tmp__011;
- let __tmp__021;
- let __tmp__101;
- let __tmp__111;
- let __tmp__121;
- let __tmp__201;
- let __tmp__211;
- let __tmp__221;
- __tmp__001 = tf2._rotation00 * src11._rotation00 + tf2._rotation01 * src11._rotation10 + tf2._rotation02 * src11._rotation20;
- __tmp__011 = tf2._rotation00 * src11._rotation01 + tf2._rotation01 * src11._rotation11 + tf2._rotation02 * src11._rotation21;
- __tmp__021 = tf2._rotation00 * src11._rotation02 + tf2._rotation01 * src11._rotation12 + tf2._rotation02 * src11._rotation22;
- __tmp__101 = tf2._rotation10 * src11._rotation00 + tf2._rotation11 * src11._rotation10 + tf2._rotation12 * src11._rotation20;
- __tmp__111 = tf2._rotation10 * src11._rotation01 + tf2._rotation11 * src11._rotation11 + tf2._rotation12 * src11._rotation21;
- __tmp__121 = tf2._rotation10 * src11._rotation02 + tf2._rotation11 * src11._rotation12 + tf2._rotation12 * src11._rotation22;
- __tmp__201 = tf2._rotation20 * src11._rotation00 + tf2._rotation21 * src11._rotation10 + tf2._rotation22 * src11._rotation20;
- __tmp__211 = tf2._rotation20 * src11._rotation01 + tf2._rotation21 * src11._rotation11 + tf2._rotation22 * src11._rotation21;
- __tmp__221 = tf2._rotation20 * src11._rotation02 + tf2._rotation21 * src11._rotation12 + tf2._rotation22 * src11._rotation22;
- dst1._rotation00 = __tmp__001;
- dst1._rotation01 = __tmp__011;
- dst1._rotation02 = __tmp__021;
- dst1._rotation10 = __tmp__101;
- dst1._rotation11 = __tmp__111;
- dst1._rotation12 = __tmp__121;
- dst1._rotation20 = __tmp__201;
- dst1._rotation21 = __tmp__211;
- dst1._rotation22 = __tmp__221;
- let __tmp__X1;
- let __tmp__Y1;
- let __tmp__Z1;
- __tmp__X1 = tf2._rotation00 * src11._positionX + tf2._rotation01 * src11._positionY + tf2._rotation02 * src11._positionZ;
- __tmp__Y1 = tf2._rotation10 * src11._positionX + tf2._rotation11 * src11._positionY + tf2._rotation12 * src11._positionZ;
- __tmp__Z1 = tf2._rotation20 * src11._positionX + tf2._rotation21 * src11._positionY + tf2._rotation22 * src11._positionZ;
- dst1._positionX = __tmp__X1;
- dst1._positionY = __tmp__Y1;
- dst1._positionZ = __tmp__Z1;
- dst1._positionX += tf2._positionX;
- dst1._positionY += tf2._positionY;
- dst1._positionZ += tf2._positionZ;
- let minX;
- let minY;
- let minZ;
- let maxX;
- let maxY;
- let maxZ;
- s._geom._computeAabb(s._aabb,s._ptransform);
- minX = s._aabb._minX;
- minY = s._aabb._minY;
- minZ = s._aabb._minZ;
- maxX = s._aabb._maxX;
- maxY = s._aabb._maxY;
- maxZ = s._aabb._maxZ;
- s._geom._computeAabb(s._aabb,s._transform);
- s._aabb._minX = minX < s._aabb._minX ? minX : s._aabb._minX;
- s._aabb._minY = minY < s._aabb._minY ? minY : s._aabb._minY;
- s._aabb._minZ = minZ < s._aabb._minZ ? minZ : s._aabb._minZ;
- s._aabb._maxX = maxX > s._aabb._maxX ? maxX : s._aabb._maxX;
- s._aabb._maxY = maxY > s._aabb._maxY ? maxY : s._aabb._maxY;
- s._aabb._maxZ = maxZ > s._aabb._maxZ ? maxZ : s._aabb._maxZ;
- if(s._proxy != null) {
- let dX;
- let dY;
- let dZ;
- dX = s._transform._positionX - s._ptransform._positionX;
- dY = s._transform._positionY - s._ptransform._positionY;
- dZ = s._transform._positionZ - s._ptransform._positionZ;
- let v = s.displacement;
- v.x = dX;
- v.y = dY;
- v.z = dZ;
- s._rigidBody._world._broadPhase.moveProxy(s._proxy,s._aabb,s.displacement);
- }
- s = n;
- }
- }
- }
- getAabb() {
- return this._aabb.clone();
- }
- getAabbTo(aabb) {
- aabb.copyFrom(this._aabb);
- }
- getGeometry() {
- return this._geom;
- }
- getRigidBody() {
- return this._rigidBody;
- }
- getCollisionGroup() {
- return this._collisionGroup;
- }
- setCollisionGroup(collisionGroup) {
- this._collisionGroup = collisionGroup;
- }
- getCollisionMask() {
- return this._collisionMask;
- }
- setCollisionMask(collisionMask) {
- this._collisionMask = collisionMask;
- }
- getContactCallback() {
- return this._contactCallback;
- }
- setContactCallback(callback) {
- this._contactCallback = callback;
- }
- getPrev() {
- return this._prev;
- }
- getNext() {
- return this._next;
- }
- }
- oimo.dynamics.rigidbody.ShapeConfig = class oimo_dynamics_rigidbody_ShapeConfig {
- constructor() {
- this.position = new oimo.common.Vec3();
- this.rotation = new oimo.common.Mat3();
- this.friction = oimo.common.Setting.defaultFriction;
- this.restitution = oimo.common.Setting.defaultRestitution;
- this.density = oimo.common.Setting.defaultDensity;
- this.collisionGroup = oimo.common.Setting.defaultCollisionGroup;
- this.collisionMask = oimo.common.Setting.defaultCollisionMask;
- this.geometry = null;
- this.contactCallback = null;
- }
- }
- if(!oimo.m) oimo.m = {};
- oimo.m.M = class oimo_m_M {
- }
- oimo.collision.broadphase.BroadPhaseType._BRUTE_FORCE = 1;
- oimo.collision.broadphase.BroadPhaseType._BVH = 2;
- oimo.collision.broadphase.BroadPhaseType.BRUTE_FORCE = 1;
- oimo.collision.broadphase.BroadPhaseType.BVH = 2;
- oimo.collision.broadphase.bvh.BvhInsertionStrategy.SIMPLE = 0;
- oimo.collision.broadphase.bvh.BvhInsertionStrategy.MINIMIZE_SURFACE_AREA = 1;
- oimo.collision.geometry.GeometryType._SPHERE = 0;
- oimo.collision.geometry.GeometryType._BOX = 1;
- oimo.collision.geometry.GeometryType._CYLINDER = 2;
- oimo.collision.geometry.GeometryType._CONE = 3;
- oimo.collision.geometry.GeometryType._CAPSULE = 4;
- oimo.collision.geometry.GeometryType._CONVEX_HULL = 5;
- oimo.collision.geometry.GeometryType._CONVEX_MIN = 0;
- oimo.collision.geometry.GeometryType._CONVEX_MAX = 5;
- oimo.collision.geometry.GeometryType.SPHERE = 0;
- oimo.collision.geometry.GeometryType.BOX = 1;
- oimo.collision.geometry.GeometryType.CYLINDER = 2;
- oimo.collision.geometry.GeometryType.CONE = 3;
- oimo.collision.geometry.GeometryType.CAPSULE = 4;
- oimo.collision.geometry.GeometryType.CONVEX_HULL = 5;
- oimo.collision.narrowphase.detector.BoxBoxDetector.EDGE_BIAS_MULT = 1.0;
- oimo.collision.narrowphase.detector.gjkepa.EpaPolyhedronState.OK = 0;
- oimo.collision.narrowphase.detector.gjkepa.EpaPolyhedronState.INVALID_TRIANGLE = 1;
- oimo.collision.narrowphase.detector.gjkepa.EpaPolyhedronState.NO_ADJACENT_PAIR_INDEX = 2;
- oimo.collision.narrowphase.detector.gjkepa.EpaPolyhedronState.NO_ADJACENT_TRIANGLE = 3;
- oimo.collision.narrowphase.detector.gjkepa.EpaPolyhedronState.EDGE_LOOP_BROKEN = 4;
- oimo.collision.narrowphase.detector.gjkepa.EpaPolyhedronState.NO_OUTER_TRIANGLE = 5;
- oimo.collision.narrowphase.detector.gjkepa.EpaPolyhedronState.TRIANGLE_INVISIBLE = 6;
- oimo.collision.narrowphase.detector.gjkepa.EpaTriangle.count = 0;
- oimo.common.Vec3.numCreations = 0;
- oimo.common.Setting.defaultFriction = 0.2;
- oimo.common.Setting.defaultRestitution = 0.2;
- oimo.common.Setting.defaultDensity = 1;
- oimo.common.Setting.defaultCollisionGroup = 1;
- oimo.common.Setting.defaultCollisionMask = 1;
- oimo.common.Setting.maxTranslationPerStep = 20;
- oimo.common.Setting.maxRotationPerStep = 3.14159265358979;
- oimo.common.Setting.bvhProxyPadding = 0.1;
- oimo.common.Setting.bvhIncrementalCollisionThreshold = 0.45;
- oimo.common.Setting.defaultGJKMargin = 0.05;
- oimo.common.Setting.enableGJKCaching = true;
- oimo.common.Setting.maxEPAVertices = 128;
- oimo.common.Setting.maxEPAPolyhedronFaces = 128;
- oimo.common.Setting.contactEnableBounceThreshold = 0.5;
- oimo.common.Setting.velocityBaumgarte = 0.2;
- oimo.common.Setting.positionSplitImpulseBaumgarte = 0.4;
- oimo.common.Setting.positionNgsBaumgarte = 1.0;
- oimo.common.Setting.contactUseAlternativePositionCorrectionAlgorithmDepthThreshold = 0.05;
- oimo.common.Setting.defaultContactPositionCorrectionAlgorithm = 0;
- oimo.common.Setting.alternativeContactPositionCorrectionAlgorithm = 1;
- oimo.common.Setting.contactPersistenceThreshold = 0.05;
- oimo.common.Setting.maxManifoldPoints = 4;
- oimo.common.Setting.defaultJointConstraintSolverType = 0;
- oimo.common.Setting.defaultJointPositionCorrectionAlgorithm = 0;
- oimo.common.Setting.jointWarmStartingFactorForBaungarte = 0.8;
- oimo.common.Setting.jointWarmStartingFactor = 0.95;
- oimo.common.Setting.minSpringDamperDampingRatio = 1e-6;
- oimo.common.Setting.minRagdollMaxSwingAngle = 1e-6;
- oimo.common.Setting.maxJacobianRows = 6;
- oimo.common.Setting.directMlcpSolverEps = 1e-9;
- oimo.common.Setting.islandInitialRigidBodyArraySize = 128;
- oimo.common.Setting.islandInitialConstraintArraySize = 128;
- oimo.common.Setting.sleepingVelocityThreshold = 0.2;
- oimo.common.Setting.sleepingAngularVelocityThreshold = 0.5;
- oimo.common.Setting.sleepingTimeThreshold = 1.0;
- oimo.common.Setting.disableSleeping = false;
- oimo.common.Setting.linearSlop = 0.005;
- oimo.common.Setting.angularSlop = 0.017453292519943278;
- oimo.collision.narrowphase.detector.gjkepa.GjkEpa.instance = new oimo.collision.narrowphase.detector.gjkepa.GjkEpa();
- oimo.collision.narrowphase.detector.gjkepa.GjkEpaResultState._SUCCEEDED = 0;
- oimo.collision.narrowphase.detector.gjkepa.GjkEpaResultState._GJK_FAILED_TO_MAKE_TETRAHEDRON = 1;
- oimo.collision.narrowphase.detector.gjkepa.GjkEpaResultState._GJK_DID_NOT_CONVERGE = 2;
- oimo.collision.narrowphase.detector.gjkepa.GjkEpaResultState._EPA_FAILED_TO_INIT = 257;
- oimo.collision.narrowphase.detector.gjkepa.GjkEpaResultState._EPA_FAILED_TO_ADD_VERTEX = 258;
- oimo.collision.narrowphase.detector.gjkepa.GjkEpaResultState._EPA_DID_NOT_CONVERGE = 259;
- oimo.collision.narrowphase.detector.gjkepa.GjkEpaResultState.SUCCEEDED = 0;
- oimo.collision.narrowphase.detector.gjkepa.GjkEpaResultState.GJK_FAILED_TO_MAKE_TETRAHEDRON = 1;
- oimo.collision.narrowphase.detector.gjkepa.GjkEpaResultState.GJK_DID_NOT_CONVERGE = 2;
- oimo.collision.narrowphase.detector.gjkepa.GjkEpaResultState.EPA_FAILED_TO_INIT = 257;
- oimo.collision.narrowphase.detector.gjkepa.GjkEpaResultState.EPA_FAILED_TO_ADD_VERTEX = 258;
- oimo.collision.narrowphase.detector.gjkepa.GjkEpaResultState.EPA_DID_NOT_CONVERGE = 259;
- oimo.common.Mat3.numCreations = 0;
- oimo.common.Mat4.numCreations = 0;
- oimo.common.MathUtil.POSITIVE_INFINITY = 1e65536;
- oimo.common.MathUtil.NEGATIVE_INFINITY = -1e65536;
- oimo.common.MathUtil.PI = 3.14159265358979;
- oimo.common.MathUtil.TWO_PI = 6.28318530717958;
- oimo.common.MathUtil.HALF_PI = 1.570796326794895;
- oimo.common.MathUtil.TO_RADIANS = 0.017453292519943278;
- oimo.common.MathUtil.TO_DEGREES = 57.29577951308238;
- oimo.common.Quat.numCreations = 0;
- oimo.dynamics.common.DebugDraw.SPHERE_PHI_DIVISION = 8;
- oimo.dynamics.common.DebugDraw.SPHERE_THETA_DIVISION = 4;
- oimo.dynamics.common.DebugDraw.CIRCLE_THETA_DIVISION = 8;
- oimo.dynamics.common.Performance.broadPhaseCollisionTime = 0;
- oimo.dynamics.common.Performance.narrowPhaseCollisionTime = 0;
- oimo.dynamics.common.Performance.dynamicsTime = 0;
- oimo.dynamics.common.Performance.totalTime = 0;
- oimo.dynamics.constraint.PositionCorrectionAlgorithm._BAUMGARTE = 0;
- oimo.dynamics.constraint.PositionCorrectionAlgorithm._SPLIT_IMPULSE = 1;
- oimo.dynamics.constraint.PositionCorrectionAlgorithm._NGS = 2;
- oimo.dynamics.constraint.PositionCorrectionAlgorithm.BAUMGARTE = 0;
- oimo.dynamics.constraint.PositionCorrectionAlgorithm.SPLIT_IMPULSE = 1;
- oimo.dynamics.constraint.PositionCorrectionAlgorithm.NGS = 2;
- oimo.dynamics.constraint.info.JacobianRow.BIT_LINEAR_SET = 1;
- oimo.dynamics.constraint.info.JacobianRow.BIT_ANGULAR_SET = 2;
- oimo.dynamics.constraint.joint.JointType._SPHERICAL = 0;
- oimo.dynamics.constraint.joint.JointType._REVOLUTE = 1;
- oimo.dynamics.constraint.joint.JointType._CYLINDRICAL = 2;
- oimo.dynamics.constraint.joint.JointType._PRISMATIC = 3;
- oimo.dynamics.constraint.joint.JointType._UNIVERSAL = 4;
- oimo.dynamics.constraint.joint.JointType._RAGDOLL = 5;
- oimo.dynamics.constraint.joint.JointType._GENERIC = 6;
- oimo.dynamics.constraint.joint.JointType.SPHERICAL = 0;
- oimo.dynamics.constraint.joint.JointType.REVOLUTE = 1;
- oimo.dynamics.constraint.joint.JointType.CYLINDRICAL = 2;
- oimo.dynamics.constraint.joint.JointType.PRISMATIC = 3;
- oimo.dynamics.constraint.joint.JointType.UNIVERSAL = 4;
- oimo.dynamics.constraint.joint.JointType.RAGDOLL = 5;
- oimo.dynamics.constraint.joint.JointType.GENERIC = 6;
- oimo.dynamics.constraint.solver.ConstraintSolverType._ITERATIVE = 0;
- oimo.dynamics.constraint.solver.ConstraintSolverType._DIRECT = 1;
- oimo.dynamics.constraint.solver.ConstraintSolverType.ITERATIVE = 0;
- oimo.dynamics.constraint.solver.ConstraintSolverType.DIRECT = 1;
- oimo.dynamics.rigidbody.RigidBodyType._DYNAMIC = 0;
- oimo.dynamics.rigidbody.RigidBodyType._STATIC = 1;
- oimo.dynamics.rigidbody.RigidBodyType._KINEMATIC = 2;
- oimo.dynamics.rigidbody.RigidBodyType.DYNAMIC = 0;
- oimo.dynamics.rigidbody.RigidBodyType.STATIC = 1;
- oimo.dynamics.rigidbody.RigidBodyType.KINEMATIC = 2;
- export {oimo};
|