| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375103761037710378103791038010381103821038310384103851038610387103881038910390103911039210393103941039510396103971039810399104001040110402104031040410405104061040710408104091041010411104121041310414104151041610417104181041910420104211042210423104241042510426104271042810429104301043110432104331043410435104361043710438104391044010441104421044310444104451044610447104481044910450104511045210453104541045510456104571045810459104601046110462104631046410465104661046710468104691047010471104721047310474104751047610477104781047910480104811048210483104841048510486104871048810489104901049110492104931049410495104961049710498104991050010501105021050310504105051050610507105081050910510105111051210513105141051510516105171051810519105201052110522105231052410525105261052710528105291053010531105321053310534105351053610537105381053910540105411054210543105441054510546105471054810549105501055110552105531055410555105561055710558105591056010561105621056310564105651056610567105681056910570105711057210573105741057510576105771057810579105801058110582105831058410585105861058710588105891059010591105921059310594105951059610597105981059910600106011060210603106041060510606106071060810609106101061110612106131061410615106161061710618106191062010621106221062310624106251062610627106281062910630106311063210633106341063510636106371063810639106401064110642106431064410645106461064710648106491065010651106521065310654106551065610657106581065910660106611066210663106641066510666106671066810669106701067110672106731067410675106761067710678106791068010681106821068310684106851068610687106881068910690106911069210693106941069510696106971069810699107001070110702107031070410705107061070710708107091071010711107121071310714107151071610717107181071910720107211072210723107241072510726107271072810729107301073110732107331073410735107361073710738107391074010741107421074310744107451074610747107481074910750107511075210753107541075510756107571075810759107601076110762107631076410765107661076710768107691077010771107721077310774107751077610777107781077910780107811078210783107841078510786107871078810789107901079110792107931079410795107961079710798107991080010801108021080310804108051080610807108081080910810108111081210813108141081510816108171081810819108201082110822108231082410825108261082710828108291083010831108321083310834108351083610837108381083910840108411084210843108441084510846108471084810849108501085110852108531085410855108561085710858108591086010861108621086310864108651086610867108681086910870108711087210873108741087510876108771087810879108801088110882108831088410885108861088710888108891089010891108921089310894108951089610897108981089910900109011090210903109041090510906109071090810909109101091110912109131091410915109161091710918109191092010921109221092310924109251092610927109281092910930109311093210933109341093510936109371093810939109401094110942109431094410945109461094710948109491095010951109521095310954109551095610957109581095910960109611096210963109641096510966109671096810969109701097110972109731097410975109761097710978109791098010981109821098310984109851098610987109881098910990109911099210993109941099510996109971099810999110001100111002110031100411005110061100711008110091101011011110121101311014110151101611017110181101911020110211102211023110241102511026110271102811029110301103111032110331103411035110361103711038110391104011041110421104311044110451104611047110481104911050110511105211053110541105511056110571105811059110601106111062110631106411065110661106711068110691107011071110721107311074110751107611077110781107911080110811108211083110841108511086110871108811089110901109111092110931109411095110961109711098110991110011101111021110311104111051110611107111081110911110111111111211113111141111511116111171111811119111201112111122111231112411125111261112711128111291113011131111321113311134111351113611137111381113911140111411114211143111441114511146111471114811149111501115111152111531115411155111561115711158111591116011161111621116311164111651116611167111681116911170111711117211173111741117511176111771117811179111801118111182111831118411185111861118711188111891119011191111921119311194111951119611197111981119911200112011120211203112041120511206112071120811209112101121111212112131121411215112161121711218112191122011221112221122311224112251122611227112281122911230112311123211233112341123511236112371123811239112401124111242112431124411245112461124711248112491125011251112521125311254112551125611257112581125911260112611126211263112641126511266112671126811269112701127111272112731127411275112761127711278112791128011281112821128311284112851128611287112881128911290112911129211293112941129511296112971129811299113001130111302113031130411305113061130711308113091131011311113121131311314113151131611317113181131911320113211132211323113241132511326113271132811329113301133111332113331133411335113361133711338113391134011341113421134311344113451134611347113481134911350113511135211353113541135511356113571135811359113601136111362113631136411365113661136711368113691137011371113721137311374113751137611377113781137911380113811138211383113841138511386113871138811389113901139111392113931139411395113961139711398113991140011401114021140311404114051140611407114081140911410114111141211413114141141511416114171141811419114201142111422114231142411425114261142711428114291143011431114321143311434114351143611437114381143911440114411144211443114441144511446114471144811449114501145111452114531145411455114561145711458114591146011461114621146311464114651146611467114681146911470114711147211473114741147511476114771147811479114801148111482114831148411485114861148711488114891149011491114921149311494114951149611497114981149911500115011150211503115041150511506115071150811509115101151111512115131151411515115161151711518115191152011521115221152311524115251152611527115281152911530115311153211533115341153511536115371153811539115401154111542115431154411545115461154711548115491155011551115521155311554115551155611557115581155911560115611156211563115641156511566115671156811569115701157111572115731157411575115761157711578115791158011581115821158311584115851158611587115881158911590115911159211593115941159511596115971159811599116001160111602116031160411605116061160711608116091161011611116121161311614116151161611617116181161911620116211162211623116241162511626116271162811629116301163111632116331163411635116361163711638116391164011641116421164311644116451164611647116481164911650116511165211653116541165511656116571165811659116601166111662116631166411665116661166711668116691167011671116721167311674116751167611677116781167911680116811168211683116841168511686116871168811689116901169111692116931169411695116961169711698116991170011701117021170311704117051170611707117081170911710117111171211713117141171511716117171171811719117201172111722117231172411725117261172711728117291173011731117321173311734117351173611737117381173911740117411174211743117441174511746117471174811749117501175111752117531175411755117561175711758117591176011761117621176311764117651176611767117681176911770117711177211773117741177511776117771177811779117801178111782117831178411785117861178711788117891179011791117921179311794117951179611797117981179911800118011180211803118041180511806118071180811809118101181111812118131181411815118161181711818118191182011821118221182311824118251182611827118281182911830118311183211833118341183511836118371183811839118401184111842118431184411845118461184711848118491185011851118521185311854118551185611857118581185911860118611186211863118641186511866118671186811869118701187111872118731187411875118761187711878118791188011881118821188311884118851188611887118881188911890118911189211893118941189511896118971189811899119001190111902119031190411905119061190711908119091191011911119121191311914119151191611917119181191911920119211192211923119241192511926119271192811929119301193111932119331193411935119361193711938119391194011941119421194311944119451194611947119481194911950119511195211953119541195511956119571195811959119601196111962119631196411965119661196711968119691197011971119721197311974119751197611977119781197911980119811198211983119841198511986119871198811989119901199111992119931199411995119961199711998119991200012001120021200312004120051200612007120081200912010120111201212013120141201512016120171201812019120201202112022120231202412025120261202712028120291203012031120321203312034120351203612037120381203912040120411204212043120441204512046120471204812049120501205112052120531205412055120561205712058120591206012061120621206312064120651206612067120681206912070120711207212073120741207512076120771207812079120801208112082120831208412085120861208712088120891209012091120921209312094120951209612097120981209912100121011210212103121041210512106121071210812109121101211112112121131211412115121161211712118121191212012121121221212312124121251212612127121281212912130121311213212133121341213512136121371213812139121401214112142121431214412145121461214712148121491215012151121521215312154121551215612157121581215912160121611216212163121641216512166121671216812169121701217112172121731217412175121761217712178121791218012181121821218312184121851218612187121881218912190121911219212193121941219512196121971219812199122001220112202122031220412205122061220712208122091221012211122121221312214122151221612217122181221912220122211222212223122241222512226122271222812229122301223112232122331223412235122361223712238122391224012241122421224312244122451224612247122481224912250122511225212253122541225512256122571225812259122601226112262122631226412265122661226712268122691227012271122721227312274122751227612277122781227912280122811228212283122841228512286122871228812289122901229112292122931229412295122961229712298122991230012301123021230312304123051230612307123081230912310123111231212313123141231512316123171231812319123201232112322123231232412325123261232712328123291233012331123321233312334123351233612337123381233912340123411234212343123441234512346123471234812349123501235112352123531235412355123561235712358123591236012361123621236312364123651236612367123681236912370123711237212373123741237512376123771237812379123801238112382123831238412385123861238712388123891239012391123921239312394123951239612397123981239912400124011240212403124041240512406124071240812409124101241112412124131241412415124161241712418124191242012421124221242312424124251242612427124281242912430124311243212433124341243512436124371243812439124401244112442124431244412445124461244712448124491245012451124521245312454124551245612457124581245912460124611246212463124641246512466124671246812469124701247112472124731247412475124761247712478124791248012481124821248312484124851248612487124881248912490124911249212493124941249512496124971249812499125001250112502125031250412505125061250712508125091251012511125121251312514125151251612517125181251912520125211252212523125241252512526125271252812529125301253112532125331253412535125361253712538125391254012541125421254312544125451254612547125481254912550125511255212553125541255512556125571255812559125601256112562125631256412565125661256712568125691257012571125721257312574125751257612577125781257912580125811258212583125841258512586125871258812589125901259112592125931259412595125961259712598125991260012601126021260312604126051260612607126081260912610126111261212613126141261512616126171261812619126201262112622126231262412625126261262712628126291263012631126321263312634126351263612637126381263912640126411264212643126441264512646126471264812649126501265112652126531265412655126561265712658126591266012661126621266312664126651266612667126681266912670126711267212673126741267512676126771267812679126801268112682126831268412685126861268712688126891269012691126921269312694126951269612697126981269912700127011270212703127041270512706127071270812709127101271112712127131271412715127161271712718127191272012721127221272312724127251272612727127281272912730127311273212733127341273512736127371273812739127401274112742127431274412745127461274712748127491275012751127521275312754127551275612757127581275912760127611276212763127641276512766127671276812769127701277112772127731277412775127761277712778127791278012781127821278312784127851278612787127881278912790127911279212793127941279512796127971279812799128001280112802128031280412805128061280712808128091281012811128121281312814128151281612817128181281912820128211282212823128241282512826128271282812829128301283112832128331283412835128361283712838128391284012841128421284312844128451284612847128481284912850128511285212853128541285512856128571285812859128601286112862128631286412865128661286712868128691287012871128721287312874128751287612877128781287912880128811288212883128841288512886128871288812889128901289112892128931289412895128961289712898128991290012901129021290312904129051290612907129081290912910129111291212913129141291512916129171291812919129201292112922129231292412925129261292712928129291293012931129321293312934129351293612937129381293912940129411294212943129441294512946129471294812949129501295112952129531295412955129561295712958129591296012961129621296312964129651296612967129681296912970129711297212973129741297512976129771297812979129801298112982129831298412985129861298712988129891299012991129921299312994129951299612997129981299913000130011300213003130041300513006130071300813009130101301113012130131301413015130161301713018130191302013021130221302313024130251302613027130281302913030130311303213033130341303513036130371303813039130401304113042130431304413045130461304713048130491305013051130521305313054130551305613057130581305913060130611306213063130641306513066130671306813069130701307113072130731307413075130761307713078130791308013081130821308313084130851308613087130881308913090130911309213093130941309513096130971309813099131001310113102131031310413105131061310713108131091311013111131121311313114131151311613117131181311913120131211312213123131241312513126131271312813129131301313113132131331313413135131361313713138131391314013141131421314313144131451314613147131481314913150131511315213153131541315513156131571315813159131601316113162131631316413165131661316713168131691317013171131721317313174131751317613177131781317913180131811318213183131841318513186131871318813189131901319113192131931319413195131961319713198131991320013201132021320313204132051320613207132081320913210132111321213213132141321513216132171321813219132201322113222132231322413225132261322713228132291323013231132321323313234132351323613237132381323913240132411324213243132441324513246132471324813249132501325113252132531325413255132561325713258132591326013261132621326313264132651326613267132681326913270132711327213273132741327513276132771327813279132801328113282132831328413285132861328713288132891329013291132921329313294132951329613297132981329913300133011330213303133041330513306133071330813309133101331113312133131331413315133161331713318133191332013321133221332313324133251332613327133281332913330133311333213333133341333513336133371333813339133401334113342133431334413345133461334713348133491335013351133521335313354133551335613357133581335913360133611336213363133641336513366133671336813369133701337113372133731337413375133761337713378133791338013381133821338313384133851338613387133881338913390133911339213393133941339513396133971339813399134001340113402134031340413405134061340713408134091341013411134121341313414134151341613417134181341913420134211342213423134241342513426134271342813429134301343113432134331343413435134361343713438134391344013441134421344313444134451344613447134481344913450134511345213453134541345513456134571345813459134601346113462134631346413465134661346713468134691347013471134721347313474134751347613477134781347913480134811348213483134841348513486134871348813489134901349113492134931349413495134961349713498134991350013501135021350313504135051350613507135081350913510135111351213513135141351513516135171351813519135201352113522135231352413525135261352713528135291353013531135321353313534135351353613537135381353913540135411354213543135441354513546135471354813549135501355113552135531355413555135561355713558135591356013561135621356313564135651356613567135681356913570135711357213573135741357513576135771357813579135801358113582135831358413585135861358713588135891359013591135921359313594135951359613597135981359913600136011360213603136041360513606136071360813609136101361113612136131361413615136161361713618136191362013621136221362313624136251362613627136281362913630136311363213633136341363513636136371363813639136401364113642136431364413645136461364713648136491365013651136521365313654136551365613657136581365913660136611366213663136641366513666136671366813669136701367113672136731367413675136761367713678136791368013681136821368313684136851368613687136881368913690136911369213693136941369513696136971369813699137001370113702137031370413705137061370713708137091371013711137121371313714137151371613717137181371913720137211372213723137241372513726137271372813729137301373113732137331373413735137361373713738137391374013741137421374313744137451374613747137481374913750137511375213753137541375513756137571375813759137601376113762137631376413765137661376713768137691377013771137721377313774137751377613777137781377913780137811378213783137841378513786137871378813789137901379113792137931379413795137961379713798137991380013801138021380313804138051380613807138081380913810138111381213813138141381513816138171381813819138201382113822138231382413825138261382713828138291383013831138321383313834138351383613837138381383913840138411384213843138441384513846138471384813849138501385113852138531385413855138561385713858138591386013861138621386313864138651386613867138681386913870138711387213873138741387513876138771387813879138801388113882138831388413885138861388713888138891389013891138921389313894138951389613897138981389913900139011390213903139041390513906139071390813909139101391113912139131391413915139161391713918139191392013921139221392313924139251392613927139281392913930139311393213933139341393513936139371393813939139401394113942139431394413945139461394713948139491395013951139521395313954139551395613957139581395913960139611396213963139641396513966139671396813969139701397113972139731397413975139761397713978139791398013981139821398313984139851398613987139881398913990139911399213993139941399513996139971399813999140001400114002140031400414005140061400714008140091401014011140121401314014140151401614017140181401914020140211402214023140241402514026140271402814029140301403114032140331403414035140361403714038140391404014041140421404314044140451404614047140481404914050140511405214053140541405514056140571405814059140601406114062140631406414065140661406714068140691407014071140721407314074140751407614077140781407914080140811408214083140841408514086140871408814089140901409114092140931409414095140961409714098140991410014101141021410314104141051410614107141081410914110141111411214113141141411514116141171411814119141201412114122141231412414125141261412714128141291413014131141321413314134141351413614137141381413914140141411414214143141441414514146141471414814149141501415114152141531415414155141561415714158141591416014161141621416314164141651416614167141681416914170141711417214173141741417514176141771417814179141801418114182141831418414185141861418714188141891419014191141921419314194141951419614197141981419914200142011420214203142041420514206142071420814209142101421114212142131421414215142161421714218142191422014221142221422314224142251422614227142281422914230142311423214233142341423514236142371423814239142401424114242142431424414245142461424714248142491425014251142521425314254142551425614257142581425914260142611426214263142641426514266142671426814269142701427114272142731427414275142761427714278142791428014281142821428314284142851428614287142881428914290142911429214293142941429514296142971429814299143001430114302143031430414305143061430714308143091431014311143121431314314143151431614317143181431914320143211432214323143241432514326143271432814329143301433114332143331433414335143361433714338143391434014341143421434314344143451434614347143481434914350143511435214353143541435514356143571435814359143601436114362143631436414365143661436714368143691437014371143721437314374143751437614377143781437914380143811438214383143841438514386143871438814389143901439114392143931439414395143961439714398143991440014401144021440314404144051440614407144081440914410144111441214413144141441514416144171441814419144201442114422144231442414425144261442714428144291443014431144321443314434144351443614437144381443914440144411444214443144441444514446144471444814449144501445114452144531445414455144561445714458144591446014461144621446314464144651446614467144681446914470144711447214473144741447514476144771447814479144801448114482144831448414485144861448714488144891449014491144921449314494144951449614497144981449914500145011450214503145041450514506145071450814509145101451114512145131451414515145161451714518145191452014521145221452314524145251452614527145281452914530145311453214533145341453514536145371453814539145401454114542145431454414545145461454714548145491455014551145521455314554145551455614557145581455914560145611456214563145641456514566145671456814569145701457114572145731457414575145761457714578145791458014581145821458314584145851458614587145881458914590145911459214593145941459514596145971459814599146001460114602146031460414605146061460714608146091461014611146121461314614146151461614617146181461914620146211462214623146241462514626146271462814629146301463114632146331463414635146361463714638146391464014641146421464314644146451464614647146481464914650146511465214653146541465514656146571465814659146601466114662146631466414665146661466714668146691467014671146721467314674146751467614677146781467914680146811468214683146841468514686146871468814689146901469114692146931469414695146961469714698146991470014701147021470314704147051470614707147081470914710147111471214713147141471514716147171471814719147201472114722147231472414725147261472714728147291473014731147321473314734147351473614737147381473914740147411474214743147441474514746147471474814749147501475114752147531475414755147561475714758147591476014761147621476314764147651476614767147681476914770147711477214773147741477514776147771477814779147801478114782147831478414785147861478714788147891479014791147921479314794147951479614797147981479914800148011480214803148041480514806148071480814809148101481114812148131481414815148161481714818148191482014821148221482314824148251482614827148281482914830148311483214833148341483514836148371483814839148401484114842148431484414845148461484714848148491485014851148521485314854148551485614857148581485914860148611486214863148641486514866148671486814869148701487114872148731487414875148761487714878148791488014881148821488314884148851488614887148881488914890148911489214893148941489514896148971489814899149001490114902149031490414905149061490714908149091491014911149121491314914149151491614917149181491914920149211492214923149241492514926149271492814929149301493114932149331493414935149361493714938149391494014941149421494314944149451494614947149481494914950149511495214953149541495514956149571495814959149601496114962149631496414965149661496714968149691497014971149721497314974149751497614977149781497914980149811498214983149841498514986149871498814989149901499114992149931499414995149961499714998149991500015001150021500315004150051500615007150081500915010150111501215013150141501515016150171501815019150201502115022150231502415025150261502715028150291503015031150321503315034150351503615037150381503915040150411504215043150441504515046150471504815049150501505115052150531505415055150561505715058150591506015061150621506315064150651506615067150681506915070150711507215073150741507515076150771507815079150801508115082150831508415085150861508715088150891509015091150921509315094150951509615097150981509915100151011510215103151041510515106151071510815109151101511115112151131511415115151161511715118151191512015121151221512315124151251512615127151281512915130151311513215133151341513515136151371513815139151401514115142151431514415145151461514715148151491515015151151521515315154151551515615157151581515915160151611516215163151641516515166151671516815169151701517115172151731517415175151761517715178151791518015181151821518315184151851518615187151881518915190151911519215193151941519515196151971519815199152001520115202152031520415205152061520715208152091521015211152121521315214152151521615217152181521915220152211522215223152241522515226152271522815229152301523115232152331523415235152361523715238152391524015241152421524315244152451524615247152481524915250152511525215253152541525515256152571525815259152601526115262152631526415265152661526715268152691527015271152721527315274152751527615277152781527915280152811528215283152841528515286152871528815289152901529115292152931529415295152961529715298152991530015301153021530315304153051530615307153081530915310153111531215313153141531515316153171531815319153201532115322153231532415325153261532715328153291533015331153321533315334153351533615337153381533915340153411534215343153441534515346153471534815349153501535115352153531535415355153561535715358153591536015361153621536315364153651536615367153681536915370153711537215373153741537515376153771537815379153801538115382153831538415385153861538715388153891539015391153921539315394153951539615397153981539915400154011540215403154041540515406154071540815409154101541115412154131541415415154161541715418154191542015421154221542315424154251542615427154281542915430154311543215433154341543515436154371543815439154401544115442154431544415445154461544715448154491545015451154521545315454154551545615457154581545915460154611546215463154641546515466154671546815469154701547115472154731547415475154761547715478154791548015481154821548315484154851548615487154881548915490154911549215493154941549515496154971549815499155001550115502155031550415505155061550715508155091551015511155121551315514155151551615517155181551915520155211552215523155241552515526155271552815529155301553115532155331553415535155361553715538155391554015541155421554315544155451554615547155481554915550155511555215553155541555515556155571555815559155601556115562155631556415565155661556715568155691557015571155721557315574155751557615577155781557915580155811558215583155841558515586155871558815589155901559115592155931559415595155961559715598155991560015601156021560315604156051560615607156081560915610156111561215613156141561515616156171561815619156201562115622156231562415625156261562715628156291563015631156321563315634156351563615637156381563915640156411564215643156441564515646156471564815649156501565115652156531565415655156561565715658156591566015661156621566315664156651566615667156681566915670156711567215673156741567515676156771567815679156801568115682156831568415685156861568715688156891569015691156921569315694156951569615697156981569915700157011570215703157041570515706157071570815709157101571115712157131571415715157161571715718157191572015721157221572315724157251572615727157281572915730157311573215733157341573515736157371573815739157401574115742157431574415745157461574715748157491575015751157521575315754157551575615757157581575915760157611576215763157641576515766157671576815769157701577115772157731577415775157761577715778157791578015781157821578315784157851578615787157881578915790157911579215793157941579515796157971579815799158001580115802158031580415805158061580715808158091581015811158121581315814158151581615817158181581915820158211582215823158241582515826158271582815829158301583115832158331583415835158361583715838158391584015841158421584315844158451584615847158481584915850158511585215853158541585515856158571585815859158601586115862158631586415865158661586715868158691587015871158721587315874158751587615877158781587915880158811588215883158841588515886158871588815889158901589115892158931589415895158961589715898158991590015901159021590315904159051590615907159081590915910159111591215913159141591515916159171591815919159201592115922159231592415925159261592715928159291593015931159321593315934159351593615937159381593915940159411594215943159441594515946159471594815949159501595115952159531595415955159561595715958159591596015961159621596315964159651596615967159681596915970159711597215973159741597515976159771597815979159801598115982159831598415985159861598715988159891599015991159921599315994159951599615997159981599916000160011600216003160041600516006160071600816009160101601116012160131601416015160161601716018160191602016021160221602316024160251602616027160281602916030160311603216033160341603516036160371603816039160401604116042160431604416045160461604716048160491605016051160521605316054160551605616057160581605916060160611606216063160641606516066160671606816069160701607116072160731607416075160761607716078160791608016081160821608316084160851608616087160881608916090160911609216093160941609516096160971609816099161001610116102161031610416105161061610716108161091611016111161121611316114161151611616117161181611916120161211612216123161241612516126161271612816129161301613116132161331613416135161361613716138161391614016141161421614316144161451614616147161481614916150161511615216153161541615516156161571615816159161601616116162161631616416165161661616716168161691617016171161721617316174161751617616177161781617916180161811618216183161841618516186161871618816189161901619116192161931619416195161961619716198161991620016201162021620316204162051620616207162081620916210162111621216213162141621516216162171621816219162201622116222162231622416225162261622716228162291623016231162321623316234162351623616237162381623916240162411624216243162441624516246162471624816249162501625116252162531625416255162561625716258162591626016261162621626316264162651626616267162681626916270162711627216273162741627516276162771627816279162801628116282162831628416285162861628716288162891629016291162921629316294162951629616297162981629916300163011630216303163041630516306163071630816309163101631116312163131631416315163161631716318163191632016321163221632316324163251632616327163281632916330163311633216333163341633516336163371633816339163401634116342163431634416345163461634716348163491635016351163521635316354163551635616357163581635916360163611636216363163641636516366163671636816369163701637116372163731637416375163761637716378163791638016381163821638316384163851638616387163881638916390163911639216393163941639516396163971639816399164001640116402164031640416405164061640716408164091641016411164121641316414164151641616417164181641916420164211642216423164241642516426164271642816429164301643116432164331643416435164361643716438164391644016441164421644316444164451644616447164481644916450164511645216453164541645516456164571645816459164601646116462164631646416465164661646716468164691647016471164721647316474164751647616477164781647916480164811648216483164841648516486164871648816489164901649116492164931649416495164961649716498164991650016501165021650316504165051650616507165081650916510165111651216513165141651516516165171651816519165201652116522165231652416525165261652716528165291653016531165321653316534165351653616537165381653916540165411654216543165441654516546165471654816549165501655116552165531655416555165561655716558165591656016561165621656316564165651656616567165681656916570165711657216573165741657516576165771657816579165801658116582165831658416585165861658716588165891659016591165921659316594165951659616597165981659916600166011660216603166041660516606166071660816609166101661116612166131661416615166161661716618166191662016621166221662316624166251662616627166281662916630166311663216633166341663516636166371663816639166401664116642166431664416645166461664716648166491665016651166521665316654166551665616657166581665916660166611666216663166641666516666166671666816669166701667116672166731667416675166761667716678166791668016681166821668316684166851668616687166881668916690166911669216693166941669516696166971669816699167001670116702167031670416705167061670716708167091671016711167121671316714167151671616717167181671916720167211672216723167241672516726167271672816729167301673116732167331673416735167361673716738167391674016741167421674316744167451674616747167481674916750167511675216753167541675516756167571675816759167601676116762167631676416765167661676716768167691677016771167721677316774167751677616777167781677916780167811678216783167841678516786167871678816789167901679116792167931679416795167961679716798167991680016801168021680316804168051680616807168081680916810168111681216813168141681516816168171681816819168201682116822168231682416825168261682716828168291683016831168321683316834168351683616837168381683916840168411684216843168441684516846168471684816849168501685116852168531685416855168561685716858168591686016861168621686316864168651686616867168681686916870168711687216873168741687516876168771687816879168801688116882168831688416885168861688716888168891689016891168921689316894168951689616897168981689916900169011690216903169041690516906169071690816909169101691116912169131691416915169161691716918169191692016921169221692316924169251692616927169281692916930169311693216933169341693516936169371693816939169401694116942169431694416945169461694716948169491695016951169521695316954169551695616957169581695916960169611696216963169641696516966169671696816969169701697116972169731697416975169761697716978169791698016981169821698316984169851698616987169881698916990169911699216993169941699516996169971699816999170001700117002170031700417005170061700717008170091701017011170121701317014170151701617017170181701917020170211702217023170241702517026170271702817029170301703117032170331703417035170361703717038170391704017041170421704317044170451704617047170481704917050170511705217053170541705517056170571705817059170601706117062170631706417065170661706717068170691707017071170721707317074170751707617077170781707917080170811708217083170841708517086170871708817089170901709117092170931709417095170961709717098170991710017101171021710317104171051710617107171081710917110171111711217113171141711517116171171711817119171201712117122171231712417125171261712717128171291713017131171321713317134171351713617137171381713917140171411714217143171441714517146171471714817149171501715117152171531715417155171561715717158171591716017161171621716317164171651716617167171681716917170171711717217173171741717517176171771717817179171801718117182171831718417185171861718717188171891719017191171921719317194171951719617197171981719917200172011720217203172041720517206172071720817209172101721117212172131721417215172161721717218172191722017221172221722317224172251722617227172281722917230172311723217233172341723517236172371723817239172401724117242172431724417245172461724717248172491725017251172521725317254172551725617257172581725917260172611726217263172641726517266172671726817269172701727117272172731727417275172761727717278172791728017281172821728317284172851728617287172881728917290172911729217293172941729517296172971729817299173001730117302173031730417305173061730717308173091731017311173121731317314173151731617317173181731917320173211732217323173241732517326173271732817329173301733117332173331733417335173361733717338173391734017341173421734317344173451734617347173481734917350173511735217353173541735517356173571735817359173601736117362173631736417365173661736717368173691737017371173721737317374173751737617377173781737917380173811738217383173841738517386173871738817389173901739117392173931739417395173961739717398173991740017401174021740317404174051740617407174081740917410174111741217413174141741517416174171741817419174201742117422174231742417425174261742717428174291743017431174321743317434174351743617437174381743917440174411744217443174441744517446174471744817449174501745117452174531745417455174561745717458174591746017461174621746317464174651746617467174681746917470174711747217473174741747517476174771747817479174801748117482174831748417485174861748717488174891749017491174921749317494174951749617497174981749917500175011750217503175041750517506175071750817509175101751117512175131751417515175161751717518175191752017521175221752317524175251752617527175281752917530175311753217533175341753517536175371753817539175401754117542175431754417545175461754717548175491755017551175521755317554175551755617557175581755917560175611756217563175641756517566175671756817569175701757117572175731757417575175761757717578175791758017581175821758317584175851758617587175881758917590175911759217593175941759517596175971759817599176001760117602176031760417605176061760717608176091761017611176121761317614176151761617617176181761917620176211762217623176241762517626176271762817629176301763117632176331763417635176361763717638176391764017641176421764317644176451764617647176481764917650176511765217653176541765517656176571765817659176601766117662176631766417665176661766717668176691767017671176721767317674176751767617677176781767917680176811768217683176841768517686176871768817689176901769117692176931769417695176961769717698176991770017701177021770317704177051770617707177081770917710177111771217713177141771517716177171771817719177201772117722177231772417725177261772717728177291773017731177321773317734177351773617737177381773917740177411774217743177441774517746177471774817749177501775117752177531775417755177561775717758177591776017761177621776317764177651776617767177681776917770177711777217773177741777517776177771777817779177801778117782177831778417785177861778717788177891779017791177921779317794177951779617797177981779917800178011780217803178041780517806178071780817809178101781117812178131781417815178161781717818178191782017821178221782317824178251782617827178281782917830178311783217833178341783517836178371783817839178401784117842178431784417845178461784717848178491785017851178521785317854178551785617857178581785917860178611786217863178641786517866178671786817869178701787117872178731787417875178761787717878178791788017881178821788317884178851788617887178881788917890178911789217893178941789517896178971789817899179001790117902179031790417905179061790717908179091791017911179121791317914179151791617917179181791917920179211792217923179241792517926179271792817929179301793117932179331793417935179361793717938179391794017941179421794317944179451794617947179481794917950179511795217953179541795517956179571795817959179601796117962179631796417965179661796717968179691797017971179721797317974179751797617977179781797917980179811798217983179841798517986179871798817989179901799117992179931799417995179961799717998179991800018001180021800318004180051800618007180081800918010180111801218013180141801518016180171801818019180201802118022180231802418025180261802718028180291803018031180321803318034180351803618037180381803918040180411804218043180441804518046180471804818049180501805118052180531805418055180561805718058180591806018061180621806318064180651806618067180681806918070180711807218073180741807518076180771807818079180801808118082180831808418085180861808718088180891809018091180921809318094180951809618097180981809918100181011810218103181041810518106181071810818109181101811118112181131811418115181161811718118181191812018121181221812318124181251812618127181281812918130181311813218133181341813518136181371813818139181401814118142181431814418145181461814718148181491815018151181521815318154181551815618157181581815918160181611816218163181641816518166181671816818169181701817118172181731817418175181761817718178181791818018181181821818318184181851818618187181881818918190181911819218193181941819518196181971819818199182001820118202182031820418205182061820718208182091821018211182121821318214182151821618217182181821918220182211822218223182241822518226182271822818229182301823118232182331823418235182361823718238182391824018241182421824318244182451824618247182481824918250182511825218253182541825518256182571825818259182601826118262182631826418265182661826718268182691827018271182721827318274182751827618277182781827918280182811828218283182841828518286182871828818289182901829118292182931829418295182961829718298182991830018301183021830318304183051830618307183081830918310183111831218313183141831518316183171831818319183201832118322183231832418325183261832718328183291833018331183321833318334183351833618337183381833918340183411834218343183441834518346183471834818349183501835118352183531835418355183561835718358183591836018361183621836318364183651836618367183681836918370183711837218373183741837518376183771837818379183801838118382183831838418385183861838718388183891839018391183921839318394183951839618397183981839918400184011840218403184041840518406184071840818409184101841118412184131841418415184161841718418184191842018421184221842318424184251842618427184281842918430184311843218433184341843518436184371843818439184401844118442184431844418445184461844718448184491845018451184521845318454184551845618457184581845918460184611846218463184641846518466184671846818469184701847118472184731847418475184761847718478184791848018481184821848318484184851848618487184881848918490184911849218493184941849518496184971849818499185001850118502185031850418505185061850718508185091851018511185121851318514185151851618517185181851918520185211852218523185241852518526185271852818529185301853118532185331853418535185361853718538185391854018541185421854318544185451854618547185481854918550185511855218553185541855518556185571855818559185601856118562185631856418565185661856718568185691857018571185721857318574185751857618577185781857918580185811858218583185841858518586185871858818589185901859118592185931859418595185961859718598185991860018601186021860318604186051860618607186081860918610186111861218613186141861518616186171861818619186201862118622186231862418625186261862718628186291863018631186321863318634186351863618637186381863918640186411864218643186441864518646186471864818649186501865118652186531865418655186561865718658186591866018661186621866318664186651866618667186681866918670186711867218673186741867518676186771867818679186801868118682186831868418685186861868718688186891869018691186921869318694186951869618697186981869918700187011870218703187041870518706187071870818709187101871118712187131871418715187161871718718187191872018721187221872318724187251872618727187281872918730187311873218733187341873518736187371873818739187401874118742187431874418745187461874718748187491875018751187521875318754187551875618757187581875918760187611876218763187641876518766187671876818769187701877118772187731877418775187761877718778187791878018781187821878318784187851878618787187881878918790187911879218793187941879518796187971879818799188001880118802188031880418805188061880718808188091881018811188121881318814188151881618817188181881918820188211882218823188241882518826188271882818829188301883118832188331883418835188361883718838188391884018841188421884318844188451884618847188481884918850188511885218853188541885518856188571885818859188601886118862188631886418865188661886718868188691887018871188721887318874188751887618877188781887918880188811888218883188841888518886188871888818889188901889118892188931889418895188961889718898188991890018901189021890318904189051890618907189081890918910189111891218913189141891518916189171891818919189201892118922189231892418925189261892718928189291893018931189321893318934189351893618937189381893918940189411894218943189441894518946189471894818949189501895118952189531895418955189561895718958189591896018961189621896318964189651896618967189681896918970189711897218973189741897518976189771897818979189801898118982189831898418985189861898718988189891899018991189921899318994189951899618997189981899919000190011900219003190041900519006190071900819009190101901119012190131901419015190161901719018190191902019021190221902319024190251902619027190281902919030190311903219033190341903519036190371903819039190401904119042190431904419045190461904719048190491905019051190521905319054190551905619057190581905919060190611906219063190641906519066190671906819069190701907119072190731907419075190761907719078190791908019081190821908319084190851908619087190881908919090190911909219093190941909519096190971909819099191001910119102191031910419105191061910719108191091911019111191121911319114191151911619117191181911919120191211912219123191241912519126191271912819129191301913119132191331913419135191361913719138191391914019141191421914319144191451914619147191481914919150191511915219153191541915519156191571915819159191601916119162191631916419165191661916719168191691917019171191721917319174191751917619177191781917919180191811918219183191841918519186191871918819189191901919119192191931919419195191961919719198191991920019201192021920319204192051920619207192081920919210192111921219213192141921519216192171921819219192201922119222192231922419225192261922719228192291923019231192321923319234192351923619237192381923919240192411924219243192441924519246192471924819249192501925119252192531925419255192561925719258192591926019261192621926319264192651926619267192681926919270192711927219273192741927519276192771927819279192801928119282192831928419285192861928719288192891929019291192921929319294192951929619297192981929919300193011930219303193041930519306193071930819309193101931119312193131931419315193161931719318193191932019321193221932319324193251932619327193281932919330193311933219333193341933519336193371933819339193401934119342193431934419345193461934719348193491935019351193521935319354193551935619357193581935919360193611936219363193641936519366193671936819369193701937119372193731937419375193761937719378193791938019381193821938319384193851938619387193881938919390193911939219393193941939519396193971939819399194001940119402194031940419405194061940719408194091941019411194121941319414194151941619417194181941919420194211942219423194241942519426194271942819429194301943119432194331943419435194361943719438194391944019441194421944319444194451944619447194481944919450194511945219453194541945519456194571945819459194601946119462194631946419465194661946719468194691947019471194721947319474194751947619477194781947919480194811948219483194841948519486194871948819489194901949119492194931949419495194961949719498194991950019501195021950319504195051950619507195081950919510195111951219513195141951519516195171951819519195201952119522195231952419525195261952719528195291953019531195321953319534195351953619537195381953919540195411954219543195441954519546195471954819549195501955119552195531955419555195561955719558195591956019561195621956319564195651956619567195681956919570195711957219573195741957519576195771957819579195801958119582195831958419585195861958719588195891959019591195921959319594195951959619597195981959919600196011960219603196041960519606196071960819609196101961119612196131961419615196161961719618196191962019621196221962319624196251962619627196281962919630196311963219633196341963519636196371963819639196401964119642196431964419645196461964719648196491965019651196521965319654196551965619657196581965919660196611966219663196641966519666196671966819669196701967119672196731967419675196761967719678196791968019681196821968319684196851968619687196881968919690196911969219693196941969519696196971969819699197001970119702197031970419705197061970719708197091971019711197121971319714197151971619717197181971919720197211972219723197241972519726197271972819729197301973119732197331973419735197361973719738197391974019741197421974319744197451974619747197481974919750197511975219753197541975519756197571975819759197601976119762197631976419765197661976719768197691977019771197721977319774197751977619777197781977919780197811978219783197841978519786197871978819789197901979119792197931979419795197961979719798197991980019801198021980319804198051980619807198081980919810198111981219813198141981519816198171981819819198201982119822198231982419825198261982719828198291983019831198321983319834198351983619837198381983919840198411984219843198441984519846198471984819849198501985119852198531985419855198561985719858198591986019861198621986319864198651986619867198681986919870198711987219873198741987519876198771987819879198801988119882198831988419885198861988719888198891989019891198921989319894198951989619897198981989919900199011990219903199041990519906199071990819909199101991119912199131991419915199161991719918199191992019921199221992319924199251992619927199281992919930199311993219933199341993519936199371993819939199401994119942199431994419945199461994719948199491995019951199521995319954199551995619957199581995919960199611996219963199641996519966199671996819969199701997119972199731997419975199761997719978199791998019981199821998319984199851998619987199881998919990199911999219993199941999519996199971999819999200002000120002200032000420005200062000720008200092001020011200122001320014200152001620017200182001920020200212002220023200242002520026200272002820029200302003120032200332003420035200362003720038200392004020041200422004320044200452004620047200482004920050200512005220053200542005520056200572005820059200602006120062200632006420065200662006720068200692007020071200722007320074200752007620077200782007920080200812008220083200842008520086200872008820089200902009120092200932009420095200962009720098200992010020101201022010320104201052010620107201082010920110201112011220113201142011520116201172011820119201202012120122201232012420125201262012720128201292013020131201322013320134201352013620137201382013920140201412014220143201442014520146201472014820149201502015120152201532015420155201562015720158201592016020161201622016320164201652016620167201682016920170201712017220173201742017520176201772017820179201802018120182201832018420185201862018720188201892019020191201922019320194201952019620197201982019920200202012020220203202042020520206202072020820209202102021120212202132021420215202162021720218202192022020221202222022320224202252022620227202282022920230202312023220233202342023520236202372023820239202402024120242202432024420245202462024720248202492025020251202522025320254202552025620257202582025920260202612026220263202642026520266202672026820269202702027120272202732027420275202762027720278202792028020281202822028320284202852028620287202882028920290202912029220293202942029520296202972029820299203002030120302203032030420305203062030720308203092031020311203122031320314203152031620317203182031920320203212032220323203242032520326203272032820329203302033120332203332033420335203362033720338203392034020341203422034320344203452034620347203482034920350203512035220353203542035520356203572035820359203602036120362203632036420365203662036720368203692037020371203722037320374203752037620377203782037920380203812038220383203842038520386203872038820389203902039120392203932039420395203962039720398203992040020401204022040320404204052040620407204082040920410204112041220413204142041520416204172041820419204202042120422204232042420425204262042720428204292043020431204322043320434204352043620437204382043920440204412044220443204442044520446204472044820449204502045120452204532045420455204562045720458204592046020461204622046320464204652046620467204682046920470204712047220473204742047520476204772047820479204802048120482204832048420485204862048720488204892049020491204922049320494204952049620497204982049920500205012050220503205042050520506205072050820509205102051120512205132051420515205162051720518205192052020521205222052320524205252052620527205282052920530205312053220533205342053520536205372053820539205402054120542205432054420545205462054720548205492055020551205522055320554205552055620557205582055920560205612056220563205642056520566205672056820569205702057120572205732057420575205762057720578205792058020581205822058320584205852058620587205882058920590205912059220593205942059520596205972059820599206002060120602206032060420605206062060720608206092061020611206122061320614206152061620617206182061920620206212062220623206242062520626206272062820629206302063120632206332063420635206362063720638206392064020641206422064320644206452064620647206482064920650206512065220653206542065520656206572065820659206602066120662206632066420665206662066720668206692067020671206722067320674206752067620677206782067920680206812068220683206842068520686206872068820689206902069120692206932069420695206962069720698206992070020701207022070320704207052070620707207082070920710207112071220713207142071520716207172071820719207202072120722207232072420725207262072720728207292073020731207322073320734207352073620737207382073920740207412074220743207442074520746207472074820749207502075120752207532075420755207562075720758207592076020761207622076320764207652076620767207682076920770207712077220773207742077520776207772077820779207802078120782207832078420785207862078720788207892079020791207922079320794207952079620797207982079920800208012080220803208042080520806208072080820809208102081120812208132081420815208162081720818208192082020821208222082320824208252082620827208282082920830208312083220833208342083520836208372083820839208402084120842208432084420845208462084720848208492085020851208522085320854208552085620857208582085920860208612086220863208642086520866208672086820869208702087120872208732087420875208762087720878208792088020881208822088320884208852088620887208882088920890208912089220893208942089520896208972089820899209002090120902209032090420905209062090720908209092091020911209122091320914209152091620917209182091920920209212092220923209242092520926209272092820929209302093120932209332093420935209362093720938209392094020941209422094320944209452094620947209482094920950209512095220953209542095520956209572095820959209602096120962209632096420965209662096720968209692097020971209722097320974209752097620977209782097920980209812098220983209842098520986209872098820989209902099120992209932099420995209962099720998209992100021001210022100321004210052100621007210082100921010210112101221013210142101521016210172101821019210202102121022210232102421025210262102721028210292103021031210322103321034210352103621037210382103921040210412104221043210442104521046210472104821049210502105121052210532105421055210562105721058210592106021061210622106321064210652106621067210682106921070210712107221073210742107521076210772107821079210802108121082210832108421085210862108721088210892109021091210922109321094210952109621097210982109921100211012110221103211042110521106211072110821109211102111121112211132111421115211162111721118211192112021121211222112321124211252112621127211282112921130211312113221133211342113521136211372113821139211402114121142211432114421145211462114721148211492115021151211522115321154211552115621157211582115921160211612116221163211642116521166211672116821169211702117121172211732117421175211762117721178211792118021181211822118321184211852118621187211882118921190211912119221193211942119521196211972119821199212002120121202212032120421205212062120721208212092121021211212122121321214212152121621217212182121921220212212122221223212242122521226212272122821229212302123121232212332123421235212362123721238212392124021241212422124321244212452124621247212482124921250212512125221253212542125521256212572125821259212602126121262212632126421265212662126721268212692127021271212722127321274212752127621277212782127921280212812128221283212842128521286212872128821289212902129121292212932129421295212962129721298212992130021301213022130321304213052130621307213082130921310213112131221313213142131521316213172131821319213202132121322213232132421325213262132721328213292133021331213322133321334213352133621337213382133921340213412134221343213442134521346213472134821349213502135121352213532135421355213562135721358213592136021361213622136321364213652136621367213682136921370213712137221373213742137521376213772137821379213802138121382213832138421385213862138721388213892139021391213922139321394213952139621397213982139921400214012140221403214042140521406214072140821409214102141121412214132141421415214162141721418214192142021421214222142321424214252142621427214282142921430214312143221433214342143521436214372143821439214402144121442214432144421445214462144721448214492145021451214522145321454214552145621457214582145921460214612146221463214642146521466214672146821469214702147121472214732147421475214762147721478214792148021481214822148321484214852148621487214882148921490214912149221493214942149521496214972149821499215002150121502215032150421505215062150721508215092151021511215122151321514215152151621517215182151921520215212152221523215242152521526215272152821529215302153121532215332153421535215362153721538215392154021541215422154321544215452154621547215482154921550215512155221553215542155521556215572155821559215602156121562215632156421565215662156721568215692157021571215722157321574215752157621577215782157921580215812158221583215842158521586215872158821589215902159121592215932159421595215962159721598215992160021601216022160321604216052160621607216082160921610216112161221613216142161521616216172161821619216202162121622216232162421625216262162721628216292163021631216322163321634216352163621637216382163921640216412164221643216442164521646216472164821649216502165121652216532165421655216562165721658216592166021661216622166321664216652166621667216682166921670216712167221673216742167521676216772167821679216802168121682216832168421685216862168721688216892169021691216922169321694216952169621697216982169921700217012170221703217042170521706217072170821709217102171121712217132171421715217162171721718217192172021721217222172321724217252172621727217282172921730217312173221733217342173521736217372173821739217402174121742217432174421745217462174721748217492175021751217522175321754217552175621757217582175921760217612176221763217642176521766217672176821769217702177121772217732177421775217762177721778217792178021781217822178321784217852178621787217882178921790217912179221793217942179521796217972179821799218002180121802218032180421805218062180721808218092181021811218122181321814218152181621817218182181921820218212182221823218242182521826218272182821829218302183121832218332183421835218362183721838218392184021841218422184321844218452184621847218482184921850218512185221853218542185521856218572185821859218602186121862218632186421865218662186721868218692187021871218722187321874218752187621877218782187921880218812188221883218842188521886218872188821889218902189121892218932189421895218962189721898218992190021901219022190321904219052190621907219082190921910219112191221913219142191521916219172191821919219202192121922219232192421925219262192721928219292193021931219322193321934219352193621937219382193921940219412194221943219442194521946219472194821949219502195121952219532195421955219562195721958219592196021961219622196321964219652196621967219682196921970219712197221973219742197521976219772197821979219802198121982219832198421985219862198721988219892199021991219922199321994219952199621997219982199922000220012200222003220042200522006220072200822009220102201122012220132201422015220162201722018220192202022021220222202322024220252202622027220282202922030220312203222033220342203522036220372203822039220402204122042220432204422045220462204722048220492205022051220522205322054220552205622057220582205922060220612206222063220642206522066220672206822069220702207122072220732207422075220762207722078220792208022081220822208322084220852208622087220882208922090220912209222093220942209522096220972209822099221002210122102221032210422105221062210722108221092211022111221122211322114221152211622117221182211922120221212212222123221242212522126221272212822129221302213122132221332213422135221362213722138221392214022141221422214322144221452214622147221482214922150221512215222153221542215522156221572215822159221602216122162221632216422165221662216722168221692217022171221722217322174221752217622177221782217922180221812218222183221842218522186221872218822189221902219122192221932219422195221962219722198221992220022201222022220322204222052220622207222082220922210222112221222213222142221522216222172221822219222202222122222222232222422225222262222722228222292223022231222322223322234222352223622237222382223922240222412224222243222442224522246222472224822249222502225122252222532225422255222562225722258222592226022261222622226322264222652226622267222682226922270222712227222273222742227522276222772227822279222802228122282222832228422285222862228722288222892229022291222922229322294222952229622297222982229922300223012230222303223042230522306223072230822309223102231122312223132231422315223162231722318223192232022321223222232322324223252232622327223282232922330223312233222333223342233522336223372233822339223402234122342223432234422345223462234722348223492235022351223522235322354223552235622357223582235922360223612236222363223642236522366223672236822369223702237122372223732237422375223762237722378223792238022381223822238322384223852238622387223882238922390223912239222393223942239522396223972239822399224002240122402224032240422405224062240722408224092241022411224122241322414224152241622417224182241922420224212242222423224242242522426224272242822429224302243122432224332243422435224362243722438224392244022441224422244322444224452244622447224482244922450224512245222453224542245522456224572245822459224602246122462224632246422465224662246722468224692247022471224722247322474224752247622477224782247922480224812248222483224842248522486224872248822489224902249122492224932249422495224962249722498224992250022501225022250322504225052250622507225082250922510225112251222513225142251522516225172251822519225202252122522225232252422525225262252722528225292253022531225322253322534225352253622537225382253922540225412254222543225442254522546225472254822549225502255122552225532255422555225562255722558225592256022561225622256322564225652256622567225682256922570225712257222573225742257522576225772257822579225802258122582225832258422585225862258722588225892259022591225922259322594225952259622597225982259922600226012260222603226042260522606226072260822609226102261122612226132261422615226162261722618226192262022621226222262322624226252262622627226282262922630226312263222633226342263522636226372263822639226402264122642226432264422645226462264722648226492265022651226522265322654226552265622657226582265922660226612266222663226642266522666226672266822669226702267122672226732267422675226762267722678226792268022681226822268322684226852268622687226882268922690226912269222693226942269522696226972269822699227002270122702227032270422705227062270722708227092271022711227122271322714227152271622717227182271922720227212272222723227242272522726227272272822729227302273122732227332273422735227362273722738227392274022741227422274322744227452274622747227482274922750227512275222753227542275522756227572275822759227602276122762227632276422765227662276722768227692277022771227722277322774227752277622777227782277922780227812278222783227842278522786227872278822789227902279122792227932279422795227962279722798227992280022801228022280322804228052280622807228082280922810228112281222813228142281522816228172281822819228202282122822228232282422825228262282722828228292283022831228322283322834228352283622837228382283922840228412284222843228442284522846228472284822849228502285122852228532285422855228562285722858228592286022861228622286322864228652286622867228682286922870228712287222873228742287522876228772287822879228802288122882228832288422885228862288722888228892289022891228922289322894228952289622897228982289922900229012290222903229042290522906229072290822909229102291122912229132291422915229162291722918229192292022921229222292322924229252292622927229282292922930229312293222933229342293522936229372293822939229402294122942229432294422945229462294722948229492295022951229522295322954229552295622957229582295922960229612296222963229642296522966229672296822969229702297122972229732297422975229762297722978229792298022981229822298322984229852298622987229882298922990229912299222993229942299522996229972299822999230002300123002230032300423005230062300723008230092301023011230122301323014230152301623017230182301923020230212302223023230242302523026230272302823029230302303123032230332303423035230362303723038230392304023041230422304323044230452304623047230482304923050230512305223053230542305523056230572305823059230602306123062230632306423065230662306723068230692307023071230722307323074230752307623077230782307923080230812308223083230842308523086230872308823089230902309123092230932309423095230962309723098230992310023101231022310323104231052310623107231082310923110231112311223113231142311523116231172311823119231202312123122231232312423125231262312723128231292313023131231322313323134231352313623137231382313923140231412314223143231442314523146231472314823149231502315123152231532315423155231562315723158231592316023161231622316323164231652316623167231682316923170231712317223173231742317523176231772317823179231802318123182231832318423185231862318723188231892319023191231922319323194231952319623197231982319923200232012320223203232042320523206232072320823209232102321123212232132321423215232162321723218232192322023221232222322323224232252322623227232282322923230232312323223233232342323523236232372323823239232402324123242232432324423245232462324723248232492325023251232522325323254232552325623257232582325923260232612326223263232642326523266232672326823269232702327123272232732327423275232762327723278232792328023281232822328323284232852328623287232882328923290232912329223293232942329523296232972329823299233002330123302233032330423305233062330723308233092331023311233122331323314233152331623317233182331923320233212332223323233242332523326233272332823329233302333123332233332333423335233362333723338233392334023341233422334323344233452334623347233482334923350233512335223353233542335523356233572335823359233602336123362233632336423365233662336723368233692337023371233722337323374233752337623377233782337923380233812338223383233842338523386233872338823389233902339123392233932339423395233962339723398233992340023401234022340323404234052340623407234082340923410234112341223413234142341523416234172341823419234202342123422234232342423425234262342723428234292343023431234322343323434234352343623437234382343923440234412344223443234442344523446234472344823449234502345123452234532345423455234562345723458234592346023461234622346323464234652346623467234682346923470234712347223473234742347523476234772347823479234802348123482234832348423485234862348723488234892349023491234922349323494234952349623497234982349923500235012350223503235042350523506235072350823509235102351123512235132351423515235162351723518235192352023521235222352323524235252352623527235282352923530235312353223533235342353523536235372353823539235402354123542235432354423545235462354723548235492355023551235522355323554235552355623557235582355923560235612356223563235642356523566235672356823569235702357123572235732357423575235762357723578235792358023581235822358323584235852358623587235882358923590235912359223593235942359523596235972359823599236002360123602236032360423605236062360723608236092361023611236122361323614236152361623617236182361923620236212362223623236242362523626236272362823629236302363123632236332363423635236362363723638236392364023641236422364323644236452364623647236482364923650236512365223653236542365523656236572365823659236602366123662236632366423665236662366723668236692367023671236722367323674236752367623677236782367923680236812368223683236842368523686236872368823689236902369123692236932369423695236962369723698236992370023701237022370323704237052370623707237082370923710237112371223713237142371523716237172371823719237202372123722237232372423725237262372723728237292373023731237322373323734237352373623737237382373923740237412374223743237442374523746237472374823749237502375123752237532375423755237562375723758237592376023761237622376323764237652376623767237682376923770237712377223773237742377523776237772377823779237802378123782237832378423785237862378723788237892379023791237922379323794237952379623797237982379923800238012380223803238042380523806238072380823809238102381123812238132381423815238162381723818238192382023821238222382323824238252382623827238282382923830238312383223833238342383523836238372383823839238402384123842238432384423845238462384723848238492385023851238522385323854238552385623857238582385923860238612386223863238642386523866238672386823869238702387123872238732387423875238762387723878238792388023881238822388323884238852388623887238882388923890238912389223893238942389523896238972389823899239002390123902239032390423905239062390723908239092391023911239122391323914239152391623917239182391923920239212392223923239242392523926239272392823929239302393123932239332393423935239362393723938239392394023941239422394323944239452394623947239482394923950239512395223953239542395523956239572395823959239602396123962239632396423965239662396723968239692397023971239722397323974239752397623977239782397923980239812398223983239842398523986239872398823989239902399123992239932399423995239962399723998239992400024001240022400324004240052400624007240082400924010240112401224013240142401524016240172401824019240202402124022240232402424025240262402724028240292403024031240322403324034240352403624037240382403924040240412404224043240442404524046240472404824049240502405124052240532405424055240562405724058240592406024061240622406324064240652406624067240682406924070240712407224073240742407524076240772407824079240802408124082240832408424085240862408724088240892409024091240922409324094240952409624097240982409924100241012410224103241042410524106241072410824109241102411124112241132411424115241162411724118241192412024121241222412324124241252412624127241282412924130241312413224133241342413524136241372413824139241402414124142241432414424145241462414724148241492415024151241522415324154241552415624157241582415924160241612416224163241642416524166241672416824169241702417124172241732417424175241762417724178241792418024181241822418324184241852418624187241882418924190241912419224193241942419524196241972419824199242002420124202242032420424205242062420724208242092421024211242122421324214242152421624217242182421924220242212422224223242242422524226242272422824229242302423124232242332423424235242362423724238242392424024241242422424324244242452424624247242482424924250242512425224253242542425524256242572425824259242602426124262242632426424265242662426724268242692427024271242722427324274242752427624277242782427924280242812428224283242842428524286242872428824289242902429124292242932429424295242962429724298242992430024301243022430324304243052430624307243082430924310243112431224313243142431524316243172431824319243202432124322243232432424325243262432724328243292433024331243322433324334243352433624337243382433924340243412434224343243442434524346243472434824349243502435124352243532435424355243562435724358243592436024361243622436324364243652436624367243682436924370243712437224373243742437524376243772437824379243802438124382243832438424385243862438724388243892439024391243922439324394243952439624397243982439924400244012440224403244042440524406244072440824409244102441124412244132441424415244162441724418244192442024421244222442324424244252442624427244282442924430244312443224433244342443524436244372443824439244402444124442244432444424445244462444724448244492445024451244522445324454244552445624457244582445924460244612446224463244642446524466244672446824469244702447124472244732447424475244762447724478244792448024481244822448324484244852448624487244882448924490244912449224493244942449524496244972449824499245002450124502245032450424505245062450724508245092451024511245122451324514245152451624517245182451924520245212452224523245242452524526245272452824529245302453124532245332453424535245362453724538245392454024541245422454324544245452454624547245482454924550245512455224553245542455524556245572455824559245602456124562245632456424565245662456724568245692457024571245722457324574245752457624577245782457924580245812458224583245842458524586245872458824589245902459124592245932459424595245962459724598245992460024601246022460324604246052460624607246082460924610246112461224613246142461524616246172461824619246202462124622246232462424625246262462724628246292463024631246322463324634246352463624637246382463924640246412464224643246442464524646246472464824649246502465124652246532465424655246562465724658246592466024661246622466324664246652466624667246682466924670246712467224673246742467524676246772467824679246802468124682246832468424685246862468724688246892469024691246922469324694246952469624697246982469924700247012470224703247042470524706247072470824709247102471124712247132471424715247162471724718247192472024721247222472324724247252472624727247282472924730247312473224733247342473524736247372473824739247402474124742247432474424745247462474724748247492475024751247522475324754247552475624757247582475924760247612476224763247642476524766247672476824769247702477124772247732477424775247762477724778247792478024781247822478324784247852478624787247882478924790247912479224793247942479524796247972479824799248002480124802248032480424805248062480724808248092481024811248122481324814248152481624817248182481924820248212482224823248242482524826248272482824829248302483124832248332483424835248362483724838248392484024841248422484324844248452484624847248482484924850248512485224853248542485524856248572485824859248602486124862248632486424865248662486724868248692487024871248722487324874248752487624877248782487924880248812488224883248842488524886248872488824889248902489124892248932489424895248962489724898248992490024901249022490324904249052490624907249082490924910249112491224913249142491524916249172491824919249202492124922249232492424925249262492724928249292493024931249322493324934249352493624937249382493924940249412494224943249442494524946249472494824949249502495124952249532495424955249562495724958249592496024961249622496324964249652496624967249682496924970249712497224973249742497524976249772497824979249802498124982249832498424985249862498724988249892499024991249922499324994249952499624997249982499925000250012500225003250042500525006250072500825009250102501125012250132501425015250162501725018250192502025021250222502325024250252502625027250282502925030250312503225033250342503525036250372503825039250402504125042250432504425045250462504725048250492505025051250522505325054250552505625057250582505925060250612506225063250642506525066250672506825069250702507125072250732507425075250762507725078250792508025081250822508325084250852508625087250882508925090250912509225093250942509525096250972509825099251002510125102251032510425105251062510725108251092511025111251122511325114251152511625117251182511925120251212512225123251242512525126251272512825129251302513125132251332513425135251362513725138251392514025141251422514325144251452514625147251482514925150251512515225153251542515525156251572515825159251602516125162251632516425165251662516725168251692517025171251722517325174251752517625177251782517925180 |
- /* eslint-disable */
-
- /*!
- * pixi-spine - v3.0.4
- * Compiled Sun, 04 Jul 2021 14:05:16 UTC
- *
- * pixi-spine is licensed under SPINE-LICENSE
- * http://esotericsoftware.com/spine-runtimes-license
- *
- * Copyright 2019-2020, Ivan Igorevich Popelyshev <ivan.popelyshev@gmail.com>, All Rights Reserved
- */
- this.PIXI = this.PIXI || {};
- this.PIXI.spine = this.PIXI.spine || {};
- (function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@pixi/loaders'), require('@pixi/core'), require('@pixi/constants'), require('@pixi/math'), require('@pixi/display'), require('@pixi/sprite'), require('@pixi/mesh-extras'), require('@pixi/graphics'), require('@pixi/utils')) :
- typeof define === 'function' && define.amd ? define(['exports', '@pixi/loaders', '@pixi/core', '@pixi/constants', '@pixi/math', '@pixi/display', '@pixi/sprite', '@pixi/mesh-extras', '@pixi/graphics', '@pixi/utils'], factory) :
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.pixi_spine = {}, global.PIXI, global.PIXI, global.PIXI, global.PIXI, global.PIXI, global.PIXI, global.PIXI, global.PIXI, global.PIXI.utils));
- }(this, (function (exports, loaders, core, constants, math, display, sprite, meshExtras, graphics, utils) { 'use strict';
- /* eslint-disable */
- /**
- * @public
- */
- (function (AttachmentType) {
- const Region = 0; AttachmentType[AttachmentType["Region"] = Region] = "Region"; const BoundingBox = Region + 1; AttachmentType[AttachmentType["BoundingBox"] = BoundingBox] = "BoundingBox"; const Mesh = BoundingBox + 1; AttachmentType[AttachmentType["Mesh"] = Mesh] = "Mesh"; const LinkedMesh = Mesh + 1; AttachmentType[AttachmentType["LinkedMesh"] = LinkedMesh] = "LinkedMesh"; const Path = LinkedMesh + 1; AttachmentType[AttachmentType["Path"] = Path] = "Path"; const Point = Path + 1; AttachmentType[AttachmentType["Point"] = Point] = "Point"; const Clipping = Point + 1; AttachmentType[AttachmentType["Clipping"] = Clipping] = "Clipping";
- })(exports.AttachmentType || (exports.AttachmentType = {}));
- /**
- * @public
- */
- class BinaryInput {
- constructor(data, strings = new Array(), index = 0, buffer = new DataView(data.buffer)) {this.strings = strings;this.index = index;this.buffer = buffer;
- }
- readByte() {
- return this.buffer.getInt8(this.index++);
- }
- readUnsignedByte() {
- return this.buffer.getUint8(this.index++);
- }
- readShort() {
- let value = this.buffer.getInt16(this.index);
- this.index += 2;
- return value;
- }
- readInt32() {
- let value = this.buffer.getInt32(this.index);
- this.index += 4;
- return value;
- }
- readInt(optimizePositive) {
- let b = this.readByte();
- let result = b & 0x7F;
- if ((b & 0x80) != 0) {
- b = this.readByte();
- result |= (b & 0x7F) << 7;
- if ((b & 0x80) != 0) {
- b = this.readByte();
- result |= (b & 0x7F) << 14;
- if ((b & 0x80) != 0) {
- b = this.readByte();
- result |= (b & 0x7F) << 21;
- if ((b & 0x80) != 0) {
- b = this.readByte();
- result |= (b & 0x7F) << 28;
- }
- }
- }
- }
- return optimizePositive ? result : ((result >>> 1) ^ -(result & 1));
- }
- readStringRef () {
- let index = this.readInt(true);
- return index == 0 ? null : this.strings[index - 1];
- }
- readString () {
- let byteCount = this.readInt(true);
- switch (byteCount) {
- case 0:
- return null;
- case 1:
- return "";
- }
- byteCount--;
- let chars = "";
- for (let i = 0; i < byteCount;) {
- let b = this.readByte();
- switch (b >> 4) {
- case 12:
- case 13:
- chars += String.fromCharCode(((b & 0x1F) << 6 | this.readByte() & 0x3F));
- i += 2;
- break;
- case 14:
- chars += String.fromCharCode(((b & 0x0F) << 12 | (this.readByte() & 0x3F) << 6 | this.readByte() & 0x3F));
- i += 3;
- break;
- default:
- chars += String.fromCharCode(b);
- i++;
- }
- }
- return chars;
- }
- readFloat () {
- let value = this.buffer.getFloat32(this.index);
- this.index += 4;
- return value;
- }
- readBoolean () {
- return this.readByte() != 0;
- }
- }
- /**
- * @public
- */
- function filterFromString (text) {
- switch (text.toLowerCase()) {
- case "nearest": return exports.TextureFilter.Nearest;
- case "linear": return exports.TextureFilter.Linear;
- case "mipmap": return exports.TextureFilter.MipMap;
- case "mipmapnearestnearest": return exports.TextureFilter.MipMapNearestNearest;
- case "mipmaplinearnearest": return exports.TextureFilter.MipMapLinearNearest;
- case "mipmapnearestlinear": return exports.TextureFilter.MipMapNearestLinear;
- case "mipmaplinearlinear": return exports.TextureFilter.MipMapLinearLinear;
- default: throw new Error(`Unknown texture filter ${text}`);
- }
- }
- /**
- * @public
- */
- function wrapFromString (text) {
- switch (text.toLowerCase()) {
- case "mirroredtepeat": return exports.TextureWrap.MirroredRepeat;
- case "clamptoedge": return exports.TextureWrap.ClampToEdge;
- case "repeat": return exports.TextureWrap.Repeat;
- default: throw new Error(`Unknown texture wrap ${text}`);
- }
- }
- /**
- * @public
- */
- (function (TextureFilter) {
- const Nearest = 9728; TextureFilter[TextureFilter["Nearest"] = Nearest] = "Nearest"; // WebGLRenderingContext.NEAREST
- const Linear = 9729; TextureFilter[TextureFilter["Linear"] = Linear] = "Linear"; // WebGLRenderingContext.LINEAR
- const MipMap = 9987; TextureFilter[TextureFilter["MipMap"] = MipMap] = "MipMap"; // WebGLRenderingContext.LINEAR_MIPMAP_LINEAR
- const MipMapNearestNearest = 9984; TextureFilter[TextureFilter["MipMapNearestNearest"] = MipMapNearestNearest] = "MipMapNearestNearest"; // WebGLRenderingContext.NEAREST_MIPMAP_NEAREST
- const MipMapLinearNearest = 9985; TextureFilter[TextureFilter["MipMapLinearNearest"] = MipMapLinearNearest] = "MipMapLinearNearest"; // WebGLRenderingContext.LINEAR_MIPMAP_NEAREST
- const MipMapNearestLinear = 9986; TextureFilter[TextureFilter["MipMapNearestLinear"] = MipMapNearestLinear] = "MipMapNearestLinear"; // WebGLRenderingContext.NEAREST_MIPMAP_LINEAR
- const MipMapLinearLinear = 9987; TextureFilter[TextureFilter["MipMapLinearLinear"] = MipMapLinearLinear] = "MipMapLinearLinear"; // WebGLRenderingContext.LINEAR_MIPMAP_LINEAR
- })(exports.TextureFilter || (exports.TextureFilter = {}));
- /**
- * @public
- */
- (function (TextureWrap) {
- const MirroredRepeat = 33648; TextureWrap[TextureWrap["MirroredRepeat"] = MirroredRepeat] = "MirroredRepeat"; // WebGLRenderingContext.MIRRORED_REPEAT
- const ClampToEdge = 33071; TextureWrap[TextureWrap["ClampToEdge"] = ClampToEdge] = "ClampToEdge"; // WebGLRenderingContext.CLAMP_TO_EDGE
- const Repeat = 10497; TextureWrap[TextureWrap["Repeat"] = Repeat] = "Repeat"; // WebGLRenderingContext.REPEAT
- })(exports.TextureWrap || (exports.TextureWrap = {}));
- /**
- * @public
- */
- class TextureRegion {constructor() { TextureRegion.prototype.__init.call(this);TextureRegion.prototype.__init2.call(this);TextureRegion.prototype.__init3.call(this); }
-
- //thats for overrides
- __init() {this.size = null;}
- __init2() {this.names = null;}
- __init3() {this.values = null;}
- get width() {
- const tex = this.texture;
- if (tex.trim) {
- return tex.trim.width;
- }
- return tex.orig.width;
- }
- get height() {
- const tex = this.texture;
- if (tex.trim) {
- return tex.trim.height;
- }
- return tex.orig.height;
- }
- get u() {
- return (this.texture )._uvs.x0;
- }
- get v() {
- return (this.texture )._uvs.y0;
- }
- get u2() {
- return (this.texture )._uvs.x2;
- }
- get v2() {
- return (this.texture )._uvs.y2;
- }
- get offsetX() {
- const tex = this.texture;
- return tex.trim ? tex.trim.x : 0;
- }
- get offsetY() {
- console.warn("Deprecation Warning: @Hackerham: I guess, if you are using PIXI-SPINE ATLAS region.offsetY, you want a texture, right? Use region.texture from now on.");
- return this.spineOffsetY;
- }
- get pixiOffsetY() {
- const tex = this.texture;
- return tex.trim ? tex.trim.y : 0;
- }
- get spineOffsetY() {
- let tex = this.texture;
- return this.originalHeight - this.height - (tex.trim ? tex.trim.y : 0);
- }
- get originalWidth() {
- return this.texture.orig.width;
- }
- get originalHeight() {
- return this.texture.orig.height;
- }
- get x() {
- return this.texture.frame.x;
- }
- get y() {
- return this.texture.frame.y;
- }
- get rotate() {
- return this.texture.rotate !== 0;
- }
- get degrees() {
- return (360 - this.texture.rotate * 45) % 360;
- }
- }
- class RegionFields {constructor() { RegionFields.prototype.__init.call(this);RegionFields.prototype.__init2.call(this);RegionFields.prototype.__init3.call(this);RegionFields.prototype.__init4.call(this);RegionFields.prototype.__init5.call(this);RegionFields.prototype.__init6.call(this);RegionFields.prototype.__init7.call(this);RegionFields.prototype.__init8.call(this);RegionFields.prototype.__init9.call(this);RegionFields.prototype.__init10.call(this); }
- __init() {this.x = 0;}
- __init2() {this.y = 0;}
- __init3() {this.width = 0;}
- __init4() {this.height = 0;}
- __init5() {this.offsetX = 0;}
- __init6() {this.offsetY = 0;}
- __init7() {this.originalWidth = 0;}
- __init8() {this.originalHeight = 0;}
- __init9() {this.rotate = 0;}
- __init10() {this.index = 0;}
- }
- /**
- * @public
- */
- class TextureAtlas {
- __init11() {this.pages = new Array();}
- __init12() {this.regions = new Array();}
- constructor(atlasText, textureLoader, callback) {TextureAtlas.prototype.__init11.call(this);TextureAtlas.prototype.__init12.call(this);
- if (atlasText) {
- this.addSpineAtlas(atlasText, textureLoader, callback);
- }
- }
- addTexture(name, texture) {
- let pages = this.pages;
- let page = null;
- for (let i = 0; i < pages.length; i++) {
- if (pages[i].baseTexture === texture.baseTexture) {
- page = pages[i];
- break;
- }
- }
- if (page === null) {
- page = new TextureAtlasPage();
- page.name = 'texturePage';
- let baseTexture = texture.baseTexture;
- page.width = baseTexture.realWidth;
- page.height = baseTexture.realHeight;
- page.baseTexture = baseTexture;
- //those fields are not relevant in Pixi
- page.minFilter = page.magFilter = exports.TextureFilter.Nearest;
- page.uWrap = exports.TextureWrap.ClampToEdge;
- page.vWrap = exports.TextureWrap.ClampToEdge;
- pages.push(page);
- }
- let region = new TextureAtlasRegion();
- region.name = name;
- region.page = page;
- region.texture = texture;
- region.index = -1;
- this.regions.push(region);
- return region;
- }
- addTextureHash(textures, stripExtension) {
- for (let key in textures) {
- if (textures.hasOwnProperty(key)) {
- this.addTexture(stripExtension && key.indexOf('.') !== -1 ? key.substr(0, key.lastIndexOf('.')) : key, textures[key]);
- }
- }
- }
- addSpineAtlas(atlasText, textureLoader, callback) {
- return this.load(atlasText, textureLoader, callback);
- }
- load(atlasText, textureLoader, callback) {
- if (textureLoader == null)
- throw new Error("textureLoader cannot be null.");
- let reader = new TextureAtlasReader(atlasText);
- let entry = new Array(4);
- let page = null;
- let pageFields = {};
- let region = null;
- pageFields["size"] = () => {
- page.width = parseInt(entry[1]);
- page.height = parseInt(entry[2]);
- };
- pageFields["format"] = () => {
- // page.format = Format[tuple[0]]; we don't need format in WebGL
- };
- pageFields["filter"] = () => {
- page.minFilter = filterFromString(entry[1]);
- page.magFilter = filterFromString(entry[2]);
- };
- pageFields["repeat"] = () => {
- if (entry[1].indexOf('x') != -1) page.uWrap = exports.TextureWrap.Repeat;
- if (entry[1].indexOf('y') != -1) page.vWrap = exports.TextureWrap.Repeat;
- };
- pageFields["pma"] = () => {
- page.pma = entry[1] == "true";
- };
- let regionFields = {};
- regionFields["xy"] = () => { // Deprecated, use bounds.
- region.x = parseInt(entry[1]);
- region.y = parseInt(entry[2]);
- };
- regionFields["size"] = () => { // Deprecated, use bounds.
- region.width = parseInt(entry[1]);
- region.height = parseInt(entry[2]);
- };
- regionFields["bounds"] = () => {
- region.x = parseInt(entry[1]);
- region.y = parseInt(entry[2]);
- region.width = parseInt(entry[3]);
- region.height = parseInt(entry[4]);
- };
- regionFields["offset"] = () => { // Deprecated, use offsets.
- region.offsetX = parseInt(entry[1]);
- region.offsetY = parseInt(entry[2]);
- };
- regionFields["orig"] = () => { // Deprecated, use offsets.
- region.originalWidth = parseInt(entry[1]);
- region.originalHeight = parseInt(entry[2]);
- };
- regionFields["offsets"] = () => {
- region.offsetX = parseInt(entry[1]);
- region.offsetY = parseInt(entry[2]);
- region.originalWidth = parseInt(entry[3]);
- region.originalHeight = parseInt(entry[4]);
- };
- regionFields["rotate"] = () => {
- let rotateValue = entry[1];
- let rotate = 0;
- if (rotateValue.toLocaleLowerCase() == "true") {
- rotate = 6;
- } else if (rotateValue.toLocaleLowerCase() == "false") {
- rotate = 0;
- } else {
- rotate = ((720 - parseFloat(rotateValue)) % 360) / 45;
- }
- region.rotate = rotate;
- };
- regionFields["index"] = () => {
- region.index = parseInt(entry[1]);
- };
- let line = reader.readLine();
- // Ignore empty lines before first entry.
- while (line != null && line.trim().length == 0)
- line = reader.readLine();
- // Header entries.
- while (true) {
- if (line == null || line.trim().length == 0) break;
- if (reader.readEntry(entry, line) == 0) break; // Silently ignore all header fields.
- line = reader.readLine();
- }
- let iterateParser = () => {
- while (true) {
- if (line == null) {
- return callback && callback(this);
- }
- if (line.trim().length == 0) {
- page = null;
- line = reader.readLine();
- } else if (page === null) {
- page = new TextureAtlasPage();
- page.name = line.trim();
- while (true) {
- if (reader.readEntry(entry, line = reader.readLine()) == 0) break;
- let field = pageFields[entry[0]];
- if (field) field();
- }
- this.pages.push(page);
- textureLoader(page.name, (texture) => {
- if (texture === null) {
- this.pages.splice(this.pages.indexOf(page), 1);
- return callback && callback(null);
- }
- page.baseTexture = texture;
- //TODO: set scaleMode and mipmapMode from spine
- if (page.pma) {
- texture.alphaMode = constants.ALPHA_MODES.PMA;
- }
- if (!texture.valid) {
- texture.setSize(page.width, page.height);
- }
- this.pages.push(page);
- page.setFilters();
- if (!page.width || !page.height) {
- page.width = texture.realWidth;
- page.height = texture.realHeight;
- if (!page.width || !page.height) {
- console.log("ERROR spine atlas page " + page.name + ": meshes wont work if you dont specify size in atlas (http://www.html5gamedevs.com/topic/18888-pixi-spines-and-meshes/?p=107121)");
- }
- }
- iterateParser();
- });
- this.pages.push(page);
- break;
- } else {
- region = new RegionFields();
- let atlasRegion = new TextureAtlasRegion();
- atlasRegion.name = line;
- atlasRegion.page = page;
- let names = null;
- let values = null;
- while (true) {
- let count = reader.readEntry(entry, line = reader.readLine());
- if (count == 0) break;
- let field = regionFields[entry[0]];
- if (field)
- field();
- else {
- if (names == null) {
- names = [];
- values = [];
- }
- names.push(entry[0]);
- let entryValues = [];
- for (let i = 0; i < count; i++)
- entryValues.push(parseInt(entry[i + 1]));
- values.push(entryValues);
- }
- }
- if (region.originalWidth == 0 && region.originalHeight == 0) {
- region.originalWidth = region.width;
- region.originalHeight = region.height;
- }
- let resolution = page.baseTexture.resolution;
- region.x /= resolution;
- region.y /= resolution;
- region.width /= resolution;
- region.height /= resolution;
- region.originalWidth /= resolution;
- region.originalHeight /= resolution;
- region.offsetX /= resolution;
- region.offsetY /= resolution;
- const swapWH = region.rotate % 4 !== 0;
- let frame = new math.Rectangle(region.x, region.y, swapWH ? region.height : region.width, swapWH ? region.width : region.height);
- let orig = new math.Rectangle(0, 0, region.originalWidth, region.originalHeight);
- let trim = new math.Rectangle(region.offsetX, region.originalHeight - region.height - region.offsetY, region.width, region.height);
- atlasRegion.texture = new core.Texture(atlasRegion.page.baseTexture, frame, orig, trim, region.rotate);
- atlasRegion.index = region.index;
- atlasRegion.texture.updateUvs();
- this.regions.push(atlasRegion);
- }
- }
- };
- iterateParser();
- }
- findRegion(name) {
- for (let i = 0; i < this.regions.length; i++) {
- if (this.regions[i].name == name) {
- return this.regions[i];
- }
- }
- return null;
- }
- dispose() {
- for (let i = 0; i < this.pages.length; i++) {
- this.pages[i].baseTexture.dispose();
- }
- }
- }
- /**
- * @public
- */
- class TextureAtlasReader {
-
- __init13() {this.index = 0;}
- constructor(text) {TextureAtlasReader.prototype.__init13.call(this);
- this.lines = text.split(/\r\n|\r|\n/);
- }
- readLine() {
- if (this.index >= this.lines.length)
- return null;
- return this.lines[this.index++];
- }
- readEntry (entry, line) {
- if (line == null) return 0;
- line = line.trim();
- if (line.length == 0) return 0;
- let colon = line.indexOf(':');
- if (colon == -1) return 0;
- entry[0] = line.substr(0, colon).trim();
- for (let i = 1, lastMatch = colon + 1;; i++) {
- let comma = line.indexOf(',', lastMatch);
- if (comma == -1) {
- entry[i] = line.substr(lastMatch).trim();
- return i;
- }
- entry[i] = line.substr(lastMatch, comma - lastMatch).trim();
- lastMatch = comma + 1;
- if (i == 4) return 4;
- }
- }
- }
- /**
- * @public
- */
- class TextureAtlasPage {constructor() { TextureAtlasPage.prototype.__init14.call(this);TextureAtlasPage.prototype.__init15.call(this);TextureAtlasPage.prototype.__init16.call(this);TextureAtlasPage.prototype.__init17.call(this); }
-
- __init14() {this.minFilter = exports.TextureFilter.Nearest;}
- __init15() {this.magFilter = exports.TextureFilter.Nearest;}
- __init16() {this.uWrap = exports.TextureWrap.ClampToEdge;}
- __init17() {this.vWrap = exports.TextureWrap.ClampToEdge;}
-
-
-
-
- setFilters() {
- let tex = this.baseTexture;
- let filter = this.minFilter;
- if (filter == exports.TextureFilter.Linear) {
- tex.scaleMode = constants.SCALE_MODES.LINEAR;
- } else if (this.minFilter == exports.TextureFilter.Nearest) {
- tex.scaleMode = constants.SCALE_MODES.NEAREST;
- } else {
- tex.mipmap = constants.MIPMAP_MODES.POW2;
- if (filter == exports.TextureFilter.MipMapNearestNearest) {
- tex.scaleMode = constants.SCALE_MODES.NEAREST;
- } else {
- tex.scaleMode = constants.SCALE_MODES.LINEAR;
- }
- }
- }
- }
- /**
- * @public
- */
- class TextureAtlasRegion extends TextureRegion {
-
-
-
- }
- let fround_polyfill = (function(array) {
- return function(x) {
- return array[0] = x, array[0];
- };
- })(new Float32Array(1));
- let fround =
- (Math ).fround || fround_polyfill;
- /**
- * @public
- */
- /**
- * @public
- */
- class IntSet {constructor() { IntSet.prototype.__init.call(this); }
- __init() {this.array = new Array();}
- add (value) {
- let contains = this.contains(value);
- this.array[value | 0] = value | 0;
- return !contains;
- }
- contains (value) {
- return this.array[value | 0] != undefined;
- }
- remove (value) {
- this.array[value | 0] = undefined;
- }
- clear () {
- this.array.length = 0;
- }
- }
- /**
- * @public
- */
- class StringSet {constructor() { StringSet.prototype.__init2.call(this);StringSet.prototype.__init3.call(this); }
- __init2() {this.entries = {};}
- __init3() {this.size = 0;}
- add (value) {
- let contains = this.entries[value];
- this.entries[value] = true;
- if (!contains) this.size++;
- return contains != true;
- }
- addAll (values) {
- let oldSize = this.size;
- for (var i = 0, n = values.length; i < n; i++) {
- this.add(values[i]);
- }
- return oldSize != this.size;
- }
- contains (value) {
- let contains = this.entries[value];
- return contains == true;
- }
- clear () {
- this.entries = {};
- this.size = 0;
- }
- }
- /**
- * @public
- */
- /**
- * @public
- */
- class Color {
- static __initStatic() {this.WHITE = new Color(1, 1, 1, 1);}
- static __initStatic2() {this.RED = new Color(1, 0, 0, 1);}
- static __initStatic3() {this.GREEN = new Color(0, 1, 0, 1);}
- static __initStatic4() {this.BLUE = new Color(0, 0, 1, 1);}
- static __initStatic5() {this.MAGENTA = new Color(1, 0, 1, 1);}
- constructor ( r = 0, g = 0, b = 0, a = 0) {this.r = r;this.g = g;this.b = b;this.a = a;
- }
- set (r, g, b, a) {
- this.r = r;
- this.g = g;
- this.b = b;
- this.a = a;
- this.clamp();
- return this;
- }
- setFromColor (c) {
- this.r = c.r;
- this.g = c.g;
- this.b = c.b;
- this.a = c.a;
- return this;
- }
- setFromString (hex) {
- hex = hex.charAt(0) == '#' ? hex.substr(1) : hex;
- this.r = parseInt(hex.substr(0, 2), 16) / 255.0;
- this.g = parseInt(hex.substr(2, 2), 16) / 255.0;
- this.b = parseInt(hex.substr(4, 2), 16) / 255.0;
- this.a = (hex.length != 8 ? 255 : parseInt(hex.substr(6, 2), 16)) / 255.0;
- return this;
- }
- add (r, g, b, a) {
- this.r += r;
- this.g += g;
- this.b += b;
- this.a += a;
- this.clamp();
- return this;
- }
- clamp () {
- if (this.r < 0) this.r = 0;
- else if (this.r > 1) this.r = 1;
- if (this.g < 0) this.g = 0;
- else if (this.g > 1) this.g = 1;
- if (this.b < 0) this.b = 0;
- else if (this.b > 1) this.b = 1;
- if (this.a < 0) this.a = 0;
- else if (this.a > 1) this.a = 1;
- return this;
- }
- static rgba8888ToColor(color, value) {
- color.r = ((value & 0xff000000) >>> 24) / 255;
- color.g = ((value & 0x00ff0000) >>> 16) / 255;
- color.b = ((value & 0x0000ff00) >>> 8) / 255;
- color.a = ((value & 0x000000ff)) / 255;
- }
- static rgb888ToColor (color, value) {
- color.r = ((value & 0x00ff0000) >>> 16) / 255;
- color.g = ((value & 0x0000ff00) >>> 8) / 255;
- color.b = ((value & 0x000000ff)) / 255;
- }
- } Color.__initStatic(); Color.__initStatic2(); Color.__initStatic3(); Color.__initStatic4(); Color.__initStatic5();
- /**
- * @public
- */
- class MathUtils {
- static __initStatic6() {this.PI = 3.1415927;}
- static __initStatic7() {this.PI2 = MathUtils.PI * 2;}
- static __initStatic8() {this.radiansToDegrees = 180 / MathUtils.PI;}
- static __initStatic9() {this.radDeg = MathUtils.radiansToDegrees;}
- static __initStatic10() {this.degreesToRadians = MathUtils.PI / 180;}
- static __initStatic11() {this.degRad = MathUtils.degreesToRadians;}
- static clamp (value, min, max) {
- if (value < min) return min;
- if (value > max) return max;
- return value;
- }
- static cosDeg (degrees) {
- return Math.cos(degrees * MathUtils.degRad);
- }
- static sinDeg (degrees) {
- return Math.sin(degrees * MathUtils.degRad);
- }
- static signum (value) {
- return value > 0 ? 1 : value < 0 ? -1 : 0;
- }
- static toInt (x) {
- return x > 0 ? Math.floor(x) : Math.ceil(x);
- }
- static cbrt (x) {
- let y = Math.pow(Math.abs(x), 1/3);
- return x < 0 ? -y : y;
- }
- static randomTriangular (min, max) {
- return MathUtils.randomTriangularWith(min, max, (min + max) * 0.5);
- }
- static randomTriangularWith (min, max, mode) {
- let u = Math.random();
- let d = max - min;
- if (u <= (mode - min) / d) return min + Math.sqrt(u * d * (mode - min));
- return max - Math.sqrt((1 - u) * d * (max - mode));
- }
- } MathUtils.__initStatic6(); MathUtils.__initStatic7(); MathUtils.__initStatic8(); MathUtils.__initStatic9(); MathUtils.__initStatic10(); MathUtils.__initStatic11();
- /**
- * @public
- */
- class Interpolation {
-
- apply(start, end, a) {
- return start + (end - start) * this.applyInternal(a);
- }
- }
- /**
- * @public
- */
- class Pow extends Interpolation {
- __init4() {this.power = 2;}
- constructor (power) {
- super();Pow.prototype.__init4.call(this); this.power = power;
- }
- applyInternal (a) {
- if (a <= 0.5) return Math.pow(a * 2, this.power) / 2;
- return Math.pow((a - 1) * 2, this.power) / (this.power % 2 == 0 ? -2 : 2) + 1;
- }
- }
- /**
- * @public
- */
- class PowOut extends Pow {
- constructor (power) {
- super(power);
- }
- applyInternal (a) {
- return Math.pow(a - 1, this.power) * (this.power % 2 == 0 ? -1 : 1) + 1;
- }
- }
- /**
- * @public
- */
- class Utils {
- static __initStatic12() {this.SUPPORTS_TYPED_ARRAYS = typeof(Float32Array) !== "undefined";}
- static arrayCopy (source, sourceStart, dest, destStart, numElements) {
- for (let i = sourceStart, j = destStart; i < sourceStart + numElements; i++, j++) {
- dest[j] = source[i];
- }
- }
- static arrayFill (array, fromIndex, toIndex, value) {
- for (let i = fromIndex; i < toIndex; i++)
- array[i] = value;
- }
- static setArraySize (array, size, value = 0) {
- let oldSize = array.length;
- if (oldSize == size) return array;
- array.length = size;
- if (oldSize < size) {
- for (let i = oldSize; i < size; i++) array[i] = value;
- }
- return array;
- }
- static ensureArrayCapacity (array, size, value = 0) {
- if (array.length >= size) return array;
- return Utils.setArraySize(array, size, value);
- }
- static newArray (size, defaultValue) {
- let array = new Array(size);
- for (let i = 0; i < size; i++) array[i] = defaultValue;
- return array;
- }
- static newFloatArray (size) {
- if (Utils.SUPPORTS_TYPED_ARRAYS) {
- return new Float32Array(size)
- } else {
- let array = new Array(size);
- for (let i = 0; i < array.length; i++) array[i] = 0;
- return array;
- }
- }
- static newShortArray (size) {
- if (Utils.SUPPORTS_TYPED_ARRAYS) {
- return new Int16Array(size)
- } else {
- let array = new Array(size);
- for (let i = 0; i < array.length; i++) array[i] = 0;
- return array;
- }
- }
- static toFloatArray (array) {
- return Utils.SUPPORTS_TYPED_ARRAYS ? new Float32Array(array) : array;
- }
- static toSinglePrecision (value) {
- return Utils.SUPPORTS_TYPED_ARRAYS ? fround(value) : value;
- }
- // This function is used to fix WebKit 602 specific issue described at http://esotericsoftware.com/forum/iOS-10-disappearing-graphics-10109
- static webkit602BugfixHelper (alpha, blend) {
- }
- static contains (array, element, identity = true) {
- for (let i = 0; i < array.length; i++) {
- if (array[i] == element) return true;
- }
- return false;
- }
-
- } Utils.__initStatic12();
- /**
- * @public
- */
- class DebugUtils {
- static logBones(skeleton) {
- for (let i = 0; i < skeleton.bones.length; i++) {
- let bone = skeleton.bones[i];
- let mat = bone.matrix;
- console.log(bone.data.name + ", " + mat.a + ", " + mat.b + ", " + mat.c + ", " + mat.d + ", " + mat.tx + ", " + mat.ty);
- }
- }
- }
- /**
- * @public
- */
- class Pool {
- __init5() {this.items = new Array();}
-
- constructor (instantiator) {Pool.prototype.__init5.call(this);
- this.instantiator = instantiator;
- }
- obtain () {
- return this.items.length > 0 ? this.items.pop() : this.instantiator();
- }
- free (item) {
- if ((item ).reset) (item ).reset();
- this.items.push(item);
- }
- freeAll (items) {
- for (let i = 0; i < items.length; i++) {
- this.free(items[i]);
- }
- }
- clear () {
- this.items.length = 0;
- }
- }
- /**
- * @public
- */
- class Vector2 {
- constructor ( x = 0, y = 0) {this.x = x;this.y = y;
- }
- set (x, y) {
- this.x = x;
- this.y = y;
- return this;
- }
- length () {
- let x = this.x;
- let y = this.y;
- return Math.sqrt(x * x + y * y);
- }
- normalize () {
- let len = this.length();
- if (len != 0) {
- this.x /= len;
- this.y /= len;
- }
- return this;
- }
- }
- /**
- * @public
- */
- class TimeKeeper {constructor() { TimeKeeper.prototype.__init6.call(this);TimeKeeper.prototype.__init7.call(this);TimeKeeper.prototype.__init8.call(this);TimeKeeper.prototype.__init9.call(this);TimeKeeper.prototype.__init10.call(this);TimeKeeper.prototype.__init11.call(this);TimeKeeper.prototype.__init12.call(this); }
- __init6() {this.maxDelta = 0.064;}
- __init7() {this.framesPerSecond = 0;}
- __init8() {this.delta = 0;}
- __init9() {this.totalTime = 0;}
- __init10() {this.lastTime = Date.now() / 1000;}
- __init11() {this.frameCount = 0;}
- __init12() {this.frameTime = 0;}
- update () {
- let now = Date.now() / 1000;
- this.delta = now - this.lastTime;
- this.frameTime += this.delta;
- this.totalTime += this.delta;
- if (this.delta > this.maxDelta) this.delta = this.maxDelta;
- this.lastTime = now;
- this.frameCount++;
- if (this.frameTime > 1) {
- this.framesPerSecond = this.frameCount / this.frameTime;
- this.frameTime = 0;
- this.frameCount = 0;
- }
- }
- }
- /**
- * @public
- */
- /**
- * @public
- */
- class WindowedMean {
-
- __init13() {this.addedValues = 0;}
- __init14() {this.lastValue = 0;}
- __init15() {this.mean = 0;}
- __init16() {this.dirty = true;}
- constructor (windowSize = 32) {WindowedMean.prototype.__init13.call(this);WindowedMean.prototype.__init14.call(this);WindowedMean.prototype.__init15.call(this);WindowedMean.prototype.__init16.call(this);
- this.values = new Array(windowSize);
- }
- hasEnoughData () {
- return this.addedValues >= this.values.length;
- }
- addValue (value) {
- if (this.addedValues < this.values.length)
- this.addedValues++;
- this.values[this.lastValue++] = value;
- if (this.lastValue > this.values.length - 1) this.lastValue = 0;
- this.dirty = true;
- }
- getMean () {
- if (this.hasEnoughData()) {
- if (this.dirty) {
- let mean = 0;
- for (let i = 0; i < this.values.length; i++) {
- mean += this.values[i];
- }
- this.mean = mean / this.values.length;
- this.dirty = false;
- }
- return this.mean;
- } else {
- return 0;
- }
- }
- }
- /**
- * @public
- */
- let settings = {
- yDown: true,
- /**
- * pixi-spine gives option to not fail at certain parsing errors
- * spine-ts fails here
- */
- FAIL_ON_NON_EXISTING_SKIN: false,
- /**
- * past Spine.globalAutoUpdate
- */
- GLOBAL_AUTO_UPDATE: true,
- /**
- * past Spine.globalDelayLimit
- */
- GLOBAL_DELAY_LIMIT: 0,
- };
- let tempRgb = [0, 0, 0];
- /**
- * @public
- */
- /**
- * @public
- */
- class SpineSprite extends sprite.Sprite {constructor(...args) { super(...args); SpineSprite.prototype.__init.call(this);SpineSprite.prototype.__init2.call(this); }
- __init() {this.region = null;}
- __init2() {this.attachment = null;}
- }
- /**
- * @public
- */
- class SpineMesh extends meshExtras.SimpleMesh {
- __init3() {this.region = null;}
- __init4() {this.attachment = null;}
- constructor(texture, vertices, uvs, indices, drawMode) {
- super(texture, vertices, uvs, indices, drawMode);SpineMesh.prototype.__init3.call(this);SpineMesh.prototype.__init4.call(this); }
- }
- /**
- * A class that enables the you to import and run your spine animations in pixi.
- * The Spine animation data needs to be loaded using either the Loader or a SpineLoader before it can be used by this class
- * See example 12 (http://www.goodboydigital.com/pixijs/examples/12/) to see a working example and check out the source
- *
- * ```js
- * let spineAnimation = new spine(spineData);
- * ```
- *
- * @public
- * @class
- * @extends Container
- * @memberof spine
- * @param spineData {object} The spine data loaded from a spine atlas.
- */
- class SpineBase
- extends display.Container {
-
-
-
-
-
-
-
-
-
-
-
- constructor(spineData) {
- super();
- if (!spineData) {
- throw new Error('The spineData param is required.');
- }
- if ((typeof spineData) === "string") {
- throw new Error('spineData param cant be string. Please use spine.Spine.fromAtlas("YOUR_RESOURCE_NAME") from now on.');
- }
- /**
- * The spineData object
- *
- * @member {object}
- */
- this.spineData = spineData;
- /**
- * A spine Skeleton object
- *
- * @member {object}
- */
- this.createSkeleton(spineData);
- /**
- * An array of containers
- *
- * @member {Container[]}
- */
- this.slotContainers = [];
- this.tempClipContainers = [];
- for (let i = 0, n = this.skeleton.slots.length; i < n; i++) {
- let slot = this.skeleton.slots[i];
- let attachment = slot.getAttachment();
- let slotContainer = this.newContainer();
- this.slotContainers.push(slotContainer);
- this.addChild(slotContainer);
- this.tempClipContainers.push(null);
- if (!attachment) {
- continue;
- }
- if (attachment.type === exports.AttachmentType.Region) {
- let spriteName = (attachment.region ).name;
- let sprite = this.createSprite(slot, attachment , spriteName);
- slot.currentSprite = sprite;
- slot.currentSpriteName = spriteName;
- slotContainer.addChild(sprite);
- } else if (attachment.type === exports.AttachmentType.Mesh) {
- let mesh = this.createMesh(slot, attachment);
- slot.currentMesh = mesh;
- slot.currentMeshId = attachment.id;
- slot.currentMeshName = attachment.name;
- slotContainer.addChild(mesh);
- } else if (attachment.type === exports.AttachmentType.Clipping) {
- this.createGraphics(slot, attachment);
- slotContainer.addChild(slot.clippingContainer);
- slotContainer.addChild(slot.currentGraphics);
- }
- }
- /**
- * The tint applied to all spine slots. This is a [r,g,b] value. A value of [1,1,1] will remove any tint effect.
- *
- * @member {number}
- * @memberof spine.Spine#
- */
- this.tintRgb = new Float32Array([1, 1, 1]);
- this.autoUpdate = true;
- this.visible = true;
- }
- /**
- * If this flag is set to true, the spine animation will be automatically updated every
- * time the object id drawn. The down side of this approach is that the delta time is
- * automatically calculated and you could miss out on cool effects like slow motion,
- * pause, skip ahead and the sorts. Most of these effects can be achieved even with
- * autoUpdate enabled but are harder to achieve.
- *
- * @member {boolean}
- * @memberof spine.Spine#
- * @default true
- */
- get autoUpdate() {
- return this._autoUpdate;
- }
- set autoUpdate(value) {
- if (value !== this._autoUpdate) {
- this._autoUpdate = value;
- this.updateTransform = value ? SpineBase.prototype.autoUpdateTransform : display.Container.prototype.updateTransform;
- }
- }
- /**
- * The tint applied to the spine object. This is a hex value. A value of 0xFFFFFF will remove any tint effect.
- *
- * @member {number}
- * @memberof spine.Spine#
- * @default 0xFFFFFF
- */
- get tint() {
- return utils.rgb2hex(this.tintRgb );
- }
- set tint(value) {
- this.tintRgb = utils.hex2rgb(value, this.tintRgb );
- }
- /**
- * Limit value for the update dt with Spine.globalDelayLimit
- * that can be overridden with localDelayLimit
- * @return {number} - Maximum processed dt value for the update
- */
- get delayLimit() {
- let limit = typeof this.localDelayLimit !== "undefined" ?
- this.localDelayLimit : settings.GLOBAL_DELAY_LIMIT;
- // If limit is 0, this means there is no limit for the delay
- return limit || Number.MAX_VALUE
- }
- /**
- * Update the spine skeleton and its animations by delta time (dt)
- *
- * @param dt {number} Delta time. Time by which the animation should be updated
- */
- update(dt) {
- // Limit delta value to avoid animation jumps
- let delayLimit = this.delayLimit;
- if (dt > delayLimit) dt = delayLimit;
- this.state.update(dt);
- this.state.apply(this.skeleton);
- //check we haven't been destroyed via a spine event callback in state update
- if (!this.skeleton)
- return;
- this.skeleton.updateWorldTransform();
- let slots = this.skeleton.slots;
- // in case pixi has double tint
- let globalClr = (this ).color;
- let light = null, dark = null;
- if (globalClr) {
- light = globalClr.light;
- dark = globalClr.dark;
- } else {
- light = this.tintRgb;
- }
- // let thack = false;
- for (let i = 0, n = slots.length; i < n; i++) {
- let slot = slots[i];
- let attachment = slot.getAttachment();
- let slotContainer = this.slotContainers[i];
- if (!attachment) {
- slotContainer.visible = false;
- continue;
- }
- let spriteColor = null;
- let attColor = (attachment ).color;
- switch (attachment.type) {
- case exports.AttachmentType.Region:
- let region = (attachment ).region;
- if (region) {
- if (slot.currentMesh) {
- slot.currentMesh.visible = false;
- slot.currentMesh = null;
- slot.currentMeshId = undefined;
- slot.currentMeshName = undefined;
- }
- let ar = region ;
- if (!slot.currentSpriteName || slot.currentSpriteName !== ar.name) {
- let spriteName = ar.name;
- if (slot.currentSprite) {
- slot.currentSprite.visible = false;
- }
- slot.sprites = slot.sprites || {};
- if (slot.sprites[spriteName] !== undefined) {
- slot.sprites[spriteName].visible = true;
- } else {
- let sprite = this.createSprite(slot, attachment , spriteName);
- slotContainer.addChild(sprite);
- }
- slot.currentSprite = slot.sprites[spriteName];
- slot.currentSpriteName = spriteName;
- // force sprite update when attachment name is same.
- // issues https://github.com/pixijs/pixi-spine/issues/318
- } else if (slot.currentSpriteName === ar.name && !slot.hackRegion) {
- this.setSpriteRegion(attachment , slot.currentSprite, region);
- }
- }
- let transform = slotContainer.transform;
- transform.setFromMatrix(slot.bone.matrix);
- if (slot.currentSprite.color) {
- //YAY! double - tint!
- spriteColor = slot.currentSprite.color;
- } else {
- tempRgb[0] = light[0] * slot.color.r * attColor.r;
- tempRgb[1] = light[1] * slot.color.g * attColor.g;
- tempRgb[2] = light[2] * slot.color.b * attColor.b;
- slot.currentSprite.tint = utils.rgb2hex(tempRgb);
- }
- slot.currentSprite.blendMode = slot.blendMode;
- break;
- case exports.AttachmentType.Mesh:
- if (slot.currentSprite) {
- //TODO: refactor this thing, switch it on and off for container
- slot.currentSprite.visible = false;
- slot.currentSprite = null;
- slot.currentSpriteName = undefined;
- //TODO: refactor this shit
- const transform = new math.Transform();
- (transform )._parentID = -1;
- (transform )._worldID = (slotContainer.transform )._worldID;
- slotContainer.transform = transform;
- }
- const id = (attachment ).id;
- if (!slot.currentMeshId || slot.currentMeshId !== id) {
- let meshId = id;
- if (slot.currentMesh) {
- slot.currentMesh.visible = false;
- }
- slot.meshes = slot.meshes || {};
- if (slot.meshes[meshId] !== undefined) {
- slot.meshes[meshId].visible = true;
- } else {
- let mesh = this.createMesh(slot, attachment );
- slotContainer.addChild(mesh);
- }
- slot.currentMesh = slot.meshes[meshId];
- slot.currentMeshName = attachment.name;
- slot.currentMeshId = meshId;
- }
- (attachment ).computeWorldVerticesOld(slot, slot.currentMesh.vertices);
- if (slot.currentMesh.color) {
- // pixi-heaven
- spriteColor = slot.currentMesh.color;
- } else {
- tempRgb[0] = light[0] * slot.color.r * attColor.r;
- tempRgb[1] = light[1] * slot.color.g * attColor.g;
- tempRgb[2] = light[2] * slot.color.b * attColor.b;
- slot.currentMesh.tint = utils.rgb2hex(tempRgb);
- }
- slot.currentMesh.blendMode = slot.blendMode;
- break;
- case exports.AttachmentType.Clipping:
- if (!slot.currentGraphics) {
- this.createGraphics(slot, attachment );
- slotContainer.addChild(slot.clippingContainer);
- slotContainer.addChild(slot.currentGraphics);
- }
- this.updateGraphics(slot, attachment );
- slotContainer.alpha = 1.0;
- slotContainer.visible = true;
- continue;
- default:
- slotContainer.visible = false;
- continue;
- }
- slotContainer.visible = true;
- // pixi has double tint
- if (spriteColor) {
- let r0 = slot.color.r * attColor.r;
- let g0 = slot.color.g * attColor.g;
- let b0 = slot.color.b * attColor.b;
- //YAY! double-tint!
- spriteColor.setLight(
- light[0] * r0 + dark[0] * (1.0 - r0),
- light[1] * g0 + dark[1] * (1.0 - g0),
- light[2] * b0 + dark[2] * (1.0 - b0),
- );
- if (slot.darkColor) {
- r0 = slot.darkColor.r;
- g0 = slot.darkColor.g;
- b0 = slot.darkColor.b;
- } else {
- r0 = 0.0;
- g0 = 0.0;
- b0 = 0.0;
- }
- spriteColor.setDark(
- light[0] * r0 + dark[0] * (1 - r0),
- light[1] * g0 + dark[1] * (1 - g0),
- light[2] * b0 + dark[2] * (1 - b0),
- );
- }
- slotContainer.alpha = slot.color.a;
- }
- //== this is clipping implementation ===
- //TODO: remove parent hacks when pixi masks allow it
- let drawOrder = this.skeleton.drawOrder;
- let clippingAttachment = null;
- let clippingContainer = null;
- for (let i = 0, n = drawOrder.length; i < n; i++) {
- let slot = slots[drawOrder[i].data.index];
- let slotContainer = this.slotContainers[drawOrder[i].data.index];
- if (!clippingContainer) {
- //Adding null check as it is possible for slotContainer.parent to be null in the event of a spine being disposed off in its loop callback
- if (slotContainer.parent !== null && slotContainer.parent !== this) {
- slotContainer.parent.removeChild(slotContainer);
- //silend add hack
- (slotContainer ).parent = this;
- }
- }
- if (slot.currentGraphics && slot.getAttachment()) {
- clippingContainer = slot.clippingContainer;
- clippingAttachment = slot.getAttachment() ;
- clippingContainer.children.length = 0;
- this.children[i] = slotContainer;
- if (clippingAttachment.endSlot === slot.data) {
- clippingAttachment.endSlot = null;
- }
- } else {
- if (clippingContainer) {
- let c = this.tempClipContainers[i];
- if (!c) {
- c = this.tempClipContainers[i] = this.newContainer();
- c.visible = false;
- }
- this.children[i] = c;
- //silent remove hack
- (slotContainer ).parent = null;
- clippingContainer.addChild(slotContainer);
- if (clippingAttachment.endSlot == slot.data) {
- clippingContainer.renderable = true;
- clippingContainer = null;
- clippingAttachment = null;
- }
- } else {
- this.children[i] = slotContainer;
- }
- }
- }
- };
- setSpriteRegion(attachment, sprite, region) {
- // prevent setters calling when attachment and region is same
- if (sprite.attachment === attachment && sprite.region === region) {
- return;
- }
- sprite.region = region;
- sprite.attachment = attachment;
- sprite.texture = region.texture;
- sprite.rotation = attachment.rotation * MathUtils.degRad;
- sprite.position.x = attachment.x;
- sprite.position.y = attachment.y;
- sprite.alpha = attachment.color.a;
- if (!region.size) {
- sprite.scale.x = attachment.scaleX * attachment.width / region.originalWidth;
- sprite.scale.y = -attachment.scaleY * attachment.height / region.originalHeight;
- } else {
- //hacked!
- sprite.scale.x = region.size.width / region.originalWidth;
- sprite.scale.y = -region.size.height / region.originalHeight;
- }
- }
- setMeshRegion(attachment, mesh, region) {
- if (mesh.attachment === attachment && mesh.region === region) {
- return;
- }
- mesh.region = region;
- mesh.attachment = attachment;
- mesh.texture = region.texture;
- region.texture.updateUvs();
- mesh.uvBuffer.update(attachment.regionUVs);
- }
-
- /**
- * When autoupdate is set to yes this function is used as pixi's updateTransform function
- *
- * @private
- */
- autoUpdateTransform() {
- if (settings.GLOBAL_AUTO_UPDATE) {
- this.lastTime = this.lastTime || Date.now();
- let timeDelta = (Date.now() - this.lastTime) * 0.001;
- this.lastTime = Date.now();
- this.update(timeDelta);
- } else {
- this.lastTime = 0;
- }
- display.Container.prototype.updateTransform.call(this);
- };
- /**
- * Create a new sprite to be used with core.RegionAttachment
- *
- * @param slot {spine.Slot} The slot to which the attachment is parented
- * @param attachment {spine.RegionAttachment} The attachment that the sprite will represent
- * @private
- */
- createSprite(slot, attachment, defName) {
- let region = attachment.region;
- if (slot.hackAttachment === attachment) {
- region = slot.hackRegion;
- }
- let texture = region.texture;
- let sprite = this.newSprite(texture);
- sprite.anchor.set(0.5);
- this.setSpriteRegion(attachment, sprite, attachment.region);
- slot.sprites = slot.sprites || {};
- slot.sprites[defName] = sprite;
- return sprite;
- };
- /**
- * Creates a Strip from the spine data
- * @param slot {spine.Slot} The slot to which the attachment is parented
- * @param attachment {spine.RegionAttachment} The attachment that the sprite will represent
- * @private
- */
- createMesh(slot, attachment) {
- let region = attachment.region;
- if (slot.hackAttachment === attachment) {
- region = slot.hackRegion;
- slot.hackAttachment = null;
- slot.hackRegion = null;
- }
- let strip = this.newMesh(
- region.texture,
- new Float32Array(attachment.regionUVs.length),
- attachment.regionUVs,
- new Uint16Array(attachment.triangles),
- constants.DRAW_MODES.TRIANGLES);
- if (typeof (strip )._canvasPadding !== "undefined") {
- (strip )._canvasPadding = 1.5;
- }
- strip.alpha = attachment.color.a;
- strip.region = attachment.region;
- this.setMeshRegion(attachment, strip, region);
- slot.meshes = slot.meshes || {};
- slot.meshes[attachment.id] = strip;
- return strip;
- };
- static __initStatic() {this.clippingPolygon = [];}
- //@ts-ignore
- createGraphics(slot, clip) {
- let graphics = this.newGraphics();
- let poly = new math.Polygon([]);
- graphics.clear();
- graphics.beginFill(0xffffff, 1);
- graphics.drawPolygon(poly );
- graphics.renderable = false;
- slot.currentGraphics = graphics;
- slot.clippingContainer = this.newContainer();
- slot.clippingContainer.mask = slot.currentGraphics;
- return graphics;
- }
- updateGraphics(slot, clip) {
- let geom = slot.currentGraphics.geometry;
- let vertices = (geom.graphicsData[0].shape ).points;
- let n = clip.worldVerticesLength;
- vertices.length = n;
- clip.computeWorldVertices(slot, 0, n, vertices, 0, 2);
- geom.invalidate();
- }
- /**
- * Changes texture in attachment in specific slot.
- *
- * PIXI runtime feature, it was made to satisfy our users.
- *
- * @param slotIndex {number}
- * @param [texture = null] {PIXI.Texture} If null, take default (original) texture
- * @param [size = null] {PIXI.Point} sometimes we need new size for region attachment, you can pass 'texture.orig' there
- * @returns {boolean} Success flag
- */
- hackTextureBySlotIndex(slotIndex, texture = null, size = null) {
- let slot = this.skeleton.slots[slotIndex];
- if (!slot) {
- return false;
- }
- let attachment = slot.getAttachment();
- let region = attachment.region;
- if (texture) {
- region = new TextureRegion();
- region.texture = texture;
- region.size = size;
- slot.hackRegion = region;
- slot.hackAttachment = attachment;
- } else {
- slot.hackRegion = null;
- slot.hackAttachment = null;
- }
- if (slot.currentSprite && slot.currentSprite.region != region) {
- this.setSpriteRegion(attachment, slot.currentSprite, region);
- slot.currentSprite.region = region;
- } else if (slot.currentMesh && slot.currentMesh.region != region) {
- this.setMeshRegion(attachment, slot.currentMesh, region);
- }
- return true;
- }
- /**
- * Changes texture in attachment in specific slot.
- *
- * PIXI runtime feature, it was made to satisfy our users.
- *
- * @param slotName {string}
- * @param [texture = null] {PIXI.Texture} If null, take default (original) texture
- * @param [size = null] {PIXI.Point} sometimes we need new size for region attachment, you can pass 'texture.orig' there
- * @returns {boolean} Success flag
- */
- hackTextureBySlotName(slotName, texture = null, size = null) {
- let index = this.skeleton.findSlotIndex(slotName);
- if (index == -1) {
- return false;
- }
- return this.hackTextureBySlotIndex(index, texture, size);
- }
- /**
- * Changes texture of an attachment
- *
- * PIXI runtime feature, it was made to satisfy our users.
- *
- * @param slotName {string}
- * @param attachmentName {string}
- * @param [texture = null] {PIXI.Texture} If null, take default (original) texture
- * @param [size = null] {PIXI.Point} sometimes we need new size for region attachment, you can pass 'texture.orig' there
- * @returns {boolean} Success flag
- */
- hackTextureAttachment(slotName, attachmentName, texture, size = null) {
- // changes the texture of an attachment at the skeleton level
- const slotIndex = this.skeleton.findSlotIndex(slotName);
- const attachment = this.skeleton.getAttachmentByName(slotName, attachmentName);
- attachment.region.texture = texture;
- const slot = this.skeleton.slots[slotIndex];
- if (!slot) {
- return false
- }
- // gets the currently active attachment in this slot
- const currentAttachment = slot.getAttachment();
- if (attachmentName === currentAttachment.name) {
- // if the attachment we are changing is currently active, change the the live texture
- let region = attachment.region;
- if (texture) {
- region = new TextureRegion();
- region.texture = texture;
- region.size = size;
- slot.hackRegion = region;
- slot.hackAttachment = currentAttachment;
- } else {
- slot.hackRegion = null;
- slot.hackAttachment = null;
- }
- if (slot.currentSprite && slot.currentSprite.region != region) {
- this.setSpriteRegion(currentAttachment, slot.currentSprite, region);
- slot.currentSprite.region = region;
- } else if (slot.currentMesh && slot.currentMesh.region != region) {
- this.setMeshRegion(currentAttachment, slot.currentMesh, region);
- }
- return true
- }
- return false
- }
- //those methods can be overriden to spawn different classes
- newContainer() {
- return new display.Container();
- }
- newSprite(tex) {
- return new SpineSprite(tex);
- }
- newGraphics() {
- return new graphics.Graphics();
- }
- newMesh(texture, vertices, uvs, indices, drawMode) {
- return new SpineMesh(texture, vertices, uvs, indices, drawMode);
- }
- transformHack() {
- return 1;
- }
- /**
- * Hack for pixi-display and pixi-lights. Every attachment name ending with a suffix will be added to different layer
- * @param nameSuffix
- * @param group
- * @param outGroup
- */
- hackAttachmentGroups(nameSuffix, group, outGroup) {
- if (!nameSuffix) {
- return undefined;
- }
- const list_d = [], list_n = [];
- for (let i = 0, len = this.skeleton.slots.length; i < len; i++) {
- const slot = this.skeleton.slots[i];
- const name = slot.currentSpriteName || slot.currentMeshName || "";
- const target = slot.currentSprite || slot.currentMesh;
- if (name.endsWith(nameSuffix)) {
- target.parentGroup = group;
- list_n.push(target);
- } else if (outGroup && target) {
- target.parentGroup = outGroup;
- list_d.push(target);
- }
- }
- return [list_d, list_n];
- };
- destroy(options) {
- for (let i = 0, n = this.skeleton.slots.length; i < n; i++) {
- let slot = this.skeleton.slots[i];
- for (let name in slot.meshes) {
- slot.meshes[name].destroy(options);
- }
- slot.meshes = null;
- for (let name in slot.sprites) {
- slot.sprites[name].destroy(options);
- }
- slot.sprites = null;
- }
- for (let i = 0, n = this.slotContainers.length; i < n; i++) {
- this.slotContainers[i].destroy(options);
- }
- this.spineData = null;
- this.skeleton = null;
- this.slotContainers = null;
- this.stateData = null;
- this.state = null;
- this.tempClipContainers = null;
- super.destroy(options);
- }
- } SpineBase.__initStatic();
- /**
- * The visibility of the spine object. If false the object will not be drawn,
- * the updateTransform function will not be called, and the spine will not be automatically updated.
- *
- * @member {boolean}
- * @memberof spine.Spine#
- * @default true
- */
- Object.defineProperty(SpineBase.prototype, 'visible', {
- get: function () {
- return this._visible;
- },
- set: function (value) {
- if (value !== this._visible) {
- this._visible = value;
- if (value) {
- this.lastTime = 0;
- }
- }
- }
- });
- /* eslint-disable */
- function isJson(resource) {
- return resource.type === loaders.LoaderResource.TYPE.JSON;
- }
- function isBuffer(resource) {
- return resource.xhrType === (loaders.LoaderResource ).XHR_RESPONSE_TYPE.BUFFER;
- }
- loaders.LoaderResource.setExtensionXhrType('skel', loaders.LoaderResource.XHR_RESPONSE_TYPE.BUFFER);
- /**
- * @public
- */
- class AbstractSpineParser {
-
- genMiddleware() {
- const self = this;
- return {
- use( resource, next) {
- // skip if no data, its not json, or it isn't atlas data
- if (!resource.data) {
- return next();
- }
- const isJsonSpineModel = isJson(resource) && resource.data.bones;
- const isBinarySpineModel = isBuffer(resource) && (resource.extension === 'skel' || resource.metadata
- && (resource.metadata ).spineMetadata);
- if (!isJsonSpineModel && !isBinarySpineModel) {
- return next();
- }
- let parser = null;
- let dataToParse = resource.data;
- if (isJsonSpineModel) {
- parser = self.createJsonParser();
- } else {
- parser = self.createBinaryParser();
- if (resource.data instanceof ArrayBuffer) {
- dataToParse = new Uint8Array(resource.data);
- }
- }
- const metadata = (resource.metadata || {}) ;
- const metadataSkeletonScale = metadata ? (metadata ).spineSkeletonScale : null;
- if (metadataSkeletonScale) {
- parser.scale = metadataSkeletonScale;
- }
- const metadataAtlas = metadata.spineAtlas;
- if (metadataAtlas === false) {
- return next();
- }
- if (metadataAtlas && metadataAtlas.pages) {
- self.parseData(resource, parser, metadataAtlas, dataToParse);
- return next();
- }
- const metadataAtlasSuffix = metadata.spineAtlasSuffix || '.atlas';
- /**
- * use a bit of hackery to load the atlas file, here we assume that the .json, .atlas and .png files
- * that correspond to the spine file are in the same base URL and that the .json and .atlas files
- * have the same name
- */
- let atlasPath = resource.url;
- let queryStringPos = atlasPath.indexOf('?');
- if (queryStringPos > 0) {
- //remove querystring
- atlasPath = atlasPath.substr(0, queryStringPos);
- }
- atlasPath = atlasPath.substr(0, atlasPath.lastIndexOf('.')) + metadataAtlasSuffix;
- // use atlas path as a params. (no need to use same atlas file name with json file name)
- if (metadata.spineAtlasFile) {
- atlasPath = metadata.spineAtlasFile;
- }
- //remove the baseUrl
- atlasPath = atlasPath.replace(this.baseUrl, '');
- const atlasOptions = {
- crossOrigin: resource.crossOrigin,
- xhrType: loaders.LoaderResource.XHR_RESPONSE_TYPE.TEXT,
- metadata: metadata.spineMetadata || null,
- parentResource: resource
- };
- const imageOptions = {
- crossOrigin: resource.crossOrigin,
- metadata: metadata.imageMetadata || null,
- parentResource: resource
- };
- let baseUrl = resource.url.substr(0, resource.url.lastIndexOf('/') + 1);
- //remove the baseUrl
- baseUrl = baseUrl.replace(this.baseUrl, '');
- const namePrefix = metadata.imageNamePrefix || (resource.name + '_atlas_page_');
- const adapter = metadata.images ? staticImageLoader(metadata.images)
- : metadata.image ? staticImageLoader({'default': metadata.image})
- : metadata.imageLoader ? metadata.imageLoader(this, namePrefix, baseUrl, imageOptions)
- : imageLoaderAdapter(this, namePrefix, baseUrl, imageOptions);
- function createSkeletonWithRawAtlas(rawData) {
- new TextureAtlas(rawData, adapter, function(spineAtlas) {
- if (spineAtlas) {
- self.parseData(resource, parser, spineAtlas, dataToParse);
- }
- next();
- });
- }
- if (metadata.atlasRawData) {
- createSkeletonWithRawAtlas(metadata.atlasRawData);
- } else {
- this.add(resource.name + '_atlas', atlasPath, atlasOptions, function (atlasResource) {
- if (!atlasResource.error) {
- createSkeletonWithRawAtlas(atlasResource.data);
- } else {
- next();
- }
- });
- }
- }
- }
- }
- }
- /**
- * @public
- */
- function imageLoaderAdapter(loader, namePrefix, baseUrl, imageOptions) {
- if (baseUrl && baseUrl.lastIndexOf('/') !== (baseUrl.length - 1)) {
- baseUrl += '/';
- }
- return function (line, callback) {
- const name = namePrefix + line;
- const url = baseUrl + line;
- const cachedResource = loader.resources[name];
- if (cachedResource) {
- const done = () => {
- callback(cachedResource.texture.baseTexture);
- };
- if (cachedResource.texture) {
- done();
- } else {
- cachedResource.onAfterMiddleware.add(done);
- }
- } else {
- loader.add(name, url, imageOptions, (resource) => {
- if (!resource.error) {
- if (line.indexOf('-pma.') >= 0) {
- resource.texture.baseTexture.alphaMode = constants.ALPHA_MODES.PMA;
- }
- callback(resource.texture.baseTexture);
- } else {
- callback(null);
- }
- });
- }
- }
- }
- /**
- * @public
- */
- function syncImageLoaderAdapter(baseUrl, crossOrigin) {
- if (baseUrl && baseUrl.lastIndexOf('/') !== (baseUrl.length - 1)) {
- baseUrl += '/';
- }
- return function (line, callback) {
- callback(core.BaseTexture.from(line, crossOrigin));
- }
- }
- /**
- * @public
- */
- function staticImageLoader(pages) {
- return function (line, callback) {
- let page = pages[line] || pages['default'] ;
- if (page && page.baseTexture)
- callback(page.baseTexture);
- else
- callback(page);
- }
- }
- /* eslint-disable */
- /**
- * @public
- */
- class Attachment {
-
-
- constructor(name) {
- if (name == null) throw new Error("name cannot be null.");
- this.name = name;
- }
-
- }
- /**
- * @public
- */
- class VertexAttachment extends Attachment {
- static __initStatic() {this.nextID = 0;}
- __init() {this.id = (VertexAttachment.nextID++ & 65535) << 11;}
-
-
- __init2() {this.worldVerticesLength = 0;}
- __init3() {this.deformAttachment = this;}
- constructor(name) {
- super(name);VertexAttachment.prototype.__init.call(this);VertexAttachment.prototype.__init2.call(this);VertexAttachment.prototype.__init3.call(this); }
- computeWorldVerticesOld(slot, worldVertices) {
- this.computeWorldVertices(slot, 0, this.worldVerticesLength, worldVertices, 0, 2);
- }
- /** Transforms local vertices to world coordinates.
- * @param start The index of the first local vertex value to transform. Each vertex has 2 values, x and y.
- * @param count The number of world vertex values to output. Must be <= {@link #getWorldVerticesLength()} - start.
- * @param worldVertices The output world vertices. Must have a length >= offset + count.
- * @param offset The worldVertices index to begin writing values. */
- computeWorldVertices (slot, start, count, worldVertices, offset, stride) {
- count = offset + (count >> 1) * stride;
- let skeleton = slot.bone.skeleton;
- let deformArray = slot.deform;
- let vertices = this.vertices;
- let bones = this.bones;
- if (bones == null) {
- if (deformArray.length > 0) vertices = deformArray;
- let mat = slot.bone.matrix;
- let x = mat.tx;
- let y = mat.ty;
- let a = mat.a, b = mat.c, c = mat.b, d = mat.d;
- for (let v = start, w = offset; w < count; v += 2, w += stride) {
- let vx = vertices[v], vy = vertices[v + 1];
- worldVertices[w] = vx * a + vy * b + x;
- worldVertices[w + 1] = vx * c + vy * d + y;
- }
- return;
- }
- let v = 0, skip = 0;
- for (let i = 0; i < start; i += 2) {
- let n = bones[v];
- v += n + 1;
- skip += n;
- }
- let skeletonBones = skeleton.bones;
- if (deformArray.length == 0) {
- for (let w = offset, b = skip * 3; w < count; w += stride) {
- let wx = 0, wy = 0;
- let n = bones[v++];
- n += v;
- for (; v < n; v++, b += 3) {
- let mat = skeletonBones[bones[v]].matrix;
- let vx = vertices[b], vy = vertices[b + 1], weight = vertices[b + 2];
- wx += (vx * mat.a + vy * mat.c + mat.tx) * weight;
- wy += (vx * mat.b + vy * mat.d + mat.ty) * weight;
- }
- worldVertices[w] = wx;
- worldVertices[w + 1] = wy;
- }
- } else {
- let deform = deformArray;
- for (let w = offset, b = skip * 3, f = skip << 1; w < count; w += stride) {
- let wx = 0, wy = 0;
- let n = bones[v++];
- n += v;
- for (; v < n; v++, b += 3, f += 2) {
- let mat = skeletonBones[bones[v]].matrix;
- let vx = vertices[b] + deform[f], vy = vertices[b + 1] + deform[f + 1], weight = vertices[b + 2];
- wx += (vx * mat.a + vy * mat.c + mat.tx) * weight;
- wy += (vx * mat.b + vy * mat.d + mat.ty) * weight;
- }
- worldVertices[w] = wx;
- worldVertices[w + 1] = wy;
- }
- }
- }
- copyTo (attachment) {
- if (this.bones != null) {
- attachment.bones = new Array(this.bones.length);
- Utils.arrayCopy(this.bones, 0, attachment.bones, 0, this.bones.length);
- } else
- attachment.bones = null;
- if (this.vertices != null) {
- attachment.vertices = Utils.newFloatArray(this.vertices.length);
- Utils.arrayCopy(this.vertices, 0, attachment.vertices, 0, this.vertices.length);
- } else
- attachment.vertices = null;
- attachment.worldVerticesLength = this.worldVerticesLength;
- attachment.deformAttachment = this.deformAttachment;
- }
- } VertexAttachment.__initStatic();
- /**
- * @public
- */
- class BoundingBoxAttachment extends VertexAttachment {
- __init() {this.type = exports.AttachmentType.BoundingBox;}
- __init2() {this.color = new Color(1, 1, 1, 1);}
- constructor (name) {
- super(name);BoundingBoxAttachment.prototype.__init.call(this);BoundingBoxAttachment.prototype.__init2.call(this); }
- copy () {
- let copy = new BoundingBoxAttachment(this.name);
- this.copyTo(copy);
- copy.color.setFromColor(this.color);
- return copy;
- }
- }
- /**
- * @public
- */
- class ClippingAttachment extends VertexAttachment {
- __init() {this.type = exports.AttachmentType.Clipping;}
-
- // Nonessential.
- __init2() {this.color = new Color(0.2275, 0.2275, 0.8078, 1);} // ce3a3aff
- constructor (name) {
- super(name);ClippingAttachment.prototype.__init.call(this);ClippingAttachment.prototype.__init2.call(this); }
- copy () {
- let copy = new ClippingAttachment(this.name);
- this.copyTo(copy);
- copy.endSlot = this.endSlot;
- copy.color.setFromColor(this.color);
- return copy;
- }
- }
- /**
- * @public
- */
- class MeshAttachment extends VertexAttachment {
- __init() {this.type = exports.AttachmentType.Mesh;}
-
-
-
-
- __init2() {this.color = new Color(1, 1, 1, 1);}
-
-
-
-
-
- __init3() {this.tempColor = new Color(0, 0, 0, 0);}
- constructor (name) {
- super(name);MeshAttachment.prototype.__init.call(this);MeshAttachment.prototype.__init2.call(this);MeshAttachment.prototype.__init3.call(this); }
- getParentMesh () {
- return this.parentMesh;
- }
- /** @param parentMesh May be null. */
- setParentMesh (parentMesh) {
- this.parentMesh = parentMesh;
- if (parentMesh != null) {
- this.bones = parentMesh.bones;
- this.vertices = parentMesh.vertices;
- this.worldVerticesLength = parentMesh.worldVerticesLength;
- this.regionUVs = parentMesh.regionUVs;
- this.triangles = parentMesh.triangles;
- this.hullLength = parentMesh.hullLength;
- this.worldVerticesLength = parentMesh.worldVerticesLength;
- }
- }
- copy () {
- if (this.parentMesh != null) return this.newLinkedMesh();
- let copy = new MeshAttachment(this.name);
- copy.region = this.region;
- copy.path = this.path;
- copy.color.setFromColor(this.color);
- this.copyTo(copy);
- copy.regionUVs = new Float32Array(this.regionUVs.length);
- Utils.arrayCopy(this.regionUVs, 0, copy.regionUVs, 0, this.regionUVs.length);
- copy.triangles = new Array(this.triangles.length);
- Utils.arrayCopy(this.triangles, 0, copy.triangles, 0, this.triangles.length);
- copy.hullLength = this.hullLength;
- // Nonessential.
- if (this.edges != null) {
- copy.edges = new Array(this.edges.length);
- Utils.arrayCopy(this.edges, 0, copy.edges, 0, this.edges.length);
- }
- copy.width = this.width;
- copy.height = this.height;
- return copy;
- }
- newLinkedMesh () {
- let copy = new MeshAttachment(this.name);
- copy.region = this.region;
- copy.path = this.path;
- copy.color.setFromColor(this.color);
- copy.deformAttachment = this.deformAttachment;
- copy.setParentMesh(this.parentMesh != null ? this.parentMesh : this);
- // copy.updateUVs();
- return copy;
- }
- }
- /**
- * @public
- */
- class PathAttachment extends VertexAttachment {
- __init() {this.type = exports.AttachmentType.Path;}
-
- __init2() {this.closed = false;} __init3() {this.constantSpeed = false;}
- __init4() {this.color = new Color(1, 1, 1, 1);}
- constructor (name) {
- super(name);PathAttachment.prototype.__init.call(this);PathAttachment.prototype.__init2.call(this);PathAttachment.prototype.__init3.call(this);PathAttachment.prototype.__init4.call(this); }
- copy () {
- let copy = new PathAttachment(this.name);
- this.copyTo(copy);
- copy.lengths = new Array(this.lengths.length);
- Utils.arrayCopy(this.lengths, 0, copy.lengths, 0, this.lengths.length);
- copy.closed = closed;
- copy.constantSpeed = this.constantSpeed;
- copy.color.setFromColor(this.color);
- return copy;
- }
- }
- /**
- * @public
- */
- class PointAttachment extends VertexAttachment {
- __init() {this.type = exports.AttachmentType.Point;}
-
- __init2() {this.color = new Color(0.38, 0.94, 0, 1);}
- constructor (name) {
- super(name);PointAttachment.prototype.__init.call(this);PointAttachment.prototype.__init2.call(this); }
- computeWorldPosition(bone, point) {
- const mat = bone.matrix;
- point.x = this.x * mat.a + this.y * mat.c + bone.worldX;
- point.y = this.x * mat.b + this.y * mat.d + bone.worldY;
- return point;
- }
- computeWorldRotation(bone) {
- const mat = bone.matrix;
- let cos = MathUtils.cosDeg(this.rotation), sin = MathUtils.sinDeg(this.rotation);
- let x = cos * mat.a + sin * mat.c;
- let y = cos * mat.b + sin * mat.d;
- return Math.atan2(y, x) * MathUtils.radDeg;
- }
- copy () {
- let copy = new PointAttachment(this.name);
- copy.x = this.x;
- copy.y = this.y;
- copy.rotation = this.rotation;
- copy.color.setFromColor(this.color);
- return copy;
- }
- }
- /**
- * @public
- */
- class RegionAttachment extends Attachment {
- __init() {this.type = exports.AttachmentType.Region;}
- static __initStatic() {this.OX1 = 0;}
- static __initStatic2() {this.OY1 = 1;}
- static __initStatic3() {this.OX2 = 2;}
- static __initStatic4() {this.OY2 = 3;}
- static __initStatic5() {this.OX3 = 4;}
- static __initStatic6() {this.OY3 = 5;}
- static __initStatic7() {this.OX4 = 6;}
- static __initStatic8() {this.OY4 = 7;}
- static __initStatic9() {this.X1 = 0;}
- static __initStatic10() {this.Y1 = 1;}
- static __initStatic11() {this.C1R = 2;}
- static __initStatic12() {this.C1G = 3;}
- static __initStatic13() {this.C1B = 4;}
- static __initStatic14() {this.C1A = 5;}
- static __initStatic15() {this.U1 = 6;}
- static __initStatic16() {this.V1 = 7;}
- static __initStatic17() {this.X2 = 8;}
- static __initStatic18() {this.Y2 = 9;}
- static __initStatic19() {this.C2R = 10;}
- static __initStatic20() {this.C2G = 11;}
- static __initStatic21() {this.C2B = 12;}
- static __initStatic22() {this.C2A = 13;}
- static __initStatic23() {this.U2 = 14;}
- static __initStatic24() {this.V2 = 15;}
- static __initStatic25() {this.X3 = 16;}
- static __initStatic26() {this.Y3 = 17;}
- static __initStatic27() {this.C3R = 18;}
- static __initStatic28() {this.C3G = 19;}
- static __initStatic29() {this.C3B = 20;}
- static __initStatic30() {this.C3A = 21;}
- static __initStatic31() {this.U3 = 22;}
- static __initStatic32() {this.V3 = 23;}
- static __initStatic33() {this.X4 = 24;}
- static __initStatic34() {this.Y4 = 25;}
- static __initStatic35() {this.C4R = 26;}
- static __initStatic36() {this.C4G = 27;}
- static __initStatic37() {this.C4B = 28;}
- static __initStatic38() {this.C4A = 29;}
- static __initStatic39() {this.U4 = 30;}
- static __initStatic40() {this.V4 = 31;}
- __init2() {this.x = 0;}
- __init3() {this.y = 0;}
- __init4() {this.scaleX = 1;}
- __init5() {this.scaleY = 1;}
- __init6() {this.rotation = 0;}
- __init7() {this.width = 0;}
- __init8() {this.height = 0;}
- __init9() {this.color = new Color(1, 1, 1, 1);}
-
-
-
- __init10() {this.offset = Utils.newFloatArray(8);}
- __init11() {this.uvs = Utils.newFloatArray(8);}
- __init12() {this.tempColor = new Color(1, 1, 1, 1);}
- constructor(name) {
- super(name);RegionAttachment.prototype.__init.call(this);RegionAttachment.prototype.__init2.call(this);RegionAttachment.prototype.__init3.call(this);RegionAttachment.prototype.__init4.call(this);RegionAttachment.prototype.__init5.call(this);RegionAttachment.prototype.__init6.call(this);RegionAttachment.prototype.__init7.call(this);RegionAttachment.prototype.__init8.call(this);RegionAttachment.prototype.__init9.call(this);RegionAttachment.prototype.__init10.call(this);RegionAttachment.prototype.__init11.call(this);RegionAttachment.prototype.__init12.call(this); }
- updateOffset() {
- let regionScaleX = this.width / this.region.originalWidth * this.scaleX;
- let regionScaleY = this.height / this.region.originalHeight * this.scaleY;
- let localX = -this.width / 2 * this.scaleX + this.region.offsetX * regionScaleX;
- let localY = -this.height / 2 * this.scaleY + this.region.offsetY * regionScaleY;
- let localX2 = localX + this.region.width * regionScaleX;
- let localY2 = localY + this.region.height * regionScaleY;
- let radians = this.rotation * Math.PI / 180;
- let cos = Math.cos(radians);
- let sin = Math.sin(radians);
- let localXCos = localX * cos + this.x;
- let localXSin = localX * sin;
- let localYCos = localY * cos + this.y;
- let localYSin = localY * sin;
- let localX2Cos = localX2 * cos + this.x;
- let localX2Sin = localX2 * sin;
- let localY2Cos = localY2 * cos + this.y;
- let localY2Sin = localY2 * sin;
- let offset = this.offset;
- offset[RegionAttachment.OX1] = localXCos - localYSin;
- offset[RegionAttachment.OY1] = localYCos + localXSin;
- offset[RegionAttachment.OX2] = localXCos - localY2Sin;
- offset[RegionAttachment.OY2] = localY2Cos + localXSin;
- offset[RegionAttachment.OX3] = localX2Cos - localY2Sin;
- offset[RegionAttachment.OY3] = localY2Cos + localX2Sin;
- offset[RegionAttachment.OX4] = localX2Cos - localYSin;
- offset[RegionAttachment.OY4] = localYCos + localX2Sin;
- }
- setRegion(region) {
- this.region = region;
- let uvs = this.uvs;
- if (region.rotate) {
- uvs[2] = region.u;
- uvs[3] = region.v2;
- uvs[4] = region.u;
- uvs[5] = region.v;
- uvs[6] = region.u2;
- uvs[7] = region.v;
- uvs[0] = region.u2;
- uvs[1] = region.v2;
- } else {
- uvs[0] = region.u;
- uvs[1] = region.v2;
- uvs[2] = region.u;
- uvs[3] = region.v;
- uvs[4] = region.u2;
- uvs[5] = region.v;
- uvs[6] = region.u2;
- uvs[7] = region.v2;
- }
- }
- computeWorldVertices(bone, worldVertices, offset, stride) {
- let vertexOffset = this.offset;
- let mat = bone.matrix;
- let x = mat.tx, y = mat.ty;
- let a = mat.a, b = mat.c, c = mat.b, d = mat.d;
- let offsetX = 0, offsetY = 0;
- offsetX = vertexOffset[RegionAttachment.OX1];
- offsetY = vertexOffset[RegionAttachment.OY1];
- worldVertices[offset] = offsetX * a + offsetY * b + x; // br
- worldVertices[offset + 1] = offsetX * c + offsetY * d + y;
- offset += stride;
- offsetX = vertexOffset[RegionAttachment.OX2];
- offsetY = vertexOffset[RegionAttachment.OY2];
- worldVertices[offset] = offsetX * a + offsetY * b + x; // bl
- worldVertices[offset + 1] = offsetX * c + offsetY * d + y;
- offset += stride;
- offsetX = vertexOffset[RegionAttachment.OX3];
- offsetY = vertexOffset[RegionAttachment.OY3];
- worldVertices[offset] = offsetX * a + offsetY * b + x; // ul
- worldVertices[offset + 1] = offsetX * c + offsetY * d + y;
- offset += stride;
- offsetX = vertexOffset[RegionAttachment.OX4];
- offsetY = vertexOffset[RegionAttachment.OY4];
- worldVertices[offset] = offsetX * a + offsetY * b + x; // ur
- worldVertices[offset + 1] = offsetX * c + offsetY * d + y;
- }
- copy () {
- let copy = new RegionAttachment(this.name);
- copy.region = this.region;
- copy.rendererObject = this.rendererObject;
- copy.path = this.path;
- copy.x = this.x;
- copy.y = this.y;
- copy.scaleX = this.scaleX;
- copy.scaleY = this.scaleY;
- copy.rotation = this.rotation;
- copy.width = this.width;
- copy.height = this.height;
- Utils.arrayCopy(this.uvs, 0, copy.uvs, 0, 8);
- Utils.arrayCopy(this.offset, 0, copy.offset, 0, 8);
- copy.color.setFromColor(this.color);
- return copy;
- }
- } RegionAttachment.__initStatic(); RegionAttachment.__initStatic2(); RegionAttachment.__initStatic3(); RegionAttachment.__initStatic4(); RegionAttachment.__initStatic5(); RegionAttachment.__initStatic6(); RegionAttachment.__initStatic7(); RegionAttachment.__initStatic8(); RegionAttachment.__initStatic9(); RegionAttachment.__initStatic10(); RegionAttachment.__initStatic11(); RegionAttachment.__initStatic12(); RegionAttachment.__initStatic13(); RegionAttachment.__initStatic14(); RegionAttachment.__initStatic15(); RegionAttachment.__initStatic16(); RegionAttachment.__initStatic17(); RegionAttachment.__initStatic18(); RegionAttachment.__initStatic19(); RegionAttachment.__initStatic20(); RegionAttachment.__initStatic21(); RegionAttachment.__initStatic22(); RegionAttachment.__initStatic23(); RegionAttachment.__initStatic24(); RegionAttachment.__initStatic25(); RegionAttachment.__initStatic26(); RegionAttachment.__initStatic27(); RegionAttachment.__initStatic28(); RegionAttachment.__initStatic29(); RegionAttachment.__initStatic30(); RegionAttachment.__initStatic31(); RegionAttachment.__initStatic32(); RegionAttachment.__initStatic33(); RegionAttachment.__initStatic34(); RegionAttachment.__initStatic35(); RegionAttachment.__initStatic36(); RegionAttachment.__initStatic37(); RegionAttachment.__initStatic38(); RegionAttachment.__initStatic39(); RegionAttachment.__initStatic40();
- /**
- * @public
- */
- class JitterEffect {
- __init() {this.jitterX = 0;}
- __init2() {this.jitterY = 0;}
- constructor (jitterX, jitterY) {JitterEffect.prototype.__init.call(this);JitterEffect.prototype.__init2.call(this);
- this.jitterX = jitterX;
- this.jitterY = jitterY;
- }
- begin(skeleton) {
- }
- transform(position, uv, light, dark) {
- position.x += MathUtils.randomTriangular(-this.jitterX, this.jitterY);
- position.y += MathUtils.randomTriangular(-this.jitterX, this.jitterY);
- }
- end() {
- }
- }
- /**
- * @public
- */
- class SwirlEffect {
- static __initStatic() {this.interpolation = new PowOut(2);}
- __init() {this.centerX = 0;}
- __init2() {this.centerY = 0;}
- __init3() {this.radius = 0;}
- __init4() {this.angle = 0;}
- __init5() {this.worldX = 0;}
- __init6() {this.worldY = 0;}
- constructor (radius) {SwirlEffect.prototype.__init.call(this);SwirlEffect.prototype.__init2.call(this);SwirlEffect.prototype.__init3.call(this);SwirlEffect.prototype.__init4.call(this);SwirlEffect.prototype.__init5.call(this);SwirlEffect.prototype.__init6.call(this);
- this.radius = radius;
- }
- begin(skeleton) {
- this.worldX = skeleton.x + this.centerX;
- this.worldY = skeleton.y + this.centerY;
- }
- transform(position, uv, light, dark) {
- let radAngle = this.angle * MathUtils.degreesToRadians;
- let x = position.x - this.worldX;
- let y = position.y - this.worldY;
- let dist = Math.sqrt(x * x + y * y);
- if (dist < this.radius) {
- let theta = SwirlEffect.interpolation.apply(0, radAngle, (this.radius - dist) / this.radius);
- let cos = Math.cos(theta);
- let sin = Math.sin(theta);
- position.x = cos * x - sin * y + this.worldX;
- position.y = sin * x + cos * y + this.worldY;
- }
- }
- end() {
- }
- } SwirlEffect.__initStatic();
- /** A simple container for a list of timelines and a name. */
- /**
- * @public
- */
- class Animation {
- /** The animation's name, which is unique across all animations in the skeleton. */
-
-
-
- /** The duration of the animation in seconds, which is the highest time of all keys in the timeline. */
-
- constructor (name, timelines, duration) {
- if (name == null) throw new Error("name cannot be null.");
- if (timelines == null) throw new Error("timelines cannot be null.");
- this.name = name;
- this.timelines = timelines;
- this.timelineIds = [];
- for (var i = 0; i < timelines.length; i++)
- this.timelineIds[timelines[i].getPropertyId()] = true;
- this.duration = duration;
- }
- hasTimeline (id) {
- return this.timelineIds[id] == true;
- }
- /** Applies all the animation's timelines to the specified skeleton.
- *
- * See Timeline {@link Timeline#apply(Skeleton, float, float, Array, float, MixBlend, MixDirection)}.
- * @param loop If true, the animation repeats after {@link #getDuration()}.
- * @param events May be null to ignore fired events. */
- apply (skeleton, lastTime, time, loop, events, alpha, blend, direction) {
- if (skeleton == null) throw new Error("skeleton cannot be null.");
- if (loop && this.duration != 0) {
- time %= this.duration;
- if (lastTime > 0) lastTime %= this.duration;
- }
- let timelines = this.timelines;
- for (let i = 0, n = timelines.length; i < n; i++)
- timelines[i].apply(skeleton, lastTime, time, events, alpha, blend, direction);
- }
- /** @param target After the first and before the last value.
- * @returns index of first value greater than the target. */
- static binarySearch (values, target, step = 1) {
- let low = 0;
- let high = values.length / step - 2;
- if (high == 0) return step;
- let current = high >>> 1;
- while (true) {
- if (values[(current + 1) * step] <= target)
- low = current + 1;
- else
- high = current;
- if (low == high) return (low + 1) * step;
- current = (low + high) >>> 1;
- }
- }
- static linearSearch (values, target, step) {
- for (let i = 0, last = values.length - step; i <= last; i += step)
- if (values[i] > target) return i;
- return -1;
- }
- }
- /** The interface for all timelines. */
- /**
- * @public
- */
- /** Controls how a timeline value is mixed with the setup pose value or current pose value when a timeline's `alpha`
- * < 1.
- *
- * See Timeline {@link Timeline#apply(Skeleton, float, float, Array, float, MixBlend, MixDirection)}. */
- /**
- * @public
- */
- var MixBlend; (function (MixBlend) {
- /** Transitions from the setup value to the timeline value (the current value is not used). Before the first key, the setup
- * value is set. */
- const setup = 0; MixBlend[MixBlend["setup"] = setup] = "setup";
- /** Transitions from the current value to the timeline value. Before the first key, transitions from the current value to
- * the setup value. Timelines which perform instant transitions, such as {@link DrawOrderTimeline} or
- * {@link AttachmentTimeline}, use the setup value before the first key.
- *
- * `first` is intended for the first animations applied, not for animations layered on top of those. */
- const first = setup + 1; MixBlend[MixBlend["first"] = first] = "first";
- /** Transitions from the current value to the timeline value. No change is made before the first key (the current value is
- * kept until the first key).
- *
- * `replace` is intended for animations layered on top of others, not for the first animations applied. */
- const replace = first + 1; MixBlend[MixBlend["replace"] = replace] = "replace";
- /** Transitions from the current value to the current value plus the timeline value. No change is made before the first key
- * (the current value is kept until the first key).
- *
- * `add` is intended for animations layered on top of others, not for the first animations applied. Properties
- * keyed by additive animations must be set manually or by another animation before applying the additive animations, else
- * the property values will increase continually. */
- const add = replace + 1; MixBlend[MixBlend["add"] = add] = "add";
- })(MixBlend || (MixBlend = {}));
- /** Indicates whether a timeline's `alpha` is mixing out over time toward 0 (the setup or current pose value) or
- * mixing in toward 1 (the timeline's value).
- *
- * See Timeline {@link Timeline#apply(Skeleton, float, float, Array, float, MixBlend, MixDirection)}. */
- /**
- * @public
- */
- var MixDirection; (function (MixDirection) {
- const mixIn = 0; MixDirection[MixDirection["mixIn"] = mixIn] = "mixIn"; const mixOut = mixIn + 1; MixDirection[MixDirection["mixOut"] = mixOut] = "mixOut";
- })(MixDirection || (MixDirection = {}));
- /**
- * @public
- */
- var TimelineType; (function (TimelineType) {
- const rotate = 0; TimelineType[TimelineType["rotate"] = rotate] = "rotate"; const translate = rotate + 1; TimelineType[TimelineType["translate"] = translate] = "translate"; const scale = translate + 1; TimelineType[TimelineType["scale"] = scale] = "scale"; const shear = scale + 1; TimelineType[TimelineType["shear"] = shear] = "shear";
- const attachment = shear + 1; TimelineType[TimelineType["attachment"] = attachment] = "attachment"; const color = attachment + 1; TimelineType[TimelineType["color"] = color] = "color"; const deform = color + 1; TimelineType[TimelineType["deform"] = deform] = "deform";
- const event = deform + 1; TimelineType[TimelineType["event"] = event] = "event"; const drawOrder = event + 1; TimelineType[TimelineType["drawOrder"] = drawOrder] = "drawOrder";
- const ikConstraint = drawOrder + 1; TimelineType[TimelineType["ikConstraint"] = ikConstraint] = "ikConstraint"; const transformConstraint = ikConstraint + 1; TimelineType[TimelineType["transformConstraint"] = transformConstraint] = "transformConstraint";
- const pathConstraintPosition = transformConstraint + 1; TimelineType[TimelineType["pathConstraintPosition"] = pathConstraintPosition] = "pathConstraintPosition"; const pathConstraintSpacing = pathConstraintPosition + 1; TimelineType[TimelineType["pathConstraintSpacing"] = pathConstraintSpacing] = "pathConstraintSpacing"; const pathConstraintMix = pathConstraintSpacing + 1; TimelineType[TimelineType["pathConstraintMix"] = pathConstraintMix] = "pathConstraintMix";
- const twoColor = pathConstraintMix + 1; TimelineType[TimelineType["twoColor"] = twoColor] = "twoColor";
- })(TimelineType || (TimelineType = {}));
- /** The base class for timelines that use interpolation between key frame values. */
- /**
- * @public
- */
- class CurveTimeline {
- static __initStatic() {this.LINEAR = 0;} static __initStatic2() {this.STEPPED = 1;} static __initStatic3() {this.BEZIER = 2;}
- static __initStatic4() {this.BEZIER_SIZE = 10 * 2 - 1;}
- // type, x, y, ...
-
- constructor (frameCount) {
- if (frameCount <= 0) throw new Error("frameCount must be > 0: " + frameCount);
- this.curves = Utils.newFloatArray((frameCount - 1) * CurveTimeline.BEZIER_SIZE);
- }
- /** The number of key frames for this timeline. */
- getFrameCount () {
- return this.curves.length / CurveTimeline.BEZIER_SIZE + 1;
- }
- /** Sets the specified key frame to linear interpolation. */
- setLinear (frameIndex) {
- this.curves[frameIndex * CurveTimeline.BEZIER_SIZE] = CurveTimeline.LINEAR;
- }
- /** Sets the specified key frame to stepped interpolation. */
- setStepped (frameIndex) {
- this.curves[frameIndex * CurveTimeline.BEZIER_SIZE] = CurveTimeline.STEPPED;
- }
- /** Returns the interpolation type for the specified key frame.
- * @returns Linear is 0, stepped is 1, Bezier is 2. */
- getCurveType (frameIndex) {
- let index = frameIndex * CurveTimeline.BEZIER_SIZE;
- if (index == this.curves.length) return CurveTimeline.LINEAR;
- let type = this.curves[index];
- if (type == CurveTimeline.LINEAR) return CurveTimeline.LINEAR;
- if (type == CurveTimeline.STEPPED) return CurveTimeline.STEPPED;
- return CurveTimeline.BEZIER;
- }
- /** Sets the specified key frame to Bezier interpolation. `cx1` and `cx2` are from 0 to 1,
- * representing the percent of time between the two key frames. `cy1` and `cy2` are the percent of the
- * difference between the key frame's values. */
- setCurve (frameIndex, cx1, cy1, cx2, cy2) {
- let tmpx = (-cx1 * 2 + cx2) * 0.03, tmpy = (-cy1 * 2 + cy2) * 0.03;
- let dddfx = ((cx1 - cx2) * 3 + 1) * 0.006, dddfy = ((cy1 - cy2) * 3 + 1) * 0.006;
- let ddfx = tmpx * 2 + dddfx, ddfy = tmpy * 2 + dddfy;
- let dfx = cx1 * 0.3 + tmpx + dddfx * 0.16666667, dfy = cy1 * 0.3 + tmpy + dddfy * 0.16666667;
- let i = frameIndex * CurveTimeline.BEZIER_SIZE;
- let curves = this.curves;
- curves[i++] = CurveTimeline.BEZIER;
- let x = dfx, y = dfy;
- for (let n = i + CurveTimeline.BEZIER_SIZE - 1; i < n; i += 2) {
- curves[i] = x;
- curves[i + 1] = y;
- dfx += ddfx;
- dfy += ddfy;
- ddfx += dddfx;
- ddfy += dddfy;
- x += dfx;
- y += dfy;
- }
- }
- /** Returns the interpolated percentage for the specified key frame and linear percentage. */
- getCurvePercent (frameIndex, percent) {
- percent = MathUtils.clamp(percent, 0, 1);
- let curves = this.curves;
- let i = frameIndex * CurveTimeline.BEZIER_SIZE;
- let type = curves[i];
- if (type == CurveTimeline.LINEAR) return percent;
- if (type == CurveTimeline.STEPPED) return 0;
- i++;
- let x = 0;
- for (let start = i, n = i + CurveTimeline.BEZIER_SIZE - 1; i < n; i += 2) {
- x = curves[i];
- if (x >= percent) {
- let prevX, prevY;
- if (i == start) {
- prevX = 0;
- prevY = 0;
- } else {
- prevX = curves[i - 2];
- prevY = curves[i - 1];
- }
- return prevY + (curves[i + 1] - prevY) * (percent - prevX) / (x - prevX);
- }
- }
- let y = curves[i - 1];
- return y + (1 - y) * (percent - x) / (1 - x); // Last point is 1,1.
- }
-
- } CurveTimeline.__initStatic(); CurveTimeline.__initStatic2(); CurveTimeline.__initStatic3(); CurveTimeline.__initStatic4();
- /** Changes a bone's local {@link Bone#rotation}. */
- /**
- * @public
- */
- class RotateTimeline extends CurveTimeline {
- static __initStatic5() {this.ENTRIES = 2;}
- static __initStatic6() {this.PREV_TIME = -2;} static __initStatic7() {this.PREV_ROTATION = -1;}
- static __initStatic8() {this.ROTATION = 1;}
- /** The index of the bone in {@link Skeleton#bones} that will be changed. */
-
- /** The time in seconds and rotation in degrees for each key frame. */
- // time, degrees, ...
- constructor (frameCount) {
- super(frameCount);
- this.frames = Utils.newFloatArray(frameCount << 1);
- }
- getPropertyId () {
- return (TimelineType.rotate << 24) + this.boneIndex;
- }
- /** Sets the time and angle of the specified keyframe. */
- setFrame (frameIndex, time, degrees) {
- frameIndex <<= 1;
- this.frames[frameIndex] = time;
- this.frames[frameIndex + RotateTimeline.ROTATION] = degrees;
- }
- apply (skeleton, lastTime, time, events, alpha, blend, direction) {
- let frames = this.frames;
- let bone = skeleton.bones[this.boneIndex];
- if (!bone.active) return;
- if (time < frames[0]) {
- switch (blend) {
- case MixBlend.setup:
- bone.rotation = bone.data.rotation;
- return;
- case MixBlend.first:
- let r = bone.data.rotation - bone.rotation;
- bone.rotation += (r - (16384 - ((16384.499999999996 - r / 360) | 0)) * 360) * alpha;
- }
- return;
- }
- if (time >= frames[frames.length - RotateTimeline.ENTRIES]) { // Time is after last frame.
- let r = frames[frames.length + RotateTimeline.PREV_ROTATION];
- switch (blend) {
- case MixBlend.setup:
- bone.rotation = bone.data.rotation + r * alpha;
- break;
- case MixBlend.first:
- case MixBlend.replace:
- r += bone.data.rotation - bone.rotation;
- r -= (16384 - ((16384.499999999996 - r / 360) | 0)) * 360; // Wrap within -180 and 180.
- case MixBlend.add:
- bone.rotation += r * alpha;
- }
- return;
- }
- // Interpolate between the previous frame and the current frame.
- let frame = Animation.binarySearch(frames, time, RotateTimeline.ENTRIES);
- let prevRotation = frames[frame + RotateTimeline.PREV_ROTATION];
- let frameTime = frames[frame];
- let percent = this.getCurvePercent((frame >> 1) - 1,
- 1 - (time - frameTime) / (frames[frame + RotateTimeline.PREV_TIME] - frameTime));
- let r = frames[frame + RotateTimeline.ROTATION] - prevRotation;
- r = prevRotation + (r - (16384 - ((16384.499999999996 - r / 360) | 0)) * 360) * percent;
- switch (blend) {
- case MixBlend.setup:
- bone.rotation = bone.data.rotation + (r - (16384 - ((16384.499999999996 - r / 360) | 0)) * 360) * alpha;
- break;
- case MixBlend.first:
- case MixBlend.replace:
- r += bone.data.rotation - bone.rotation;
- case MixBlend.add:
- bone.rotation += (r - (16384 - ((16384.499999999996 - r / 360) | 0)) * 360) * alpha;
- }
- }
- } RotateTimeline.__initStatic5(); RotateTimeline.__initStatic6(); RotateTimeline.__initStatic7(); RotateTimeline.__initStatic8();
- /** Changes a bone's local {@link Bone#x} and {@link Bone#y}. */
- /**
- * @public
- */
- class TranslateTimeline extends CurveTimeline {
- static __initStatic9() {this.ENTRIES = 3;}
- static __initStatic10() {this.PREV_TIME = -3;} static __initStatic11() {this.PREV_X = -2;} static __initStatic12() {this.PREV_Y = -1;}
- static __initStatic13() {this.X = 1;} static __initStatic14() {this.Y = 2;}
- /** The index of the bone in {@link Skeleton#bones} that will be changed. */
-
- /** The time in seconds, x, and y values for each key frame. */
- // time, x, y, ...
- constructor (frameCount) {
- super(frameCount);
- this.frames = Utils.newFloatArray(frameCount * TranslateTimeline.ENTRIES);
- }
- getPropertyId () {
- return (TimelineType.translate << 24) + this.boneIndex;
- }
- /** Sets the time in seconds, x, and y values for the specified key frame. */
- setFrame (frameIndex, time, x, y) {
- frameIndex *= TranslateTimeline.ENTRIES;
- this.frames[frameIndex] = time;
- this.frames[frameIndex + TranslateTimeline.X] = x;
- this.frames[frameIndex + TranslateTimeline.Y] = y;
- }
- apply (skeleton, lastTime, time, events, alpha, blend, direction) {
- let frames = this.frames;
- let bone = skeleton.bones[this.boneIndex];
- if (!bone.active) return;
- if (time < frames[0]) {
- switch (blend) {
- case MixBlend.setup:
- bone.x = bone.data.x;
- bone.y = bone.data.y;
- return;
- case MixBlend.first:
- bone.x += (bone.data.x - bone.x) * alpha;
- bone.y += (bone.data.y - bone.y) * alpha;
- }
- return;
- }
- let x = 0, y = 0;
- if (time >= frames[frames.length - TranslateTimeline.ENTRIES]) { // Time is after last frame.
- x = frames[frames.length + TranslateTimeline.PREV_X];
- y = frames[frames.length + TranslateTimeline.PREV_Y];
- } else {
- // Interpolate between the previous frame and the current frame.
- let frame = Animation.binarySearch(frames, time, TranslateTimeline.ENTRIES);
- x = frames[frame + TranslateTimeline.PREV_X];
- y = frames[frame + TranslateTimeline.PREV_Y];
- let frameTime = frames[frame];
- let percent = this.getCurvePercent(frame / TranslateTimeline.ENTRIES - 1,
- 1 - (time - frameTime) / (frames[frame + TranslateTimeline.PREV_TIME] - frameTime));
- x += (frames[frame + TranslateTimeline.X] - x) * percent;
- y += (frames[frame + TranslateTimeline.Y] - y) * percent;
- }
- switch (blend) {
- case MixBlend.setup:
- bone.x = bone.data.x + x * alpha;
- bone.y = bone.data.y + y * alpha;
- break;
- case MixBlend.first:
- case MixBlend.replace:
- bone.x += (bone.data.x + x - bone.x) * alpha;
- bone.y += (bone.data.y + y - bone.y) * alpha;
- break;
- case MixBlend.add:
- bone.x += x * alpha;
- bone.y += y * alpha;
- }
- }
- } TranslateTimeline.__initStatic9(); TranslateTimeline.__initStatic10(); TranslateTimeline.__initStatic11(); TranslateTimeline.__initStatic12(); TranslateTimeline.__initStatic13(); TranslateTimeline.__initStatic14();
- /** Changes a bone's local {@link Bone#scaleX)} and {@link Bone#scaleY}. */
- /**
- * @public
- */
- class ScaleTimeline extends TranslateTimeline {
- constructor (frameCount) {
- super(frameCount);
- }
- getPropertyId () {
- return (TimelineType.scale << 24) + this.boneIndex;
- }
- apply (skeleton, lastTime, time, events, alpha, blend, direction) {
- let frames = this.frames;
- let bone = skeleton.bones[this.boneIndex];
- if (!bone.active) return;
- if (time < frames[0]) {
- switch (blend) {
- case MixBlend.setup:
- bone.scaleX = bone.data.scaleX;
- bone.scaleY = bone.data.scaleY;
- return;
- case MixBlend.first:
- bone.scaleX += (bone.data.scaleX - bone.scaleX) * alpha;
- bone.scaleY += (bone.data.scaleY - bone.scaleY) * alpha;
- }
- return;
- }
- let x = 0, y = 0;
- if (time >= frames[frames.length - ScaleTimeline.ENTRIES]) { // Time is after last frame.
- x = frames[frames.length + ScaleTimeline.PREV_X] * bone.data.scaleX;
- y = frames[frames.length + ScaleTimeline.PREV_Y] * bone.data.scaleY;
- } else {
- // Interpolate between the previous frame and the current frame.
- let frame = Animation.binarySearch(frames, time, ScaleTimeline.ENTRIES);
- x = frames[frame + ScaleTimeline.PREV_X];
- y = frames[frame + ScaleTimeline.PREV_Y];
- let frameTime = frames[frame];
- let percent = this.getCurvePercent(frame / ScaleTimeline.ENTRIES - 1,
- 1 - (time - frameTime) / (frames[frame + ScaleTimeline.PREV_TIME] - frameTime));
- x = (x + (frames[frame + ScaleTimeline.X] - x) * percent) * bone.data.scaleX;
- y = (y + (frames[frame + ScaleTimeline.Y] - y) * percent) * bone.data.scaleY;
- }
- if (alpha == 1) {
- if (blend == MixBlend.add) {
- bone.scaleX += x - bone.data.scaleX;
- bone.scaleY += y - bone.data.scaleY;
- } else {
- bone.scaleX = x;
- bone.scaleY = y;
- }
- } else {
- let bx = 0, by = 0;
- if (direction == MixDirection.mixOut) {
- switch (blend) {
- case MixBlend.setup:
- bx = bone.data.scaleX;
- by = bone.data.scaleY;
- bone.scaleX = bx + (Math.abs(x) * MathUtils.signum(bx) - bx) * alpha;
- bone.scaleY = by + (Math.abs(y) * MathUtils.signum(by) - by) * alpha;
- break;
- case MixBlend.first:
- case MixBlend.replace:
- bx = bone.scaleX;
- by = bone.scaleY;
- bone.scaleX = bx + (Math.abs(x) * MathUtils.signum(bx) - bx) * alpha;
- bone.scaleY = by + (Math.abs(y) * MathUtils.signum(by) - by) * alpha;
- break;
- case MixBlend.add:
- bx = bone.scaleX;
- by = bone.scaleY;
- bone.scaleX = bx + (Math.abs(x) * MathUtils.signum(bx) - bone.data.scaleX) * alpha;
- bone.scaleY = by + (Math.abs(y) * MathUtils.signum(by) - bone.data.scaleY) * alpha;
- }
- } else {
- switch (blend) {
- case MixBlend.setup:
- bx = Math.abs(bone.data.scaleX) * MathUtils.signum(x);
- by = Math.abs(bone.data.scaleY) * MathUtils.signum(y);
- bone.scaleX = bx + (x - bx) * alpha;
- bone.scaleY = by + (y - by) * alpha;
- break;
- case MixBlend.first:
- case MixBlend.replace:
- bx = Math.abs(bone.scaleX) * MathUtils.signum(x);
- by = Math.abs(bone.scaleY) * MathUtils.signum(y);
- bone.scaleX = bx + (x - bx) * alpha;
- bone.scaleY = by + (y - by) * alpha;
- break;
- case MixBlend.add:
- bx = MathUtils.signum(x);
- by = MathUtils.signum(y);
- bone.scaleX = Math.abs(bone.scaleX) * bx + (x - Math.abs(bone.data.scaleX) * bx) * alpha;
- bone.scaleY = Math.abs(bone.scaleY) * by + (y - Math.abs(bone.data.scaleY) * by) * alpha;
- }
- }
- }
- }
- }
- /** Changes a bone's local {@link Bone#shearX} and {@link Bone#shearY}. */
- /**
- * @public
- */
- class ShearTimeline extends TranslateTimeline {
- constructor (frameCount) {
- super(frameCount);
- }
- getPropertyId () {
- return (TimelineType.shear << 24) + this.boneIndex;
- }
- apply (skeleton, lastTime, time, events, alpha, blend, direction) {
- let frames = this.frames;
- let bone = skeleton.bones[this.boneIndex];
- if (!bone.active) return;
- if (time < frames[0]) {
- switch (blend) {
- case MixBlend.setup:
- bone.shearX = bone.data.shearX;
- bone.shearY = bone.data.shearY;
- return;
- case MixBlend.first:
- bone.shearX += (bone.data.shearX - bone.shearX) * alpha;
- bone.shearY += (bone.data.shearY - bone.shearY) * alpha;
- }
- return;
- }
- let x = 0, y = 0;
- if (time >= frames[frames.length - ShearTimeline.ENTRIES]) { // Time is after last frame.
- x = frames[frames.length + ShearTimeline.PREV_X];
- y = frames[frames.length + ShearTimeline.PREV_Y];
- } else {
- // Interpolate between the previous frame and the current frame.
- let frame = Animation.binarySearch(frames, time, ShearTimeline.ENTRIES);
- x = frames[frame + ShearTimeline.PREV_X];
- y = frames[frame + ShearTimeline.PREV_Y];
- let frameTime = frames[frame];
- let percent = this.getCurvePercent(frame / ShearTimeline.ENTRIES - 1,
- 1 - (time - frameTime) / (frames[frame + ShearTimeline.PREV_TIME] - frameTime));
- x = x + (frames[frame + ShearTimeline.X] - x) * percent;
- y = y + (frames[frame + ShearTimeline.Y] - y) * percent;
- }
- switch (blend) {
- case MixBlend.setup:
- bone.shearX = bone.data.shearX + x * alpha;
- bone.shearY = bone.data.shearY + y * alpha;
- break;
- case MixBlend.first:
- case MixBlend.replace:
- bone.shearX += (bone.data.shearX + x - bone.shearX) * alpha;
- bone.shearY += (bone.data.shearY + y - bone.shearY) * alpha;
- break;
- case MixBlend.add:
- bone.shearX += x * alpha;
- bone.shearY += y * alpha;
- }
- }
- }
- /** Changes a slot's {@link Slot#color}. */
- /**
- * @public
- */
- class ColorTimeline extends CurveTimeline {
- static __initStatic15() {this.ENTRIES = 5;}
- static __initStatic16() {this.PREV_TIME = -5;} static __initStatic17() {this.PREV_R = -4;} static __initStatic18() {this.PREV_G = -3;} static __initStatic19() {this.PREV_B = -2;} static __initStatic20() {this.PREV_A = -1;}
- static __initStatic21() {this.R = 1;} static __initStatic22() {this.G = 2;} static __initStatic23() {this.B = 3;} static __initStatic24() {this.A = 4;}
- /** The index of the slot in {@link Skeleton#slots} that will be changed. */
-
- /** The time in seconds, red, green, blue, and alpha values for each key frame. */
- // time, r, g, b, a, ...
- constructor (frameCount) {
- super(frameCount);
- this.frames = Utils.newFloatArray(frameCount * ColorTimeline.ENTRIES);
- }
- getPropertyId () {
- return (TimelineType.color << 24) + this.slotIndex;
- }
- /** Sets the time in seconds, red, green, blue, and alpha for the specified key frame. */
- setFrame (frameIndex, time, r, g, b, a) {
- frameIndex *= ColorTimeline.ENTRIES;
- this.frames[frameIndex] = time;
- this.frames[frameIndex + ColorTimeline.R] = r;
- this.frames[frameIndex + ColorTimeline.G] = g;
- this.frames[frameIndex + ColorTimeline.B] = b;
- this.frames[frameIndex + ColorTimeline.A] = a;
- }
- apply (skeleton, lastTime, time, events, alpha, blend, direction) {
- let slot = skeleton.slots[this.slotIndex];
- if (!slot.bone.active) return;
- let frames = this.frames;
- if (time < frames[0]) {
- switch (blend) {
- case MixBlend.setup:
- slot.color.setFromColor(slot.data.color);
- return;
- case MixBlend.first:
- let color = slot.color, setup = slot.data.color;
- color.add((setup.r - color.r) * alpha, (setup.g - color.g) * alpha, (setup.b - color.b) * alpha,
- (setup.a - color.a) * alpha);
- }
- return;
- }
- let r = 0, g = 0, b = 0, a = 0;
- if (time >= frames[frames.length - ColorTimeline.ENTRIES]) { // Time is after last frame.
- let i = frames.length;
- r = frames[i + ColorTimeline.PREV_R];
- g = frames[i + ColorTimeline.PREV_G];
- b = frames[i + ColorTimeline.PREV_B];
- a = frames[i + ColorTimeline.PREV_A];
- } else {
- // Interpolate between the previous frame and the current frame.
- let frame = Animation.binarySearch(frames, time, ColorTimeline.ENTRIES);
- r = frames[frame + ColorTimeline.PREV_R];
- g = frames[frame + ColorTimeline.PREV_G];
- b = frames[frame + ColorTimeline.PREV_B];
- a = frames[frame + ColorTimeline.PREV_A];
- let frameTime = frames[frame];
- let percent = this.getCurvePercent(frame / ColorTimeline.ENTRIES - 1,
- 1 - (time - frameTime) / (frames[frame + ColorTimeline.PREV_TIME] - frameTime));
- r += (frames[frame + ColorTimeline.R] - r) * percent;
- g += (frames[frame + ColorTimeline.G] - g) * percent;
- b += (frames[frame + ColorTimeline.B] - b) * percent;
- a += (frames[frame + ColorTimeline.A] - a) * percent;
- }
- if (alpha == 1)
- slot.color.set(r, g, b, a);
- else {
- let color = slot.color;
- if (blend == MixBlend.setup) color.setFromColor(slot.data.color);
- color.add((r - color.r) * alpha, (g - color.g) * alpha, (b - color.b) * alpha, (a - color.a) * alpha);
- }
- }
- } ColorTimeline.__initStatic15(); ColorTimeline.__initStatic16(); ColorTimeline.__initStatic17(); ColorTimeline.__initStatic18(); ColorTimeline.__initStatic19(); ColorTimeline.__initStatic20(); ColorTimeline.__initStatic21(); ColorTimeline.__initStatic22(); ColorTimeline.__initStatic23(); ColorTimeline.__initStatic24();
- /** Changes a slot's {@link Slot#color} and {@link Slot#darkColor} for two color tinting. */
- /**
- * @public
- */
- class TwoColorTimeline extends CurveTimeline {
- static __initStatic25() {this.ENTRIES = 8;}
- static __initStatic26() {this.PREV_TIME = -8;} static __initStatic27() {this.PREV_R = -7;} static __initStatic28() {this.PREV_G = -6;} static __initStatic29() {this.PREV_B = -5;} static __initStatic30() {this.PREV_A = -4;}
- static __initStatic31() {this.PREV_R2 = -3;} static __initStatic32() {this.PREV_G2 = -2;} static __initStatic33() {this.PREV_B2 = -1;}
- static __initStatic34() {this.R = 1;} static __initStatic35() {this.G = 2;} static __initStatic36() {this.B = 3;} static __initStatic37() {this.A = 4;} static __initStatic38() {this.R2 = 5;} static __initStatic39() {this.G2 = 6;} static __initStatic40() {this.B2 = 7;}
- /** The index of the slot in {@link Skeleton#slots()} that will be changed. The {@link Slot#darkColor()} must not be
- * null. */
-
- /** The time in seconds, red, green, blue, and alpha values of the color, red, green, blue of the dark color, for each key frame. */
- // time, r, g, b, a, r2, g2, b2, ...
- constructor (frameCount) {
- super(frameCount);
- this.frames = Utils.newFloatArray(frameCount * TwoColorTimeline.ENTRIES);
- }
- getPropertyId () {
- return (TimelineType.twoColor << 24) + this.slotIndex;
- }
- /** Sets the time in seconds, light, and dark colors for the specified key frame. */
- setFrame (frameIndex, time, r, g, b, a, r2, g2, b2) {
- frameIndex *= TwoColorTimeline.ENTRIES;
- this.frames[frameIndex] = time;
- this.frames[frameIndex + TwoColorTimeline.R] = r;
- this.frames[frameIndex + TwoColorTimeline.G] = g;
- this.frames[frameIndex + TwoColorTimeline.B] = b;
- this.frames[frameIndex + TwoColorTimeline.A] = a;
- this.frames[frameIndex + TwoColorTimeline.R2] = r2;
- this.frames[frameIndex + TwoColorTimeline.G2] = g2;
- this.frames[frameIndex + TwoColorTimeline.B2] = b2;
- }
- apply (skeleton, lastTime, time, events, alpha, blend, direction) {
- let slot = skeleton.slots[this.slotIndex];
- if (!slot.bone.active) return;
- let frames = this.frames;
- if (time < frames[0]) {
- switch (blend) {
- case MixBlend.setup:
- slot.color.setFromColor(slot.data.color);
- slot.darkColor.setFromColor(slot.data.darkColor);
- return;
- case MixBlend.first:
- let light = slot.color, dark = slot.darkColor, setupLight = slot.data.color, setupDark = slot.data.darkColor;
- light.add((setupLight.r - light.r) * alpha, (setupLight.g - light.g) * alpha, (setupLight.b - light.b) * alpha,
- (setupLight.a - light.a) * alpha);
- dark.add((setupDark.r - dark.r) * alpha, (setupDark.g - dark.g) * alpha, (setupDark.b - dark.b) * alpha, 0);
- }
- return;
- }
- let r = 0, g = 0, b = 0, a = 0, r2 = 0, g2 = 0, b2 = 0;
- if (time >= frames[frames.length - TwoColorTimeline.ENTRIES]) { // Time is after last frame.
- let i = frames.length;
- r = frames[i + TwoColorTimeline.PREV_R];
- g = frames[i + TwoColorTimeline.PREV_G];
- b = frames[i + TwoColorTimeline.PREV_B];
- a = frames[i + TwoColorTimeline.PREV_A];
- r2 = frames[i + TwoColorTimeline.PREV_R2];
- g2 = frames[i + TwoColorTimeline.PREV_G2];
- b2 = frames[i + TwoColorTimeline.PREV_B2];
- } else {
- // Interpolate between the previous frame and the current frame.
- let frame = Animation.binarySearch(frames, time, TwoColorTimeline.ENTRIES);
- r = frames[frame + TwoColorTimeline.PREV_R];
- g = frames[frame + TwoColorTimeline.PREV_G];
- b = frames[frame + TwoColorTimeline.PREV_B];
- a = frames[frame + TwoColorTimeline.PREV_A];
- r2 = frames[frame + TwoColorTimeline.PREV_R2];
- g2 = frames[frame + TwoColorTimeline.PREV_G2];
- b2 = frames[frame + TwoColorTimeline.PREV_B2];
- let frameTime = frames[frame];
- let percent = this.getCurvePercent(frame / TwoColorTimeline.ENTRIES - 1,
- 1 - (time - frameTime) / (frames[frame + TwoColorTimeline.PREV_TIME] - frameTime));
- r += (frames[frame + TwoColorTimeline.R] - r) * percent;
- g += (frames[frame + TwoColorTimeline.G] - g) * percent;
- b += (frames[frame + TwoColorTimeline.B] - b) * percent;
- a += (frames[frame + TwoColorTimeline.A] - a) * percent;
- r2 += (frames[frame + TwoColorTimeline.R2] - r2) * percent;
- g2 += (frames[frame + TwoColorTimeline.G2] - g2) * percent;
- b2 += (frames[frame + TwoColorTimeline.B2] - b2) * percent;
- }
- if (alpha == 1) {
- slot.color.set(r, g, b, a);
- slot.darkColor.set(r2, g2, b2, 1);
- } else {
- let light = slot.color, dark = slot.darkColor;
- if (blend == MixBlend.setup) {
- light.setFromColor(slot.data.color);
- dark.setFromColor(slot.data.darkColor);
- }
- light.add((r - light.r) * alpha, (g - light.g) * alpha, (b - light.b) * alpha, (a - light.a) * alpha);
- dark.add((r2 - dark.r) * alpha, (g2 - dark.g) * alpha, (b2 - dark.b) * alpha, 0);
- }
- }
- } TwoColorTimeline.__initStatic25(); TwoColorTimeline.__initStatic26(); TwoColorTimeline.__initStatic27(); TwoColorTimeline.__initStatic28(); TwoColorTimeline.__initStatic29(); TwoColorTimeline.__initStatic30(); TwoColorTimeline.__initStatic31(); TwoColorTimeline.__initStatic32(); TwoColorTimeline.__initStatic33(); TwoColorTimeline.__initStatic34(); TwoColorTimeline.__initStatic35(); TwoColorTimeline.__initStatic36(); TwoColorTimeline.__initStatic37(); TwoColorTimeline.__initStatic38(); TwoColorTimeline.__initStatic39(); TwoColorTimeline.__initStatic40();
- /** Changes a slot's {@link Slot#attachment}. */
- /**
- * @public
- */
- class AttachmentTimeline {
- /** The index of the slot in {@link Skeleton#slots} that will be changed. */
-
- /** The time in seconds for each key frame. */
- // time, ...
- /** The attachment name for each key frame. May contain null values to clear the attachment. */
-
- constructor (frameCount) {
- this.frames = Utils.newFloatArray(frameCount);
- this.attachmentNames = new Array(frameCount);
- }
- getPropertyId () {
- return (TimelineType.attachment << 24) + this.slotIndex;
- }
- /** The number of key frames for this timeline. */
- getFrameCount () {
- return this.frames.length;
- }
- /** Sets the time in seconds and the attachment name for the specified key frame. */
- setFrame (frameIndex, time, attachmentName) {
- this.frames[frameIndex] = time;
- this.attachmentNames[frameIndex] = attachmentName;
- }
- apply (skeleton, lastTime, time, events, alpha, blend, direction) {
- let slot = skeleton.slots[this.slotIndex];
- if (!slot.bone.active) return;
- if (direction == MixDirection.mixOut) {
- if (blend == MixBlend.setup)
- this.setAttachment(skeleton, slot, slot.data.attachmentName);
- return;
- }
- let frames = this.frames;
- if (time < frames[0]) {
- if (blend == MixBlend.setup || blend == MixBlend.first) this.setAttachment(skeleton, slot, slot.data.attachmentName);
- return;
- }
- let frameIndex = 0;
- if (time >= frames[frames.length - 1]) // Time is after last frame.
- frameIndex = frames.length - 1;
- else
- frameIndex = Animation.binarySearch(frames, time, 1) - 1;
- let attachmentName = this.attachmentNames[frameIndex];
- skeleton.slots[this.slotIndex]
- .setAttachment(attachmentName == null ? null : skeleton.getAttachment(this.slotIndex, attachmentName));
- }
- setAttachment(skeleton, slot, attachmentName) {
- slot.setAttachment(attachmentName == null ? null : skeleton.getAttachment(this.slotIndex, attachmentName));
- }
- }
- let zeros = null;
- /** Changes a slot's {@link Slot#deform} to deform a {@link VertexAttachment}. */
- /**
- * @public
- */
- class DeformTimeline extends CurveTimeline {
- /** The index of the slot in {@link Skeleton#getSlots()} that will be changed. */
-
- /** The attachment that will be deformed. */
-
- /** The time in seconds for each key frame. */
- // time, ...
- /** The vertices for each key frame. */
-
- constructor (frameCount) {
- super(frameCount);
- this.frames = Utils.newFloatArray(frameCount);
- this.frameVertices = new Array(frameCount);
- if (zeros == null) zeros = Utils.newFloatArray(64);
- }
- getPropertyId () {
- return (TimelineType.deform << 27) + + this.attachment.id + this.slotIndex;
- }
- /** Sets the time in seconds and the vertices for the specified key frame.
- * @param vertices Vertex positions for an unweighted VertexAttachment, or deform offsets if it has weights. */
- setFrame (frameIndex, time, vertices) {
- this.frames[frameIndex] = time;
- this.frameVertices[frameIndex] = vertices;
- }
- apply (skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
- let slot = skeleton.slots[this.slotIndex];
- if (!slot.bone.active) return;
- let slotAttachment = slot.getAttachment();
- if (!(slotAttachment instanceof VertexAttachment) || !((slotAttachment).deformAttachment == this.attachment)) return;
- let deformArray = slot.deform;
- if (deformArray.length == 0) blend = MixBlend.setup;
- let frameVertices = this.frameVertices;
- let vertexCount = frameVertices[0].length;
- let frames = this.frames;
- if (time < frames[0]) {
- let vertexAttachment = slotAttachment;
- switch (blend) {
- case MixBlend.setup:
- deformArray.length = 0;
- return;
- case MixBlend.first:
- if (alpha == 1) {
- deformArray.length = 0;
- break;
- }
- let deform = Utils.setArraySize(deformArray, vertexCount);
- if (vertexAttachment.bones == null) {
- // Unweighted vertex positions.
- let setupVertices = vertexAttachment.vertices;
- for (var i = 0; i < vertexCount; i++)
- deform[i] += (setupVertices[i] - deform[i]) * alpha;
- } else {
- // Weighted deform offsets.
- alpha = 1 - alpha;
- for (var i = 0; i < vertexCount; i++)
- deform[i] *= alpha;
- }
- }
- return;
- }
- let deform = Utils.setArraySize(deformArray, vertexCount);
- if (time >= frames[frames.length - 1]) { // Time is after last frame.
- let lastVertices = frameVertices[frames.length - 1];
- if (alpha == 1) {
- if (blend == MixBlend.add) {
- let vertexAttachment = slotAttachment ;
- if (vertexAttachment.bones == null) {
- // Unweighted vertex positions, with alpha.
- let setupVertices = vertexAttachment.vertices;
- for (let i = 0; i < vertexCount; i++) {
- deform[i] += lastVertices[i] - setupVertices[i];
- }
- } else {
- // Weighted deform offsets, with alpha.
- for (let i = 0; i < vertexCount; i++)
- deform[i] += lastVertices[i];
- }
- } else {
- Utils.arrayCopy(lastVertices, 0, deform, 0, vertexCount);
- }
- } else {
- switch (blend) {
- case MixBlend.setup: {
- let vertexAttachment = slotAttachment ;
- if (vertexAttachment.bones == null) {
- // Unweighted vertex positions, with alpha.
- let setupVertices = vertexAttachment.vertices;
- for (let i = 0; i < vertexCount; i++) {
- let setup = setupVertices[i];
- deform[i] = setup + (lastVertices[i] - setup) * alpha;
- }
- } else {
- // Weighted deform offsets, with alpha.
- for (let i = 0; i < vertexCount; i++)
- deform[i] = lastVertices[i] * alpha;
- }
- break;
- }
- case MixBlend.first:
- case MixBlend.replace:
- for (let i = 0; i < vertexCount; i++)
- deform[i] += (lastVertices[i] - deform[i]) * alpha;
- break;
- case MixBlend.add:
- let vertexAttachment = slotAttachment ;
- if (vertexAttachment.bones == null) {
- // Unweighted vertex positions, with alpha.
- let setupVertices = vertexAttachment.vertices;
- for (let i = 0; i < vertexCount; i++) {
- deform[i] += (lastVertices[i] - setupVertices[i]) * alpha;
- }
- } else {
- // Weighted deform offsets, with alpha.
- for (let i = 0; i < vertexCount; i++)
- deform[i] += lastVertices[i] * alpha;
- }
- }
- }
- return;
- }
- // Interpolate between the previous frame and the current frame.
- let frame = Animation.binarySearch(frames, time);
- let prevVertices = frameVertices[frame - 1];
- let nextVertices = frameVertices[frame];
- let frameTime = frames[frame];
- let percent = this.getCurvePercent(frame - 1, 1 - (time - frameTime) / (frames[frame - 1] - frameTime));
- if (alpha == 1) {
- if (blend == MixBlend.add) {
- let vertexAttachment = slotAttachment ;
- if (vertexAttachment.bones == null) {
- // Unweighted vertex positions, with alpha.
- let setupVertices = vertexAttachment.vertices;
- for (let i = 0; i < vertexCount; i++) {
- let prev = prevVertices[i];
- deform[i] += prev + (nextVertices[i] - prev) * percent - setupVertices[i];
- }
- } else {
- // Weighted deform offsets, with alpha.
- for (let i = 0; i < vertexCount; i++) {
- let prev = prevVertices[i];
- deform[i] += prev + (nextVertices[i] - prev) * percent;
- }
- }
- } else {
- for (let i = 0; i < vertexCount; i++) {
- let prev = prevVertices[i];
- deform[i] = prev + (nextVertices[i] - prev) * percent;
- }
- }
- } else {
- switch (blend) {
- case MixBlend.setup: {
- let vertexAttachment = slotAttachment ;
- if (vertexAttachment.bones == null) {
- // Unweighted vertex positions, with alpha.
- let setupVertices = vertexAttachment.vertices;
- for (let i = 0; i < vertexCount; i++) {
- let prev = prevVertices[i], setup = setupVertices[i];
- deform[i] = setup + (prev + (nextVertices[i] - prev) * percent - setup) * alpha;
- }
- } else {
- // Weighted deform offsets, with alpha.
- for (let i = 0; i < vertexCount; i++) {
- let prev = prevVertices[i];
- deform[i] = (prev + (nextVertices[i] - prev) * percent) * alpha;
- }
- }
- break;
- }
- case MixBlend.first:
- case MixBlend.replace:
- for (let i = 0; i < vertexCount; i++) {
- let prev = prevVertices[i];
- deform[i] += (prev + (nextVertices[i] - prev) * percent - deform[i]) * alpha;
- }
- break;
- case MixBlend.add:
- let vertexAttachment = slotAttachment ;
- if (vertexAttachment.bones == null) {
- // Unweighted vertex positions, with alpha.
- let setupVertices = vertexAttachment.vertices;
- for (let i = 0; i < vertexCount; i++) {
- let prev = prevVertices[i];
- deform[i] += (prev + (nextVertices[i] - prev) * percent - setupVertices[i]) * alpha;
- }
- } else {
- // Weighted deform offsets, with alpha.
- for (let i = 0; i < vertexCount; i++) {
- let prev = prevVertices[i];
- deform[i] += (prev + (nextVertices[i] - prev) * percent) * alpha;
- }
- }
- }
- }
- }
- }
- /** Fires an {@link Event} when specific animation times are reached. */
- /**
- * @public
- */
- class EventTimeline {
- /** The time in seconds for each key frame. */
- // time, ...
- /** The event for each key frame. */
-
- constructor (frameCount) {
- this.frames = Utils.newFloatArray(frameCount);
- this.events = new Array(frameCount);
- }
- getPropertyId () {
- return TimelineType.event << 24;
- }
- /** The number of key frames for this timeline. */
- getFrameCount () {
- return this.frames.length;
- }
- /** Sets the time in seconds and the event for the specified key frame. */
- setFrame (frameIndex, event) {
- this.frames[frameIndex] = event.time;
- this.events[frameIndex] = event;
- }
- /** Fires events for frames > `lastTime` and <= `time`. */
- apply (skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
- if (firedEvents == null) return;
- let frames = this.frames;
- let frameCount = this.frames.length;
- if (lastTime > time) { // Fire events after last time for looped animations.
- this.apply(skeleton, lastTime, Number.MAX_VALUE, firedEvents, alpha, blend, direction);
- lastTime = -1;
- } else if (lastTime >= frames[frameCount - 1]) // Last time is after last frame.
- return;
- if (time < frames[0]) return; // Time is before first frame.
- let frame = 0;
- if (lastTime < frames[0])
- frame = 0;
- else {
- frame = Animation.binarySearch(frames, lastTime);
- let frameTime = frames[frame];
- while (frame > 0) { // Fire multiple events with the same frame.
- if (frames[frame - 1] != frameTime) break;
- frame--;
- }
- }
- for (; frame < frameCount && time >= frames[frame]; frame++)
- firedEvents.push(this.events[frame]);
- }
- }
- /** Changes a skeleton's {@link Skeleton#drawOrder}. */
- /**
- * @public
- */
- class DrawOrderTimeline {
- /** The time in seconds for each key frame. */
- // time, ...
- /** The draw order for each key frame. See {@link #setFrame(int, float, int[])}. */
-
- constructor (frameCount) {
- this.frames = Utils.newFloatArray(frameCount);
- this.drawOrders = new Array(frameCount);
- }
- getPropertyId () {
- return TimelineType.drawOrder << 24;
- }
- /** The number of key frames for this timeline. */
- getFrameCount () {
- return this.frames.length;
- }
- /** Sets the time in seconds and the draw order for the specified key frame.
- * @param drawOrder For each slot in {@link Skeleton#slots}, the index of the new draw order. May be null to use setup pose
- * draw order. */
- setFrame (frameIndex, time, drawOrder) {
- this.frames[frameIndex] = time;
- this.drawOrders[frameIndex] = drawOrder;
- }
- apply (skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
- let drawOrder = skeleton.drawOrder;
- let slots = skeleton.slots;
- if (direction == MixDirection.mixOut && blend == MixBlend.setup) {
- Utils.arrayCopy(skeleton.slots, 0, skeleton.drawOrder, 0, skeleton.slots.length);
- return;
- }
- let frames = this.frames;
- if (time < frames[0]) {
- if (blend == MixBlend.setup || blend == MixBlend.first) Utils.arrayCopy(skeleton.slots, 0, skeleton.drawOrder, 0, skeleton.slots.length);
- return;
- }
- let frame = 0;
- if (time >= frames[frames.length - 1]) // Time is after last frame.
- frame = frames.length - 1;
- else
- frame = Animation.binarySearch(frames, time) - 1;
- let drawOrderToSetupIndex = this.drawOrders[frame];
- if (drawOrderToSetupIndex == null)
- Utils.arrayCopy(slots, 0, drawOrder, 0, slots.length);
- else {
- for (let i = 0, n = drawOrderToSetupIndex.length; i < n; i++)
- drawOrder[i] = slots[drawOrderToSetupIndex[i]];
- }
- }
- }
- /** Changes an IK constraint's {@link IkConstraint#mix}, {@link IkConstraint#softness},
- * {@link IkConstraint#bendDirection}, {@link IkConstraint#stretch}, and {@link IkConstraint#compress}. */
- /**
- * @public
- */
- class IkConstraintTimeline extends CurveTimeline {
- static __initStatic41() {this.ENTRIES = 6;}
- static __initStatic42() {this.PREV_TIME = -6;} static __initStatic43() {this.PREV_MIX = -5;} static __initStatic44() {this.PREV_SOFTNESS = -4;} static __initStatic45() {this.PREV_BEND_DIRECTION = -3;} static __initStatic46() {this.PREV_COMPRESS = -2;} static __initStatic47() {this.PREV_STRETCH = -1;}
- static __initStatic48() {this.MIX = 1;} static __initStatic49() {this.SOFTNESS = 2;} static __initStatic50() {this.BEND_DIRECTION = 3;} static __initStatic51() {this.COMPRESS = 4;} static __initStatic52() {this.STRETCH = 5;}
- /** The index of the IK constraint slot in {@link Skeleton#ikConstraints} that will be changed. */
-
- /** The time in seconds, mix, softness, bend direction, compress, and stretch for each key frame. */
- // time, mix, softness, bendDirection, compress, stretch, ...
- constructor (frameCount) {
- super(frameCount);
- this.frames = Utils.newFloatArray(frameCount * IkConstraintTimeline.ENTRIES);
- }
- getPropertyId () {
- return (TimelineType.ikConstraint << 24) + this.ikConstraintIndex;
- }
- /** Sets the time in seconds, mix, softness, bend direction, compress, and stretch for the specified key frame. */
- setFrame (frameIndex, time, mix, softness, bendDirection, compress, stretch) {
- frameIndex *= IkConstraintTimeline.ENTRIES;
- this.frames[frameIndex] = time;
- this.frames[frameIndex + IkConstraintTimeline.MIX] = mix;
- this.frames[frameIndex + IkConstraintTimeline.SOFTNESS] = softness;
- this.frames[frameIndex + IkConstraintTimeline.BEND_DIRECTION] = bendDirection;
- this.frames[frameIndex + IkConstraintTimeline.COMPRESS] = compress ? 1 : 0;
- this.frames[frameIndex + IkConstraintTimeline.STRETCH] = stretch ? 1 : 0;
- }
- apply (skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
- let frames = this.frames;
- let constraint = skeleton.ikConstraints[this.ikConstraintIndex];
- if (!constraint.active) return;
- if (time < frames[0]) {
- switch (blend) {
- case MixBlend.setup:
- constraint.mix = constraint.data.mix;
- constraint.softness = constraint.data.softness;
- constraint.bendDirection = constraint.data.bendDirection;
- constraint.compress = constraint.data.compress;
- constraint.stretch = constraint.data.stretch;
- return;
- case MixBlend.first:
- constraint.mix += (constraint.data.mix - constraint.mix) * alpha;
- constraint.softness += (constraint.data.softness - constraint.softness) * alpha;
- constraint.bendDirection = constraint.data.bendDirection;
- constraint.compress = constraint.data.compress;
- constraint.stretch = constraint.data.stretch;
- }
- return;
- }
- if (time >= frames[frames.length - IkConstraintTimeline.ENTRIES]) { // Time is after last frame.
- if (blend == MixBlend.setup) {
- constraint.mix = constraint.data.mix + (frames[frames.length + IkConstraintTimeline.PREV_MIX] - constraint.data.mix) * alpha;
- constraint.softness = constraint.data.softness
- + (frames[frames.length + IkConstraintTimeline.PREV_SOFTNESS] - constraint.data.softness) * alpha;
- if (direction == MixDirection.mixOut) {
- constraint.bendDirection = constraint.data.bendDirection;
- constraint.compress = constraint.data.compress;
- constraint.stretch = constraint.data.stretch;
- } else {
- constraint.bendDirection = frames[frames.length + IkConstraintTimeline.PREV_BEND_DIRECTION];
- constraint.compress = frames[frames.length + IkConstraintTimeline.PREV_COMPRESS] != 0;
- constraint.stretch = frames[frames.length + IkConstraintTimeline.PREV_STRETCH] != 0;
- }
- } else {
- constraint.mix += (frames[frames.length + IkConstraintTimeline.PREV_MIX] - constraint.mix) * alpha;
- constraint.softness += (frames[frames.length + IkConstraintTimeline.PREV_SOFTNESS] - constraint.softness) * alpha;
- if (direction == MixDirection.mixIn) {
- constraint.bendDirection = frames[frames.length + IkConstraintTimeline.PREV_BEND_DIRECTION];
- constraint.compress = frames[frames.length + IkConstraintTimeline.PREV_COMPRESS] != 0;
- constraint.stretch = frames[frames.length + IkConstraintTimeline.PREV_STRETCH] != 0;
- }
- }
- return;
- }
- // Interpolate between the previous frame and the current frame.
- let frame = Animation.binarySearch(frames, time, IkConstraintTimeline.ENTRIES);
- let mix = frames[frame + IkConstraintTimeline.PREV_MIX];
- let softness = frames[frame + IkConstraintTimeline.PREV_SOFTNESS];
- let frameTime = frames[frame];
- let percent = this.getCurvePercent(frame / IkConstraintTimeline.ENTRIES - 1,
- 1 - (time - frameTime) / (frames[frame + IkConstraintTimeline.PREV_TIME] - frameTime));
- if (blend == MixBlend.setup) {
- constraint.mix = constraint.data.mix + (mix + (frames[frame + IkConstraintTimeline.MIX] - mix) * percent - constraint.data.mix) * alpha;
- constraint.softness = constraint.data.softness
- + (softness + (frames[frame + IkConstraintTimeline.SOFTNESS] - softness) * percent - constraint.data.softness) * alpha;
- if (direction == MixDirection.mixOut) {
- constraint.bendDirection = constraint.data.bendDirection;
- constraint.compress = constraint.data.compress;
- constraint.stretch = constraint.data.stretch;
- } else {
- constraint.bendDirection = frames[frame + IkConstraintTimeline.PREV_BEND_DIRECTION];
- constraint.compress = frames[frame + IkConstraintTimeline.PREV_COMPRESS] != 0;
- constraint.stretch = frames[frame + IkConstraintTimeline.PREV_STRETCH] != 0;
- }
- } else {
- constraint.mix += (mix + (frames[frame + IkConstraintTimeline.MIX] - mix) * percent - constraint.mix) * alpha;
- constraint.softness += (softness + (frames[frame + IkConstraintTimeline.SOFTNESS] - softness) * percent - constraint.softness) * alpha;
- if (direction == MixDirection.mixIn) {
- constraint.bendDirection = frames[frame + IkConstraintTimeline.PREV_BEND_DIRECTION];
- constraint.compress = frames[frame + IkConstraintTimeline.PREV_COMPRESS] != 0;
- constraint.stretch = frames[frame + IkConstraintTimeline.PREV_STRETCH] != 0;
- }
- }
- }
- } IkConstraintTimeline.__initStatic41(); IkConstraintTimeline.__initStatic42(); IkConstraintTimeline.__initStatic43(); IkConstraintTimeline.__initStatic44(); IkConstraintTimeline.__initStatic45(); IkConstraintTimeline.__initStatic46(); IkConstraintTimeline.__initStatic47(); IkConstraintTimeline.__initStatic48(); IkConstraintTimeline.__initStatic49(); IkConstraintTimeline.__initStatic50(); IkConstraintTimeline.__initStatic51(); IkConstraintTimeline.__initStatic52();
- /** Changes a transform constraint's {@link TransformConstraint#rotateMix}, {@link TransformConstraint#translateMix},
- * {@link TransformConstraint#scaleMix}, and {@link TransformConstraint#shearMix}. */
- /**
- * @public
- */
- class TransformConstraintTimeline extends CurveTimeline {
- static __initStatic53() {this.ENTRIES = 5;}
- static __initStatic54() {this.PREV_TIME = -5;} static __initStatic55() {this.PREV_ROTATE = -4;} static __initStatic56() {this.PREV_TRANSLATE = -3;} static __initStatic57() {this.PREV_SCALE = -2;} static __initStatic58() {this.PREV_SHEAR = -1;}
- static __initStatic59() {this.ROTATE = 1;} static __initStatic60() {this.TRANSLATE = 2;} static __initStatic61() {this.SCALE = 3;} static __initStatic62() {this.SHEAR = 4;}
- /** The index of the transform constraint slot in {@link Skeleton#transformConstraints} that will be changed. */
-
- /** The time in seconds, rotate mix, translate mix, scale mix, and shear mix for each key frame. */
- // time, rotate mix, translate mix, scale mix, shear mix, ...
- constructor (frameCount) {
- super(frameCount);
- this.frames = Utils.newFloatArray(frameCount * TransformConstraintTimeline.ENTRIES);
- }
- getPropertyId () {
- return (TimelineType.transformConstraint << 24) + this.transformConstraintIndex;
- }
- /** The time in seconds, rotate mix, translate mix, scale mix, and shear mix for the specified key frame. */
- setFrame (frameIndex, time, rotateMix, translateMix, scaleMix, shearMix) {
- frameIndex *= TransformConstraintTimeline.ENTRIES;
- this.frames[frameIndex] = time;
- this.frames[frameIndex + TransformConstraintTimeline.ROTATE] = rotateMix;
- this.frames[frameIndex + TransformConstraintTimeline.TRANSLATE] = translateMix;
- this.frames[frameIndex + TransformConstraintTimeline.SCALE] = scaleMix;
- this.frames[frameIndex + TransformConstraintTimeline.SHEAR] = shearMix;
- }
- apply (skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
- let frames = this.frames;
- let constraint = skeleton.transformConstraints[this.transformConstraintIndex];
- if (!constraint.active) return;
- if (time < frames[0]) {
- let data = constraint.data;
- switch (blend) {
- case MixBlend.setup:
- constraint.rotateMix = data.rotateMix;
- constraint.translateMix = data.translateMix;
- constraint.scaleMix = data.scaleMix;
- constraint.shearMix = data.shearMix;
- return;
- case MixBlend.first:
- constraint.rotateMix += (data.rotateMix - constraint.rotateMix) * alpha;
- constraint.translateMix += (data.translateMix - constraint.translateMix) * alpha;
- constraint.scaleMix += (data.scaleMix - constraint.scaleMix) * alpha;
- constraint.shearMix += (data.shearMix - constraint.shearMix) * alpha;
- }
- return;
- }
- let rotate = 0, translate = 0, scale = 0, shear = 0;
- if (time >= frames[frames.length - TransformConstraintTimeline.ENTRIES]) { // Time is after last frame.
- let i = frames.length;
- rotate = frames[i + TransformConstraintTimeline.PREV_ROTATE];
- translate = frames[i + TransformConstraintTimeline.PREV_TRANSLATE];
- scale = frames[i + TransformConstraintTimeline.PREV_SCALE];
- shear = frames[i + TransformConstraintTimeline.PREV_SHEAR];
- } else {
- // Interpolate between the previous frame and the current frame.
- let frame = Animation.binarySearch(frames, time, TransformConstraintTimeline.ENTRIES);
- rotate = frames[frame + TransformConstraintTimeline.PREV_ROTATE];
- translate = frames[frame + TransformConstraintTimeline.PREV_TRANSLATE];
- scale = frames[frame + TransformConstraintTimeline.PREV_SCALE];
- shear = frames[frame + TransformConstraintTimeline.PREV_SHEAR];
- let frameTime = frames[frame];
- let percent = this.getCurvePercent(frame / TransformConstraintTimeline.ENTRIES - 1,
- 1 - (time - frameTime) / (frames[frame + TransformConstraintTimeline.PREV_TIME] - frameTime));
- rotate += (frames[frame + TransformConstraintTimeline.ROTATE] - rotate) * percent;
- translate += (frames[frame + TransformConstraintTimeline.TRANSLATE] - translate) * percent;
- scale += (frames[frame + TransformConstraintTimeline.SCALE] - scale) * percent;
- shear += (frames[frame + TransformConstraintTimeline.SHEAR] - shear) * percent;
- }
- if (blend == MixBlend.setup) {
- let data = constraint.data;
- constraint.rotateMix = data.rotateMix + (rotate - data.rotateMix) * alpha;
- constraint.translateMix = data.translateMix + (translate - data.translateMix) * alpha;
- constraint.scaleMix = data.scaleMix + (scale - data.scaleMix) * alpha;
- constraint.shearMix = data.shearMix + (shear - data.shearMix) * alpha;
- } else {
- constraint.rotateMix += (rotate - constraint.rotateMix) * alpha;
- constraint.translateMix += (translate - constraint.translateMix) * alpha;
- constraint.scaleMix += (scale - constraint.scaleMix) * alpha;
- constraint.shearMix += (shear - constraint.shearMix) * alpha;
- }
- }
- } TransformConstraintTimeline.__initStatic53(); TransformConstraintTimeline.__initStatic54(); TransformConstraintTimeline.__initStatic55(); TransformConstraintTimeline.__initStatic56(); TransformConstraintTimeline.__initStatic57(); TransformConstraintTimeline.__initStatic58(); TransformConstraintTimeline.__initStatic59(); TransformConstraintTimeline.__initStatic60(); TransformConstraintTimeline.__initStatic61(); TransformConstraintTimeline.__initStatic62();
- /** Changes a path constraint's {@link PathConstraint#position}. */
- /**
- * @public
- */
- class PathConstraintPositionTimeline extends CurveTimeline {
- static __initStatic63() {this.ENTRIES = 2;}
- static __initStatic64() {this.PREV_TIME = -2;} static __initStatic65() {this.PREV_VALUE = -1;}
- static __initStatic66() {this.VALUE = 1;}
- /** The index of the path constraint slot in {@link Skeleton#pathConstraints} that will be changed. */
-
- /** The time in seconds and path constraint position for each key frame. */
- // time, position, ...
- constructor (frameCount) {
- super(frameCount);
- this.frames = Utils.newFloatArray(frameCount * PathConstraintPositionTimeline.ENTRIES);
- }
- getPropertyId () {
- return (TimelineType.pathConstraintPosition << 24) + this.pathConstraintIndex;
- }
- /** Sets the time in seconds and path constraint position for the specified key frame. */
- setFrame (frameIndex, time, value) {
- frameIndex *= PathConstraintPositionTimeline.ENTRIES;
- this.frames[frameIndex] = time;
- this.frames[frameIndex + PathConstraintPositionTimeline.VALUE] = value;
- }
- apply (skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
- let frames = this.frames;
- let constraint = skeleton.pathConstraints[this.pathConstraintIndex];
- if (!constraint.active) return;
- if (time < frames[0]) {
- switch (blend) {
- case MixBlend.setup:
- constraint.position = constraint.data.position;
- return;
- case MixBlend.first:
- constraint.position += (constraint.data.position - constraint.position) * alpha;
- }
- return;
- }
- let position = 0;
- if (time >= frames[frames.length - PathConstraintPositionTimeline.ENTRIES]) // Time is after last frame.
- position = frames[frames.length + PathConstraintPositionTimeline.PREV_VALUE];
- else {
- // Interpolate between the previous frame and the current frame.
- let frame = Animation.binarySearch(frames, time, PathConstraintPositionTimeline.ENTRIES);
- position = frames[frame + PathConstraintPositionTimeline.PREV_VALUE];
- let frameTime = frames[frame];
- let percent = this.getCurvePercent(frame / PathConstraintPositionTimeline.ENTRIES - 1,
- 1 - (time - frameTime) / (frames[frame + PathConstraintPositionTimeline.PREV_TIME] - frameTime));
- position += (frames[frame + PathConstraintPositionTimeline.VALUE] - position) * percent;
- }
- if (blend == MixBlend.setup)
- constraint.position = constraint.data.position + (position - constraint.data.position) * alpha;
- else
- constraint.position += (position - constraint.position) * alpha;
- }
- } PathConstraintPositionTimeline.__initStatic63(); PathConstraintPositionTimeline.__initStatic64(); PathConstraintPositionTimeline.__initStatic65(); PathConstraintPositionTimeline.__initStatic66();
- /** Changes a path constraint's {@link PathConstraint#spacing}. */
- /**
- * @public
- */
- class PathConstraintSpacingTimeline extends PathConstraintPositionTimeline {
- constructor (frameCount) {
- super(frameCount);
- }
- getPropertyId () {
- return (TimelineType.pathConstraintSpacing << 24) + this.pathConstraintIndex;
- }
- apply (skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
- let frames = this.frames;
- let constraint = skeleton.pathConstraints[this.pathConstraintIndex];
- if (!constraint.active) return;
- if (time < frames[0]) {
- switch (blend) {
- case MixBlend.setup:
- constraint.spacing = constraint.data.spacing;
- return;
- case MixBlend.first:
- constraint.spacing += (constraint.data.spacing - constraint.spacing) * alpha;
- }
- return;
- }
- let spacing = 0;
- if (time >= frames[frames.length - PathConstraintSpacingTimeline.ENTRIES]) // Time is after last frame.
- spacing = frames[frames.length + PathConstraintSpacingTimeline.PREV_VALUE];
- else {
- // Interpolate between the previous frame and the current frame.
- let frame = Animation.binarySearch(frames, time, PathConstraintSpacingTimeline.ENTRIES);
- spacing = frames[frame + PathConstraintSpacingTimeline.PREV_VALUE];
- let frameTime = frames[frame];
- let percent = this.getCurvePercent(frame / PathConstraintSpacingTimeline.ENTRIES - 1,
- 1 - (time - frameTime) / (frames[frame + PathConstraintSpacingTimeline.PREV_TIME] - frameTime));
- spacing += (frames[frame + PathConstraintSpacingTimeline.VALUE] - spacing) * percent;
- }
- if (blend == MixBlend.setup)
- constraint.spacing = constraint.data.spacing + (spacing - constraint.data.spacing) * alpha;
- else
- constraint.spacing += (spacing - constraint.spacing) * alpha;
- }
- }
- /** Changes a transform constraint's {@link PathConstraint#rotateMix} and
- * {@link TransformConstraint#translateMix}. */
- /**
- * @public
- */
- class PathConstraintMixTimeline extends CurveTimeline {
- static __initStatic67() {this.ENTRIES = 3;}
- static __initStatic68() {this.PREV_TIME = -3;} static __initStatic69() {this.PREV_ROTATE = -2;} static __initStatic70() {this.PREV_TRANSLATE = -1;}
- static __initStatic71() {this.ROTATE = 1;} static __initStatic72() {this.TRANSLATE = 2;}
- /** The index of the path constraint slot in {@link Skeleton#getPathConstraints()} that will be changed. */
-
- /** The time in seconds, rotate mix, and translate mix for each key frame. */
- // time, rotate mix, translate mix, ...
- constructor (frameCount) {
- super(frameCount);
- this.frames = Utils.newFloatArray(frameCount * PathConstraintMixTimeline.ENTRIES);
- }
- getPropertyId () {
- return (TimelineType.pathConstraintMix << 24) + this.pathConstraintIndex;
- }
- /** The time in seconds, rotate mix, and translate mix for the specified key frame. */
- setFrame (frameIndex, time, rotateMix, translateMix) {
- frameIndex *= PathConstraintMixTimeline.ENTRIES;
- this.frames[frameIndex] = time;
- this.frames[frameIndex + PathConstraintMixTimeline.ROTATE] = rotateMix;
- this.frames[frameIndex + PathConstraintMixTimeline.TRANSLATE] = translateMix;
- }
- apply (skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
- let frames = this.frames;
- let constraint = skeleton.pathConstraints[this.pathConstraintIndex];
- if (!constraint.active) return;
- if (time < frames[0]) {
- switch (blend) {
- case MixBlend.setup:
- constraint.rotateMix = constraint.data.rotateMix;
- constraint.translateMix = constraint.data.translateMix;
- return;
- case MixBlend.first:
- constraint.rotateMix += (constraint.data.rotateMix - constraint.rotateMix) * alpha;
- constraint.translateMix += (constraint.data.translateMix - constraint.translateMix) * alpha;
- }
- return;
- }
- let rotate = 0, translate = 0;
- if (time >= frames[frames.length - PathConstraintMixTimeline.ENTRIES]) { // Time is after last frame.
- rotate = frames[frames.length + PathConstraintMixTimeline.PREV_ROTATE];
- translate = frames[frames.length + PathConstraintMixTimeline.PREV_TRANSLATE];
- } else {
- // Interpolate between the previous frame and the current frame.
- let frame = Animation.binarySearch(frames, time, PathConstraintMixTimeline.ENTRIES);
- rotate = frames[frame + PathConstraintMixTimeline.PREV_ROTATE];
- translate = frames[frame + PathConstraintMixTimeline.PREV_TRANSLATE];
- let frameTime = frames[frame];
- let percent = this.getCurvePercent(frame / PathConstraintMixTimeline.ENTRIES - 1,
- 1 - (time - frameTime) / (frames[frame + PathConstraintMixTimeline.PREV_TIME] - frameTime));
- rotate += (frames[frame + PathConstraintMixTimeline.ROTATE] - rotate) * percent;
- translate += (frames[frame + PathConstraintMixTimeline.TRANSLATE] - translate) * percent;
- }
- if (blend == MixBlend.setup) {
- constraint.rotateMix = constraint.data.rotateMix + (rotate - constraint.data.rotateMix) * alpha;
- constraint.translateMix = constraint.data.translateMix + (translate - constraint.data.translateMix) * alpha;
- } else {
- constraint.rotateMix += (rotate - constraint.rotateMix) * alpha;
- constraint.translateMix += (translate - constraint.translateMix) * alpha;
- }
- }
- } PathConstraintMixTimeline.__initStatic67(); PathConstraintMixTimeline.__initStatic68(); PathConstraintMixTimeline.__initStatic69(); PathConstraintMixTimeline.__initStatic70(); PathConstraintMixTimeline.__initStatic71(); PathConstraintMixTimeline.__initStatic72();
- /** Applies animations over time, queues animations for later playback, mixes (crossfading) between animations, and applies
- * multiple animations on top of each other (layering).
- *
- * See [Applying Animations](http://esotericsoftware.com/spine-applying-animations/) in the Spine Runtimes Guide. */
- /**
- * @public
- */
- class AnimationState {
- static __initStatic() {this.emptyAnimation = new Animation("<empty>", [], 0);}
- /** 1. A previously applied timeline has set this property.
- *
- * Result: Mix from the current pose to the timeline pose. */
- static __initStatic2() {this.SUBSEQUENT = 0;}
- /** 1. This is the first timeline to set this property.
- * 2. The next track entry applied after this one does not have a timeline to set this property.
- *
- * Result: Mix from the setup pose to the timeline pose. */
- static __initStatic3() {this.FIRST = 1;}
- /** 1) A previously applied timeline has set this property.<br>
- * 2) The next track entry to be applied does have a timeline to set this property.<br>
- * 3) The next track entry after that one does not have a timeline to set this property.<br>
- * Result: Mix from the current pose to the timeline pose, but do not mix out. This avoids "dipping" when crossfading
- * animations that key the same property. A subsequent timeline will set this property using a mix. */
- static __initStatic4() {this.HOLD_SUBSEQUENT = 2;}
- /** 1) This is the first timeline to set this property.<br>
- * 2) The next track entry to be applied does have a timeline to set this property.<br>
- * 3) The next track entry after that one does not have a timeline to set this property.<br>
- * Result: Mix from the setup pose to the timeline pose, but do not mix out. This avoids "dipping" when crossfading animations
- * that key the same property. A subsequent timeline will set this property using a mix. */
- static __initStatic5() {this.HOLD_FIRST = 3;}
- /** 1. This is the first timeline to set this property.
- * 2. The next track entry to be applied does have a timeline to set this property.
- * 3. The next track entry after that one does have a timeline to set this property.
- * 4. timelineHoldMix stores the first subsequent track entry that does not have a timeline to set this property.
- *
- * Result: The same as HOLD except the mix percentage from the timelineHoldMix track entry is used. This handles when more than
- * 2 track entries in a row have a timeline that sets the same property.
- *
- * Eg, A -> B -> C -> D where A, B, and C have a timeline setting same property, but D does not. When A is applied, to avoid
- * "dipping" A is not mixed out, however D (the first entry that doesn't set the property) mixing in is used to mix out A
- * (which affects B and C). Without using D to mix out, A would be applied fully until mixing completes, then snap into
- * place. */
- static __initStatic6() {this.HOLD_MIX = 4;}
- static __initStatic7() {this.SETUP = 1;}
- static __initStatic8() {this.CURRENT = 2;}
- /** The AnimationStateData to look up mix durations. */
-
- /** The list of tracks that currently have animations, which may contain null entries. */
- __init() {this.tracks = new Array();}
- /** Multiplier for the delta time when the animation state is updated, causing time for all animations and mixes to play slower
- * or faster. Defaults to 1.
- *
- * See TrackEntry {@link TrackEntry#timeScale} for affecting a single animation. */
- __init2() {this.timeScale = 1;}
- __init3() {this.unkeyedState = 0;}
- __init4() {this.events = new Array();}
- __init5() {this.listeners = new Array();}
- __init6() {this.queue = new EventQueue(this);}
- __init7() {this.propertyIDs = new IntSet();}
- __init8() {this.animationsChanged = false;}
- __init9() {this.trackEntryPool = new Pool(() => new TrackEntry());}
- constructor (data) {AnimationState.prototype.__init.call(this);AnimationState.prototype.__init2.call(this);AnimationState.prototype.__init3.call(this);AnimationState.prototype.__init4.call(this);AnimationState.prototype.__init5.call(this);AnimationState.prototype.__init6.call(this);AnimationState.prototype.__init7.call(this);AnimationState.prototype.__init8.call(this);AnimationState.prototype.__init9.call(this);
- this.data = data;
- }
- /** Increments each track entry {@link TrackEntry#trackTime()}, setting queued animations as current if needed. */
- update (delta) {
- delta *= this.timeScale;
- let tracks = this.tracks;
- for (let i = 0, n = tracks.length; i < n; i++) {
- let current = tracks[i];
- if (current == null) continue;
- current.animationLast = current.nextAnimationLast;
- current.trackLast = current.nextTrackLast;
- let currentDelta = delta * current.timeScale;
- if (current.delay > 0) {
- current.delay -= currentDelta;
- if (current.delay > 0) continue;
- currentDelta = -current.delay;
- current.delay = 0;
- }
- let next = current.next;
- if (next != null) {
- // When the next entry's delay is passed, change to the next entry, preserving leftover time.
- let nextTime = current.trackLast - next.delay;
- if (nextTime >= 0) {
- next.delay = 0;
- next.trackTime += current.timeScale == 0 ? 0 : (nextTime / current.timeScale + delta) * next.timeScale;
- current.trackTime += currentDelta;
- this.setCurrent(i, next, true);
- while (next.mixingFrom != null) {
- next.mixTime += delta;
- next = next.mixingFrom;
- }
- continue;
- }
- } else if (current.trackLast >= current.trackEnd && current.mixingFrom == null) {
- tracks[i] = null;
- this.queue.end(current);
- this.disposeNext(current);
- continue;
- }
- if (current.mixingFrom != null && this.updateMixingFrom(current, delta)) {
- // End mixing from entries once all have completed.
- let from = current.mixingFrom;
- current.mixingFrom = null;
- if (from != null) from.mixingTo = null;
- while (from != null) {
- this.queue.end(from);
- from = from.mixingFrom;
- }
- }
- current.trackTime += currentDelta;
- }
- this.queue.drain();
- }
- /** Returns true when all mixing from entries are complete. */
- updateMixingFrom (to, delta) {
- let from = to.mixingFrom;
- if (from == null) return true;
- let finished = this.updateMixingFrom(from, delta);
- from.animationLast = from.nextAnimationLast;
- from.trackLast = from.nextTrackLast;
- // Require mixTime > 0 to ensure the mixing from entry was applied at least once.
- if (to.mixTime > 0 && to.mixTime >= to.mixDuration) {
- // Require totalAlpha == 0 to ensure mixing is complete, unless mixDuration == 0 (the transition is a single frame).
- if (from.totalAlpha == 0 || to.mixDuration == 0) {
- to.mixingFrom = from.mixingFrom;
- if (from.mixingFrom != null) from.mixingFrom.mixingTo = to;
- to.interruptAlpha = from.interruptAlpha;
- this.queue.end(from);
- }
- return finished;
- }
- from.trackTime += delta * from.timeScale;
- to.mixTime += delta;
- return false;
- }
- /** Poses the skeleton using the track entry animations. There are no side effects other than invoking listeners, so the
- * animation state can be applied to multiple skeletons to pose them identically.
- * @returns True if any animations were applied. */
- apply (skeleton) {
- if (skeleton == null) throw new Error("skeleton cannot be null.");
- if (this.animationsChanged) this._animationsChanged();
- let events = this.events;
- let tracks = this.tracks;
- let applied = false;
- for (let i = 0, n = tracks.length; i < n; i++) {
- let current = tracks[i];
- if (current == null || current.delay > 0) continue;
- applied = true;
- let blend = i == 0 ? MixBlend.first : current.mixBlend;
- // Apply mixing from entries first.
- let mix = current.alpha;
- if (current.mixingFrom != null)
- mix *= this.applyMixingFrom(current, skeleton, blend);
- else if (current.trackTime >= current.trackEnd && current.next == null)
- mix = 0;
- // Apply current entry.
- let animationLast = current.animationLast, animationTime = current.getAnimationTime();
- let timelineCount = current.animation.timelines.length;
- let timelines = current.animation.timelines;
- if ((i == 0 && mix == 1) || blend == MixBlend.add) {
- for (let ii = 0; ii < timelineCount; ii++) {
- // Fixes issue #302 on IOS9 where mix, blend sometimes became undefined and caused assets
- // to sometimes stop rendering when using color correction, as their RGBA values become NaN.
- // (https://github.com/pixijs/pixi-spine/issues/302)
- Utils.webkit602BugfixHelper(mix, blend);
- var timeline = timelines[ii];
- if (timeline instanceof AttachmentTimeline)
- this.applyAttachmentTimeline(timeline, skeleton, animationTime, blend, true);
- else
- timeline.apply(skeleton, animationLast, animationTime, events, mix, blend, MixDirection.mixIn);
- }
- } else {
- let timelineMode = current.timelineMode;
- let firstFrame = current.timelinesRotation.length == 0;
- if (firstFrame) Utils.setArraySize(current.timelinesRotation, timelineCount << 1, null);
- let timelinesRotation = current.timelinesRotation;
- for (let ii = 0; ii < timelineCount; ii++) {
- let timeline = timelines[ii];
- let timelineBlend = timelineMode[ii] == AnimationState.SUBSEQUENT ? blend : MixBlend.setup;
- if (timeline instanceof RotateTimeline) {
- this.applyRotateTimeline(timeline, skeleton, animationTime, mix, timelineBlend, timelinesRotation, ii << 1, firstFrame);
- } else if (timeline instanceof AttachmentTimeline) {
- this.applyAttachmentTimeline(timeline, skeleton, animationTime, blend, true);
- } else {
- // This fixes the WebKit 602 specific issue described at http://esotericsoftware.com/forum/iOS-10-disappearing-graphics-10109
- Utils.webkit602BugfixHelper(mix, blend);
- timeline.apply(skeleton, animationLast, animationTime, events, mix, timelineBlend, MixDirection.mixIn);
- }
- }
- }
- this.queueEvents(current, animationTime);
- events.length = 0;
- current.nextAnimationLast = animationTime;
- current.nextTrackLast = current.trackTime;
- }
- // Set slots attachments to the setup pose, if needed. This occurs if an animation that is mixing out sets attachments so
- // subsequent timelines see any deform, but the subsequent timelines don't set an attachment (eg they are also mixing out or
- // the time is before the first key).
- var setupState = this.unkeyedState + AnimationState.SETUP;
- var slots = skeleton.slots;
- for (var i = 0, n = skeleton.slots.length; i < n; i++) {
- var slot = slots[i];
- if (slot.attachmentState == setupState) {
- var attachmentName = slot.data.attachmentName;
- slot.setAttachment(attachmentName == null ? null : skeleton.getAttachment(slot.data.index, attachmentName));
- }
- }
- this.unkeyedState += 2; // Increasing after each use avoids the need to reset attachmentState for every slot.
- this.queue.drain();
- return applied;
- }
- applyMixingFrom (to, skeleton, blend) {
- let from = to.mixingFrom;
- if (from.mixingFrom != null) this.applyMixingFrom(from, skeleton, blend);
- let mix = 0;
- if (to.mixDuration == 0) { // Single frame mix to undo mixingFrom changes.
- mix = 1;
- if (blend == MixBlend.first) blend = MixBlend.setup;
- } else {
- mix = to.mixTime / to.mixDuration;
- if (mix > 1) mix = 1;
- if (blend != MixBlend.first) blend = from.mixBlend;
- }
- let events = mix < from.eventThreshold ? this.events : null;
- let attachments = mix < from.attachmentThreshold, drawOrder = mix < from.drawOrderThreshold;
- let animationLast = from.animationLast, animationTime = from.getAnimationTime();
- let timelineCount = from.animation.timelines.length;
- let timelines = from.animation.timelines;
- let alphaHold = from.alpha * to.interruptAlpha, alphaMix = alphaHold * (1 - mix);
- if (blend == MixBlend.add) {
- for (let i = 0; i < timelineCount; i++)
- timelines[i].apply(skeleton, animationLast, animationTime, events, alphaMix, blend, MixDirection.mixOut);
- } else {
- let timelineMode = from.timelineMode;
- let timelineHoldMix = from.timelineHoldMix;
- let firstFrame = from.timelinesRotation.length == 0;
- if (firstFrame) Utils.setArraySize(from.timelinesRotation, timelineCount << 1, null);
- let timelinesRotation = from.timelinesRotation;
- from.totalAlpha = 0;
- for (let i = 0; i < timelineCount; i++) {
- let timeline = timelines[i];
- let direction = MixDirection.mixOut;
- let timelineBlend;
- let alpha = 0;
- switch (timelineMode[i]) {
- case AnimationState.SUBSEQUENT:
- if (!drawOrder && timeline instanceof DrawOrderTimeline) continue;
- timelineBlend = blend;
- alpha = alphaMix;
- break;
- case AnimationState.FIRST:
- timelineBlend = MixBlend.setup;
- alpha = alphaMix;
- break;
- case AnimationState.HOLD_SUBSEQUENT:
- timelineBlend = blend;
- alpha = alphaHold;
- break;
- case AnimationState.HOLD_FIRST:
- timelineBlend = MixBlend.setup;
- alpha = alphaHold;
- break;
- default:
- timelineBlend = MixBlend.setup;
- let holdMix = timelineHoldMix[i];
- alpha = alphaHold * Math.max(0, 1 - holdMix.mixTime / holdMix.mixDuration);
- break;
- }
- from.totalAlpha += alpha;
- if (timeline instanceof RotateTimeline)
- this.applyRotateTimeline(timeline, skeleton, animationTime, alpha, timelineBlend, timelinesRotation, i << 1, firstFrame);
- else if (timeline instanceof AttachmentTimeline)
- this.applyAttachmentTimeline(timeline, skeleton, animationTime, timelineBlend, attachments);
- else {
- // This fixes the WebKit 602 specific issue described at http://esotericsoftware.com/forum/iOS-10-disappearing-graphics-10109
- Utils.webkit602BugfixHelper(alpha, blend);
- if (drawOrder && timeline instanceof DrawOrderTimeline && timelineBlend == MixBlend.setup)
- direction = MixDirection.mixIn;
- timeline.apply(skeleton, animationLast, animationTime, events, alpha, timelineBlend, direction);
- }
- }
- }
- if (to.mixDuration > 0) this.queueEvents(from, animationTime);
- this.events.length = 0;
- from.nextAnimationLast = animationTime;
- from.nextTrackLast = from.trackTime;
- return mix;
- }
- applyAttachmentTimeline (timeline, skeleton, time, blend, attachments) {
- var slot = skeleton.slots[timeline.slotIndex];
- if (!slot.bone.active) return;
- var frames = timeline.frames;
- if (time < frames[0]) { // Time is before first frame.
- if (blend == MixBlend.setup || blend == MixBlend.first)
- this.setAttachment(skeleton, slot, slot.data.attachmentName, attachments);
- }
- else {
- var frameIndex;
- if (time >= frames[frames.length - 1]) // Time is after last frame.
- frameIndex = frames.length - 1;
- else
- frameIndex = Animation.binarySearch(frames, time) - 1;
- this.setAttachment(skeleton, slot, timeline.attachmentNames[frameIndex], attachments);
- }
- // If an attachment wasn't set (ie before the first frame or attachments is false), set the setup attachment later.
- if (slot.attachmentState <= this.unkeyedState) slot.attachmentState = this.unkeyedState + AnimationState.SETUP;
- }
- setAttachment (skeleton, slot, attachmentName, attachments) {
- slot.setAttachment(attachmentName == null ? null : skeleton.getAttachment(slot.data.index, attachmentName));
- if (attachments) slot.attachmentState = this.unkeyedState + AnimationState.CURRENT;
- }
- applyRotateTimeline (timeline, skeleton, time, alpha, blend,
- timelinesRotation, i, firstFrame) {
- if (firstFrame) timelinesRotation[i] = 0;
- if (alpha == 1) {
- timeline.apply(skeleton, 0, time, null, 1, blend, MixDirection.mixIn);
- return;
- }
- let rotateTimeline = timeline ;
- let frames = rotateTimeline.frames;
- let bone = skeleton.bones[rotateTimeline.boneIndex];
- if (!bone.active) return;
- let r1 = 0, r2 = 0;
- if (time < frames[0]) {
- switch (blend) {
- case MixBlend.setup:
- bone.rotation = bone.data.rotation;
- default:
- return;
- case MixBlend.first:
- r1 = bone.rotation;
- r2 = bone.data.rotation;
- }
- } else {
- r1 = blend == MixBlend.setup ? bone.data.rotation : bone.rotation;
- if (time >= frames[frames.length - RotateTimeline.ENTRIES]) // Time is after last frame.
- r2 = bone.data.rotation + frames[frames.length + RotateTimeline.PREV_ROTATION];
- else {
- // Interpolate between the previous frame and the current frame.
- let frame = Animation.binarySearch(frames, time, RotateTimeline.ENTRIES);
- let prevRotation = frames[frame + RotateTimeline.PREV_ROTATION];
- let frameTime = frames[frame];
- let percent = rotateTimeline.getCurvePercent((frame >> 1) - 1,
- 1 - (time - frameTime) / (frames[frame + RotateTimeline.PREV_TIME] - frameTime));
- r2 = frames[frame + RotateTimeline.ROTATION] - prevRotation;
- r2 -= (16384 - ((16384.499999999996 - r2 / 360) | 0)) * 360;
- r2 = prevRotation + r2 * percent + bone.data.rotation;
- r2 -= (16384 - ((16384.499999999996 - r2 / 360) | 0)) * 360;
- }
- }
- // Mix between rotations using the direction of the shortest route on the first frame while detecting crosses.
- let total = 0, diff = r2 - r1;
- diff -= (16384 - ((16384.499999999996 - diff / 360) | 0)) * 360;
- if (diff == 0) {
- total = timelinesRotation[i];
- } else {
- let lastTotal = 0, lastDiff = 0;
- if (firstFrame) {
- lastTotal = 0;
- lastDiff = diff;
- } else {
- lastTotal = timelinesRotation[i]; // Angle and direction of mix, including loops.
- lastDiff = timelinesRotation[i + 1]; // Difference between bones.
- }
- let current = diff > 0, dir = lastTotal >= 0;
- // Detect cross at 0 (not 180).
- if (MathUtils.signum(lastDiff) != MathUtils.signum(diff) && Math.abs(lastDiff) <= 90) {
- // A cross after a 360 rotation is a loop.
- if (Math.abs(lastTotal) > 180) lastTotal += 360 * MathUtils.signum(lastTotal);
- dir = current;
- }
- total = diff + lastTotal - lastTotal % 360; // Store loops as part of lastTotal.
- if (dir != current) total += 360 * MathUtils.signum(lastTotal);
- timelinesRotation[i] = total;
- }
- timelinesRotation[i + 1] = diff;
- r1 += total * alpha;
- bone.rotation = r1 - (16384 - ((16384.499999999996 - r1 / 360) | 0)) * 360;
- }
- queueEvents (entry, animationTime) {
- let animationStart = entry.animationStart, animationEnd = entry.animationEnd;
- let duration = animationEnd - animationStart;
- let trackLastWrapped = entry.trackLast % duration;
- // Queue events before complete.
- let events = this.events;
- let i = 0, n = events.length;
- for (; i < n; i++) {
- let event = events[i];
- if (event.time < trackLastWrapped) break;
- if (event.time > animationEnd) continue; // Discard events outside animation start/end.
- this.queue.event(entry, event);
- }
- // Queue complete if completed a loop iteration or the animation.
- let complete = false;
- if (entry.loop)
- complete = duration == 0 || trackLastWrapped > entry.trackTime % duration;
- else
- complete = animationTime >= animationEnd && entry.animationLast < animationEnd;
- if (complete) this.queue.complete(entry);
- // Queue events after complete.
- for (; i < n; i++) {
- let event = events[i];
- if (event.time < animationStart) continue; // Discard events outside animation start/end.
- this.queue.event(entry, events[i]);
- }
- }
- /** Removes all animations from all tracks, leaving skeletons in their current pose.
- *
- * It may be desired to use {@link AnimationState#setEmptyAnimation()} to mix the skeletons back to the setup pose,
- * rather than leaving them in their current pose. */
- clearTracks () {
- let oldDrainDisabled = this.queue.drainDisabled;
- this.queue.drainDisabled = true;
- for (let i = 0, n = this.tracks.length; i < n; i++)
- this.clearTrack(i);
- this.tracks.length = 0;
- this.queue.drainDisabled = oldDrainDisabled;
- this.queue.drain();
- }
- /** Removes all animations from the track, leaving skeletons in their current pose.
- *
- * It may be desired to use {@link AnimationState#setEmptyAnimation()} to mix the skeletons back to the setup pose,
- * rather than leaving them in their current pose. */
- clearTrack (trackIndex) {
- if (trackIndex >= this.tracks.length) return;
- let current = this.tracks[trackIndex];
- if (current == null) return;
- this.queue.end(current);
- this.disposeNext(current);
- let entry = current;
- while (true) {
- let from = entry.mixingFrom;
- if (from == null) break;
- this.queue.end(from);
- entry.mixingFrom = null;
- entry.mixingTo = null;
- entry = from;
- }
- this.tracks[current.trackIndex] = null;
- this.queue.drain();
- }
- setCurrent (index, current, interrupt) {
- let from = this.expandToIndex(index);
- this.tracks[index] = current;
- if (from != null) {
- if (interrupt) this.queue.interrupt(from);
- current.mixingFrom = from;
- from.mixingTo = current;
- current.mixTime = 0;
- // Store the interrupted mix percentage.
- if (from.mixingFrom != null && from.mixDuration > 0)
- current.interruptAlpha *= Math.min(1, from.mixTime / from.mixDuration);
- from.timelinesRotation.length = 0; // Reset rotation for mixing out, in case entry was mixed in.
- }
- this.queue.start(current);
- }
- /** Sets an animation by name.
- *
- * {@link #setAnimationWith(}. */
- setAnimation (trackIndex, animationName, loop) {
- let animation = this.data.skeletonData.findAnimation(animationName);
- if (animation == null) throw new Error("Animation not found: " + animationName);
- return this.setAnimationWith(trackIndex, animation, loop);
- }
- /** Sets the current animation for a track, discarding any queued animations. If the formerly current track entry was never
- * applied to a skeleton, it is replaced (not mixed from).
- * @param loop If true, the animation will repeat. If false it will not, instead its last frame is applied if played beyond its
- * duration. In either case {@link TrackEntry#trackEnd} determines when the track is cleared.
- * @returns A track entry to allow further customization of animation playback. References to the track entry must not be kept
- * after the {@link AnimationStateListener#dispose()} event occurs. */
- setAnimationWith (trackIndex, animation, loop) {
- if (animation == null) throw new Error("animation cannot be null.");
- let interrupt = true;
- let current = this.expandToIndex(trackIndex);
- if (current != null) {
- if (current.nextTrackLast == -1) {
- // Don't mix from an entry that was never applied.
- this.tracks[trackIndex] = current.mixingFrom;
- this.queue.interrupt(current);
- this.queue.end(current);
- this.disposeNext(current);
- current = current.mixingFrom;
- interrupt = false;
- } else
- this.disposeNext(current);
- }
- let entry = this.trackEntry(trackIndex, animation, loop, current);
- this.setCurrent(trackIndex, entry, interrupt);
- this.queue.drain();
- return entry;
- }
- /** Queues an animation by name.
- *
- * See {@link #addAnimationWith()}. */
- addAnimation (trackIndex, animationName, loop, delay) {
- let animation = this.data.skeletonData.findAnimation(animationName);
- if (animation == null) throw new Error("Animation not found: " + animationName);
- return this.addAnimationWith(trackIndex, animation, loop, delay);
- }
- /** Adds an animation to be played after the current or last queued animation for a track. If the track is empty, it is
- * equivalent to calling {@link #setAnimationWith()}.
- * @param delay If > 0, sets {@link TrackEntry#delay}. If <= 0, the delay set is the duration of the previous track entry
- * minus any mix duration (from the {@link AnimationStateData}) plus the specified `delay` (ie the mix
- * ends at (`delay` = 0) or before (`delay` < 0) the previous track entry duration). If the
- * previous entry is looping, its next loop completion is used instead of its duration.
- * @returns A track entry to allow further customization of animation playback. References to the track entry must not be kept
- * after the {@link AnimationStateListener#dispose()} event occurs. */
- addAnimationWith (trackIndex, animation, loop, delay) {
- if (animation == null) throw new Error("animation cannot be null.");
- let last = this.expandToIndex(trackIndex);
- if (last != null) {
- while (last.next != null)
- last = last.next;
- }
- let entry = this.trackEntry(trackIndex, animation, loop, last);
- if (last == null) {
- this.setCurrent(trackIndex, entry, true);
- this.queue.drain();
- } else {
- last.next = entry;
- if (delay <= 0) {
- let duration = last.animationEnd - last.animationStart;
- if (duration != 0) {
- if (last.loop)
- delay += duration * (1 + ((last.trackTime / duration) | 0));
- else
- delay += Math.max(duration, last.trackTime);
- delay -= this.data.getMix(last.animation, animation);
- } else
- delay = last.trackTime;
- }
- }
- entry.delay = delay;
- return entry;
- }
- /** Sets an empty animation for a track, discarding any queued animations, and sets the track entry's
- * {@link TrackEntry#mixduration}. An empty animation has no timelines and serves as a placeholder for mixing in or out.
- *
- * Mixing out is done by setting an empty animation with a mix duration using either {@link #setEmptyAnimation()},
- * {@link #setEmptyAnimations()}, or {@link #addEmptyAnimation()}. Mixing to an empty animation causes
- * the previous animation to be applied less and less over the mix duration. Properties keyed in the previous animation
- * transition to the value from lower tracks or to the setup pose value if no lower tracks key the property. A mix duration of
- * 0 still mixes out over one frame.
- *
- * Mixing in is done by first setting an empty animation, then adding an animation using
- * {@link #addAnimation()} and on the returned track entry, set the
- * {@link TrackEntry#setMixDuration()}. Mixing from an empty animation causes the new animation to be applied more and
- * more over the mix duration. Properties keyed in the new animation transition from the value from lower tracks or from the
- * setup pose value if no lower tracks key the property to the value keyed in the new animation. */
- setEmptyAnimation (trackIndex, mixDuration) {
- let entry = this.setAnimationWith(trackIndex, AnimationState.emptyAnimation, false);
- entry.mixDuration = mixDuration;
- entry.trackEnd = mixDuration;
- return entry;
- }
- /** Adds an empty animation to be played after the current or last queued animation for a track, and sets the track entry's
- * {@link TrackEntry#mixDuration}. If the track is empty, it is equivalent to calling
- * {@link #setEmptyAnimation()}.
- *
- * See {@link #setEmptyAnimation()}.
- * @param delay If > 0, sets {@link TrackEntry#delay}. If <= 0, the delay set is the duration of the previous track entry
- * minus any mix duration plus the specified `delay` (ie the mix ends at (`delay` = 0) or
- * before (`delay` < 0) the previous track entry duration). If the previous entry is looping, its next
- * loop completion is used instead of its duration.
- * @return A track entry to allow further customization of animation playback. References to the track entry must not be kept
- * after the {@link AnimationStateListener#dispose()} event occurs. */
- addEmptyAnimation (trackIndex, mixDuration, delay) {
- if (delay <= 0) delay -= mixDuration;
- let entry = this.addAnimationWith(trackIndex, AnimationState.emptyAnimation, false, delay);
- entry.mixDuration = mixDuration;
- entry.trackEnd = mixDuration;
- return entry;
- }
- /** Sets an empty animation for every track, discarding any queued animations, and mixes to it over the specified mix
- * duration. */
- setEmptyAnimations (mixDuration) {
- let oldDrainDisabled = this.queue.drainDisabled;
- this.queue.drainDisabled = true;
- for (let i = 0, n = this.tracks.length; i < n; i++) {
- let current = this.tracks[i];
- if (current != null) this.setEmptyAnimation(current.trackIndex, mixDuration);
- }
- this.queue.drainDisabled = oldDrainDisabled;
- this.queue.drain();
- }
- expandToIndex (index) {
- if (index < this.tracks.length) return this.tracks[index];
- Utils.ensureArrayCapacity(this.tracks, index + 1, null);
- this.tracks.length = index + 1;
- return null;
- }
- /** @param last May be null. */
- trackEntry (trackIndex, animation, loop, last) {
- let entry = this.trackEntryPool.obtain();
- entry.trackIndex = trackIndex;
- entry.animation = animation;
- entry.loop = loop;
- entry.holdPrevious = false;
- entry.eventThreshold = 0;
- entry.attachmentThreshold = 0;
- entry.drawOrderThreshold = 0;
- entry.animationStart = 0;
- entry.animationEnd = animation.duration;
- entry.animationLast = -1;
- entry.nextAnimationLast = -1;
- entry.delay = 0;
- entry.trackTime = 0;
- entry.trackLast = -1;
- entry.nextTrackLast = -1;
- entry.trackEnd = Number.MAX_VALUE;
- entry.timeScale = 1;
- entry.alpha = 1;
- entry.interruptAlpha = 1;
- entry.mixTime = 0;
- entry.mixDuration = last == null ? 0 : this.data.getMix(last.animation, animation);
- entry.mixBlend = MixBlend.replace;
- return entry;
- }
- disposeNext (entry) {
- let next = entry.next;
- while (next != null) {
- this.queue.dispose(next);
- next = next.next;
- }
- entry.next = null;
- }
- _animationsChanged () {
- this.animationsChanged = false;
- this.propertyIDs.clear();
- for (let i = 0, n = this.tracks.length; i < n; i++) {
- let entry = this.tracks[i];
- if (entry == null) continue;
- while (entry.mixingFrom != null)
- entry = entry.mixingFrom;
- do {
- if (entry.mixingFrom == null || entry.mixBlend != MixBlend.add) this.computeHold(entry);
- entry = entry.mixingTo;
- } while (entry != null)
- }
- }
- computeHold (entry) {
- let to = entry.mixingTo;
- let timelines = entry.animation.timelines;
- let timelinesCount = entry.animation.timelines.length;
- let timelineMode = Utils.setArraySize(entry.timelineMode, timelinesCount);
- entry.timelineHoldMix.length = 0;
- let timelineDipMix = Utils.setArraySize(entry.timelineHoldMix, timelinesCount);
- let propertyIDs = this.propertyIDs;
- if (to != null && to.holdPrevious) {
- for (let i = 0; i < timelinesCount; i++) {
- timelineMode[i] = propertyIDs.add(timelines[i].getPropertyId()) ? AnimationState.HOLD_FIRST : AnimationState.HOLD_SUBSEQUENT;
- }
- return;
- }
- outer:
- for (let i = 0; i < timelinesCount; i++) {
- let timeline = timelines[i];
- let id = timeline.getPropertyId();
- if (!propertyIDs.add(id))
- timelineMode[i] = AnimationState.SUBSEQUENT;
- else if (to == null || timeline instanceof AttachmentTimeline || timeline instanceof DrawOrderTimeline
- || timeline instanceof EventTimeline || !to.animation.hasTimeline(id)) {
- timelineMode[i] = AnimationState.FIRST;
- } else {
- for (let next = to.mixingTo; next != null; next = next.mixingTo) {
- if (next.animation.hasTimeline(id)) continue;
- if (entry.mixDuration > 0) {
- timelineMode[i] = AnimationState.HOLD_MIX;
- timelineDipMix[i] = next;
- continue outer;
- }
- break;
- }
- timelineMode[i] = AnimationState.HOLD_FIRST;
- }
- }
- }
- /** Returns the track entry for the animation currently playing on the track, or null if no animation is currently playing. */
- getCurrent (trackIndex) {
- if (trackIndex >= this.tracks.length) return null;
- return this.tracks[trackIndex];
- }
- /** Adds a listener to receive events for all track entries. */
- addListener (listener) {
- if (listener == null) throw new Error("listener cannot be null.");
- this.listeners.push(listener);
- }
- /** Removes the listener added with {@link #addListener()}. */
- removeListener (listener) {
- let index = this.listeners.indexOf(listener);
- if (index >= 0) this.listeners.splice(index, 1);
- }
- /** Removes all listeners added with {@link #addListener()}. */
- clearListeners () {
- this.listeners.length = 0;
- }
- /** Discards all listener notifications that have not yet been delivered. This can be useful to call from an
- * {@link AnimationStateListener} when it is known that further notifications that may have been already queued for delivery
- * are not wanted because new animations are being set. */
- clearListenerNotifications () {
- this.queue.clear();
- }
- //deprecated stuff
-
-
-
-
- static __initStatic9() {this.deprecatedWarning1 = false;}
- setAnimationByName(trackIndex, animationName, loop) {
- if (!AnimationState.deprecatedWarning1) {
- AnimationState.deprecatedWarning1 = true;
- console.warn("Spine Deprecation Warning: AnimationState.setAnimationByName is deprecated, please use setAnimation from now on.");
- }
- this.setAnimation(trackIndex, animationName, loop);
- }
- static __initStatic10() {this.deprecatedWarning2 = false;}
- addAnimationByName(trackIndex, animationName, loop, delay) {
- if (!AnimationState.deprecatedWarning2) {
- AnimationState.deprecatedWarning2 = true;
- console.warn("Spine Deprecation Warning: AnimationState.addAnimationByName is deprecated, please use addAnimation from now on.");
- }
- this.addAnimation(trackIndex, animationName, loop, delay);
- }
- static __initStatic11() {this.deprecatedWarning3 = false;}
- hasAnimation(animationName) {
- let animation = this.data.skeletonData.findAnimation(animationName);
- return animation !== null;
- }
- hasAnimationByName(animationName) {
- if (!AnimationState.deprecatedWarning3) {
- AnimationState.deprecatedWarning3 = true;
- console.warn("Spine Deprecation Warning: AnimationState.hasAnimationByName is deprecated, please use hasAnimation from now on.");
- }
- return this.hasAnimation(animationName);
- }
- } AnimationState.__initStatic(); AnimationState.__initStatic2(); AnimationState.__initStatic3(); AnimationState.__initStatic4(); AnimationState.__initStatic5(); AnimationState.__initStatic6(); AnimationState.__initStatic7(); AnimationState.__initStatic8(); AnimationState.__initStatic9(); AnimationState.__initStatic10(); AnimationState.__initStatic11();
- /** Stores settings and other state for the playback of an animation on an {@link AnimationState} track.
- *
- * References to a track entry must not be kept after the {@link AnimationStateListener#dispose()} event occurs. */
- /**
- * @public
- */
- class TrackEntry {constructor() { TrackEntry.prototype.__init10.call(this);TrackEntry.prototype.__init11.call(this);TrackEntry.prototype.__init12.call(this);TrackEntry.prototype.__init13.call(this); }
- /** The animation to apply for this track entry. */
-
- /** The animation queued to start after this animation, or null. `next` makes up a linked list. */
-
- /** The track entry for the previous animation when mixing from the previous animation to this animation, or null if no
- * mixing is currently occuring. When mixing from multiple animations, `mixingFrom` makes up a linked list. */
-
- /** The track entry for the next animation when mixing from this animation to the next animation, or null if no mixing is
- * currently occuring. When mixing to multiple animations, `mixingTo` makes up a linked list. */
-
- /** The listener for events generated by this track entry, or null.
- *
- * A track entry returned from {@link AnimationState#setAnimation()} is already the current animation
- * for the track, so the track entry listener {@link AnimationStateListener#start()} will not be called. */
-
- /** The index of the track where this track entry is either current or queued.
- *
- * See {@link AnimationState#getCurrent()}. */
-
- /** If true, the animation will repeat. If false it will not, instead its last frame is applied if played beyond its
- * duration. */
-
- /** If true, when mixing from the previous animation to this animation, the previous animation is applied as normal instead
- * of being mixed out.
- *
- * When mixing between animations that key the same property, if a lower track also keys that property then the value will
- * briefly dip toward the lower track value during the mix. This happens because the first animation mixes from 100% to 0%
- * while the second animation mixes from 0% to 100%. Setting `holdPrevious` to true applies the first animation
- * at 100% during the mix so the lower track value is overwritten. Such dipping does not occur on the lowest track which
- * keys the property, only when a higher track also keys the property.
- *
- * Snapping will occur if `holdPrevious` is true and this animation does not key all the same properties as the
- * previous animation. */
-
- /** When the mix percentage ({@link #mixTime} / {@link #mixDuration}) is less than the
- * `eventThreshold`, event timelines are applied while this animation is being mixed out. Defaults to 0, so event
- * timelines are not applied while this animation is being mixed out. */
-
- /** When the mix percentage ({@link #mixtime} / {@link #mixDuration}) is less than the
- * `attachmentThreshold`, attachment timelines are applied while this animation is being mixed out. Defaults to
- * 0, so attachment timelines are not applied while this animation is being mixed out. */
-
- /** When the mix percentage ({@link #mixTime} / {@link #mixDuration}) is less than the
- * `drawOrderThreshold`, draw order timelines are applied while this animation is being mixed out. Defaults to 0,
- * so draw order timelines are not applied while this animation is being mixed out. */
-
- /** Seconds when this animation starts, both initially and after looping. Defaults to 0.
- *
- * When changing the `animationStart` time, it often makes sense to set {@link #animationLast} to the same
- * value to prevent timeline keys before the start time from triggering. */
-
- /** Seconds for the last frame of this animation. Non-looping animations won't play past this time. Looping animations will
- * loop back to {@link #animationStart} at this time. Defaults to the animation {@link Animation#duration}. */
-
- /** The time in seconds this animation was last applied. Some timelines use this for one-time triggers. Eg, when this
- * animation is applied, event timelines will fire all events between the `animationLast` time (exclusive) and
- * `animationTime` (inclusive). Defaults to -1 to ensure triggers on frame 0 happen the first time this animation
- * is applied. */
-
-
- /** Seconds to postpone playing the animation. When this track entry is the current track entry, `delay`
- * postpones incrementing the {@link #trackTime}. When this track entry is queued, `delay` is the time from
- * the start of the previous animation to when this track entry will become the current track entry (ie when the previous
- * track entry {@link TrackEntry#trackTime} >= this track entry's `delay`).
- *
- * {@link #timeScale} affects the delay. */
-
- /** Current time in seconds this track entry has been the current track entry. The track time determines
- * {@link #animationTime}. The track time can be set to start the animation at a time other than 0, without affecting
- * looping. */
-
-
- /** The track time in seconds when this animation will be removed from the track. Defaults to the highest possible float
- * value, meaning the animation will be applied until a new animation is set or the track is cleared. If the track end time
- * is reached, no other animations are queued for playback, and mixing from any previous animations is complete, then the
- * properties keyed by the animation are set to the setup pose and the track is cleared.
- *
- * It may be desired to use {@link AnimationState#addEmptyAnimation()} rather than have the animation
- * abruptly cease being applied. */
-
- /** Multiplier for the delta time when this track entry is updated, causing time for this animation to pass slower or
- * faster. Defaults to 1.
- *
- * {@link #mixTime} is not affected by track entry time scale, so {@link #mixDuration} may need to be adjusted to
- * match the animation speed.
- *
- * When using {@link AnimationState#addAnimation()} with a `delay` <= 0, note the
- * {@link #delay} is set using the mix duration from the {@link AnimationStateData}, assuming time scale to be 1. If
- * the time scale is not 1, the delay may need to be adjusted.
- *
- * See AnimationState {@link AnimationState#timeScale} for affecting all animations. */
-
- /** Values < 1 mix this animation with the skeleton's current pose (usually the pose resulting from lower tracks). Defaults
- * to 1, which overwrites the skeleton's current pose with this animation.
- *
- * Typically track 0 is used to completely pose the skeleton, then alpha is used on higher tracks. It doesn't make sense to
- * use alpha on track 0 if the skeleton pose is from the last frame render. */
-
- /** Seconds from 0 to the {@link #getMixDuration()} when mixing from the previous animation to this animation. May be
- * slightly more than `mixDuration` when the mix is complete. */
-
- /** Seconds for mixing from the previous animation to this animation. Defaults to the value provided by AnimationStateData
- * {@link AnimationStateData#getMix()} based on the animation before this animation (if any).
- *
- * A mix duration of 0 still mixes out over one frame to provide the track entry being mixed out a chance to revert the
- * properties it was animating.
- *
- * The `mixDuration` can be set manually rather than use the value from
- * {@link AnimationStateData#getMix()}. In that case, the `mixDuration` can be set for a new
- * track entry only before {@link AnimationState#update(float)} is first called.
- *
- * When using {@link AnimationState#addAnimation()} with a `delay` <= 0, note the
- * {@link #delay} is set using the mix duration from the {@link AnimationStateData}, not a mix duration set
- * afterward. */
-
- /** Controls how properties keyed in the animation are mixed with lower tracks. Defaults to {@link MixBlend#replace}, which
- * replaces the values from the lower tracks with the animation values. {@link MixBlend#add} adds the animation values to
- * the values from the lower tracks.
- *
- * The `mixBlend` can be set for a new track entry only before {@link AnimationState#apply()} is first
- * called. */
- __init10() {this.mixBlend = MixBlend.replace;}
- __init11() {this.timelineMode = new Array();}
- __init12() {this.timelineHoldMix = new Array();}
- __init13() {this.timelinesRotation = new Array();}
- reset () {
- this.next = null;
- this.mixingFrom = null;
- this.mixingTo = null;
- this.animation = null;
- this.listener = null;
- this.timelineMode.length = 0;
- this.timelineHoldMix.length = 0;
- this.timelinesRotation.length = 0;
- }
- /** Uses {@link #trackTime} to compute the `animationTime`, which is between {@link #animationStart}
- * and {@link #animationEnd}. When the `trackTime` is 0, the `animationTime` is equal to the
- * `animationStart` time. */
- getAnimationTime () {
- if (this.loop) {
- let duration = this.animationEnd - this.animationStart;
- if (duration == 0) return this.animationStart;
- return (this.trackTime % duration) + this.animationStart;
- }
- return Math.min(this.trackTime + this.animationStart, this.animationEnd);
- }
- setAnimationLast(animationLast) {
- this.animationLast = animationLast;
- this.nextAnimationLast = animationLast;
- }
- /** Returns true if at least one loop has been completed.
- *
- * See {@link AnimationStateListener#complete()}. */
- isComplete () {
- return this.trackTime >= this.animationEnd - this.animationStart;
- }
- /** Resets the rotation directions for mixing this entry's rotate timelines. This can be useful to avoid bones rotating the
- * long way around when using {@link #alpha} and starting animations on other tracks.
- *
- * Mixing with {@link MixBlend#replace} involves finding a rotation between two others, which has two possible solutions:
- * the short way or the long way around. The two rotations likely change over time, so which direction is the short or long
- * way also changes. If the short way was always chosen, bones would flip to the other side when that direction became the
- * long way. TrackEntry chooses the short way the first time it is applied and remembers that direction. */
- resetRotationDirections () {
- this.timelinesRotation.length = 0;
- }
- //deprecated stuff
-
-
-
-
- static __initStatic12() {this.deprecatedWarning1 = false;}
- static __initStatic13() {this.deprecatedWarning2 = false;}
- get time() {
- if (!TrackEntry.deprecatedWarning1) {
- TrackEntry.deprecatedWarning1 = true;
- console.warn("Spine Deprecation Warning: TrackEntry.time is deprecated, please use trackTime from now on.");
- }
- return this.trackTime;
- }
- set time(value) {
- if (!TrackEntry.deprecatedWarning1) {
- TrackEntry.deprecatedWarning1 = true;
- console.warn("Spine Deprecation Warning: TrackEntry.time is deprecated, please use trackTime from now on.");
- }
- this.trackTime = value;
- }
- get endTime() {
- if (!TrackEntry.deprecatedWarning2) {
- TrackEntry.deprecatedWarning2 = true;
- console.warn("Spine Deprecation Warning: TrackEntry.endTime is deprecated, please use trackEnd from now on.");
- }
- return this.trackTime;
- }
- set endTime(value) {
- if (!TrackEntry.deprecatedWarning2) {
- TrackEntry.deprecatedWarning2 = true;
- console.warn("Spine Deprecation Warning: TrackEntry.endTime is deprecated, please use trackEnd from now on.");
- }
- this.trackTime = value;
- }
- loopsCount() {
- return Math.floor(this.trackTime / this.trackEnd);
- }
- } TrackEntry.__initStatic12(); TrackEntry.__initStatic13();
- /**
- * @public
- */
- class EventQueue {
- __init14() {this.objects = [];}
- __init15() {this.drainDisabled = false;}
-
- constructor(animState) {EventQueue.prototype.__init14.call(this);EventQueue.prototype.__init15.call(this);
- this.animState = animState;
- }
- start (entry) {
- this.objects.push(EventType.start);
- this.objects.push(entry);
- this.animState.animationsChanged = true;
- }
- interrupt (entry) {
- this.objects.push(EventType.interrupt);
- this.objects.push(entry);
- }
- end (entry) {
- this.objects.push(EventType.end);
- this.objects.push(entry);
- this.animState.animationsChanged = true;
- }
- dispose (entry) {
- this.objects.push(EventType.dispose);
- this.objects.push(entry);
- }
- complete (entry) {
- this.objects.push(EventType.complete);
- this.objects.push(entry);
- }
- event (entry, event) {
- this.objects.push(EventType.event);
- this.objects.push(entry);
- this.objects.push(event);
- }
- static __initStatic14() {this.deprecatedWarning1 = false;}
- deprecateStuff() {
- if (!EventQueue.deprecatedWarning1) {
- EventQueue.deprecatedWarning1 = true;
- console.warn("Spine Deprecation Warning: onComplete, onStart, onEnd, onEvent art deprecated, please use listeners from now on. 'state.addListener({ complete: function(track, event) { } })'");
- }
- return true;
- }
- drain () {
- if (this.drainDisabled) return;
- this.drainDisabled = true;
- let objects = this.objects;
- let listeners = this.animState.listeners;
- for (let i = 0; i < objects.length; i += 2) {
- let type = objects[i] ;
- let entry = objects[i + 1] ;
- switch (type) {
- case EventType.start:
- if (entry.listener != null && entry.listener.start) entry.listener.start(entry);
- for (let ii = 0; ii < listeners.length; ii++)
- if (listeners[ii].start) listeners[ii].start(entry);
- //deprecation
- entry.onStart && this.deprecateStuff() && entry.onStart(entry.trackIndex);
- this.animState.onStart && this.deprecateStuff() && this.deprecateStuff && this.animState.onStart(entry.trackIndex);
- break;
- case EventType.interrupt:
- if (entry.listener != null && entry.listener.interrupt) entry.listener.interrupt(entry);
- for (let ii = 0; ii < listeners.length; ii++)
- if (listeners[ii].interrupt) listeners[ii].interrupt(entry);
- break;
- case EventType.end:
- if (entry.listener != null && entry.listener.end) entry.listener.end(entry);
- for (let ii = 0; ii < listeners.length; ii++)
- if (listeners[ii].end) listeners[ii].end(entry);
- //deprecation
- entry.onEnd && this.deprecateStuff() && entry.onEnd(entry.trackIndex);
- this.animState.onEnd && this.deprecateStuff() && this.animState.onEnd(entry.trackIndex);
- // Fall through.
- case EventType.dispose:
- if (entry.listener != null && entry.listener.dispose) entry.listener.dispose(entry);
- for (let ii = 0; ii < listeners.length; ii++)
- if (listeners[ii].dispose) listeners[ii].dispose(entry);
- this.animState.trackEntryPool.free(entry);
- break;
- case EventType.complete:
- if (entry.listener != null && entry.listener.complete) entry.listener.complete(entry);
- for (let ii = 0; ii < listeners.length; ii++)
- if (listeners[ii].complete) listeners[ii].complete(entry);
- //deprecation
- let count = MathUtils.toInt(entry.loopsCount()) ;
- entry.onComplete && this.deprecateStuff() && entry.onComplete(entry.trackIndex, count);
- this.animState.onComplete && this.deprecateStuff() && this.animState.onComplete(entry.trackIndex, count);
- break;
- case EventType.event:
- let event = objects[i++ + 2] ;
- if (entry.listener != null && entry.listener.event) entry.listener.event(entry, event);
- for (let ii = 0; ii < listeners.length; ii++)
- if (listeners[ii].event) listeners[ii].event(entry, event);
- //deprecation
- entry.onEvent && this.deprecateStuff() && entry.onEvent(entry.trackIndex, event);
- this.animState.onEvent && this.deprecateStuff() && this.animState.onEvent(entry.trackIndex, event);
- break;
- }
- }
- this.clear();
- this.drainDisabled = false;
- }
- clear () {
- this.objects.length = 0;
- }
- } EventQueue.__initStatic14();
- /**
- * @public
- */
- var EventType; (function (EventType) {
- const start = 0; EventType[EventType["start"] = start] = "start"; const interrupt = start + 1; EventType[EventType["interrupt"] = interrupt] = "interrupt"; const end = interrupt + 1; EventType[EventType["end"] = end] = "end"; const dispose = end + 1; EventType[EventType["dispose"] = dispose] = "dispose"; const complete = dispose + 1; EventType[EventType["complete"] = complete] = "complete"; const event = complete + 1; EventType[EventType["event"] = event] = "event";
- })(EventType || (EventType = {}));
- /**
- * @public
- */
- /**
- * @public
- */
- class AnimationStateAdapter {
- start (entry) {
- }
- interrupt (entry) {
- }
- end (entry) {
- }
- dispose (entry) {
- }
- complete (entry) {
- }
- event (entry, event) {
- }
- }
- /**
- * @public
- */
- class AnimationStateData {
-
- __init() {this.animationToMixTime = {};}
- __init2() {this.defaultMix = 0;}
- constructor(skeletonData) {AnimationStateData.prototype.__init.call(this);AnimationStateData.prototype.__init2.call(this);
- if (skeletonData == null) throw new Error("skeletonData cannot be null.");
- this.skeletonData = skeletonData;
- }
- setMix(fromName, toName, duration) {
- let from = this.skeletonData.findAnimation(fromName);
- if (from == null) throw new Error("Animation not found: " + fromName);
- let to = this.skeletonData.findAnimation(toName);
- if (to == null) throw new Error("Animation not found: " + toName);
- this.setMixWith(from, to, duration);
- }
- static __initStatic() {this.deprecatedWarning1 = false;}
- setMixByName(fromName, toName, duration) {
- if (!AnimationStateData.deprecatedWarning1) {
- AnimationStateData.deprecatedWarning1 = true;
- console.warn("Deprecation Warning: AnimationStateData.setMixByName is deprecated, please use setMix from now on.");
- }
- this.setMix(fromName, toName, duration);
- }
- setMixWith(from, to, duration) {
- if (from == null) throw new Error("from cannot be null.");
- if (to == null) throw new Error("to cannot be null.");
- let key = from.name + "." + to.name;
- this.animationToMixTime[key] = duration;
- }
- getMix(from, to) {
- let key = from.name + "." + to.name;
- let value = this.animationToMixTime[key];
- return value === undefined ? this.defaultMix : value;
- }
- } AnimationStateData.__initStatic();
- /**
- * @public
- */
- class AtlasAttachmentLoader {
-
- constructor(atlas) {
- this.atlas = atlas;
- }
- /** @return May be null to not load an attachment. */
- newRegionAttachment(skin, name, path) {
- let region = this.atlas.findRegion(path);
- if (region == null) throw new Error("Region not found in atlas: " + path + " (region attachment: " + name + ")");
- let attachment = new RegionAttachment(name);
- attachment.region = region;
- return attachment;
- }
- /** @return May be null to not load an attachment. */
- newMeshAttachment(skin, name, path) {
- let region = this.atlas.findRegion(path);
- if (region == null) throw new Error("Region not found in atlas: " + path + " (mesh attachment: " + name + ")");
- let attachment = new MeshAttachment(name);
- attachment.region = region;
- return attachment;
- }
- /** @return May be null to not load an attachment. */
- newBoundingBoxAttachment(skin, name) {
- return new BoundingBoxAttachment(name);
- }
- /** @return May be null to not load an attachment */
- newPathAttachment(skin, name) {
- return new PathAttachment(name);
- }
- newPointAttachment(skin, name) {
- return new PointAttachment(name);
- }
- newClippingAttachment(skin, name) {
- return new ClippingAttachment(name);
- }
- }
- /**
- * @public
- */
- class BoneData {
-
-
-
-
- __init() {this.x = 0;}
- __init2() {this.y = 0;}
- __init3() {this.rotation = 0;}
- __init4() {this.scaleX = 1;}
- __init5() {this.scaleY = 1;}
- __init6() {this.shearX = 0;}
- __init7() {this.shearY = 0;}
- __init8() {this.transformMode = TransformMode.Normal;}
- __init9() {this.skinRequired = false;}
- __init10() {this.color = new Color();}
- constructor(index, name, parent) {BoneData.prototype.__init.call(this);BoneData.prototype.__init2.call(this);BoneData.prototype.__init3.call(this);BoneData.prototype.__init4.call(this);BoneData.prototype.__init5.call(this);BoneData.prototype.__init6.call(this);BoneData.prototype.__init7.call(this);BoneData.prototype.__init8.call(this);BoneData.prototype.__init9.call(this);BoneData.prototype.__init10.call(this);
- if (index < 0) throw new Error("index must be >= 0.");
- if (name == null) throw new Error("name cannot be null.");
- this.index = index;
- this.name = name;
- this.parent = parent;
- }
- }
- /**
- * @public
- */
- var TransformMode; (function (TransformMode) {
- const Normal = 0; TransformMode[TransformMode["Normal"] = Normal] = "Normal"; const OnlyTranslation = Normal + 1; TransformMode[TransformMode["OnlyTranslation"] = OnlyTranslation] = "OnlyTranslation"; const NoRotationOrReflection = OnlyTranslation + 1; TransformMode[TransformMode["NoRotationOrReflection"] = NoRotationOrReflection] = "NoRotationOrReflection"; const NoScale = NoRotationOrReflection + 1; TransformMode[TransformMode["NoScale"] = NoScale] = "NoScale"; const NoScaleOrReflection = NoScale + 1; TransformMode[TransformMode["NoScaleOrReflection"] = NoScaleOrReflection] = "NoScaleOrReflection";
- })(TransformMode || (TransformMode = {}));
- /**
- * @public
- */
- class Bone {
- //be careful! Spine b,c is c,b in pixi matrix
- __init() {this.matrix = new math.Matrix();}
- get worldX() {
- return this.matrix.tx;
- }
- get worldY() {
- return this.matrix.ty;
- }
-
-
-
- __init2() {this.children = new Array();}
- __init3() {this.x = 0;}
- __init4() {this.y = 0;}
- __init5() {this.rotation = 0;}
- __init6() {this.scaleX = 0;}
- __init7() {this.scaleY = 0;}
- __init8() {this.shearX = 0;}
- __init9() {this.shearY = 0;}
- __init10() {this.ax = 0;}
- __init11() {this.ay = 0;}
- __init12() {this.arotation = 0;}
- __init13() {this.ascaleX = 0;}
- __init14() {this.ascaleY = 0;}
- __init15() {this.ashearX = 0;}
- __init16() {this.ashearY = 0;}
- __init17() {this.appliedValid = false;}
- __init18() {this.sorted = false;}
- __init19() {this.active = false;}
- /** @param parent May be null. */
- constructor(data, skeleton, parent) {Bone.prototype.__init.call(this);Bone.prototype.__init2.call(this);Bone.prototype.__init3.call(this);Bone.prototype.__init4.call(this);Bone.prototype.__init5.call(this);Bone.prototype.__init6.call(this);Bone.prototype.__init7.call(this);Bone.prototype.__init8.call(this);Bone.prototype.__init9.call(this);Bone.prototype.__init10.call(this);Bone.prototype.__init11.call(this);Bone.prototype.__init12.call(this);Bone.prototype.__init13.call(this);Bone.prototype.__init14.call(this);Bone.prototype.__init15.call(this);Bone.prototype.__init16.call(this);Bone.prototype.__init17.call(this);Bone.prototype.__init18.call(this);Bone.prototype.__init19.call(this);
- if (data == null) throw new Error("data cannot be null.");
- if (skeleton == null) throw new Error("skeleton cannot be null.");
- this.data = data;
- this.skeleton = skeleton;
- this.parent = parent;
- this.setToSetupPose();
- }
- isActive () {
- return this.active;
- }
- /** Same as {@link #updateWorldTransform()}. This method exists for Bone to implement {@link Updatable}. */
- update() {
- this.updateWorldTransformWith(this.x, this.y, this.rotation, this.scaleX, this.scaleY, this.shearX, this.shearY);
- }
- /** Computes the world transform using the parent bone and this bone's local transform. */
- updateWorldTransform() {
- this.updateWorldTransformWith(this.x, this.y, this.rotation, this.scaleX, this.scaleY, this.shearX, this.shearY);
- }
- /** Computes the world transform using the parent bone and the specified local transform. */
- updateWorldTransformWith(x, y, rotation, scaleX, scaleY, shearX, shearY) {
- this.ax = x;
- this.ay = y;
- this.arotation = rotation;
- this.ascaleX = scaleX;
- this.ascaleY = scaleY;
- this.ashearX = shearX;
- this.ashearY = shearY;
- this.appliedValid = true;
- let parent = this.parent;
- let m = this.matrix;
- let sx = this.skeleton.scaleX;
- let sy = settings.yDown? -this.skeleton.scaleY : this.skeleton.scaleY;
- if (parent == null) { // Root bone.
- let skeleton = this.skeleton;
- let rotationY = rotation + 90 + shearY;
- m.a = MathUtils.cosDeg(rotation + shearX) * scaleX * sx;
- m.c = MathUtils.cosDeg(rotationY) * scaleY * sx;
- m.b = MathUtils.sinDeg(rotation + shearX) * scaleX * sy;
- m.d = MathUtils.sinDeg(rotationY) * scaleY * sy;
- m.tx = x * sx + skeleton.x;
- m.ty = y * sy + skeleton.y;
- return;
- }
- let pa = parent.matrix.a, pb = parent.matrix.c, pc = parent.matrix.b, pd = parent.matrix.d;
- m.tx = pa * x + pb * y + parent.matrix.tx;
- m.ty = pc * x + pd * y + parent.matrix.ty;
- switch (this.data.transformMode) {
- case TransformMode.Normal: {
- let rotationY = rotation + 90 + shearY;
- let la = MathUtils.cosDeg(rotation + shearX) * scaleX;
- let lb = MathUtils.cosDeg(rotationY) * scaleY;
- let lc = MathUtils.sinDeg(rotation + shearX) * scaleX;
- let ld = MathUtils.sinDeg(rotationY) * scaleY;
- m.a = pa * la + pb * lc;
- m.c = pa * lb + pb * ld;
- m.b = pc * la + pd * lc;
- m.d = pc * lb + pd * ld;
- return;
- }
- case TransformMode.OnlyTranslation: {
- let rotationY = rotation + 90 + shearY;
- m.a = MathUtils.cosDeg(rotation + shearX) * scaleX;
- m.c = MathUtils.cosDeg(rotationY) * scaleY;
- m.b = MathUtils.sinDeg(rotation + shearX) * scaleX;
- m.d = MathUtils.sinDeg(rotationY) * scaleY;
- break;
- }
- case TransformMode.NoRotationOrReflection: {
- let s = pa * pa + pc * pc;
- let prx = 0;
- if (s > 0.0001) {
- s = Math.abs(pa * pd - pb * pc) / s;
- pa /= this.skeleton.scaleX;
- pc /= this.skeleton.scaleY;
- pb = pc * s;
- pd = pa * s;
- prx = Math.atan2(pc, pa) * MathUtils.radDeg;
- } else {
- pa = 0;
- pc = 0;
- prx = 90 - Math.atan2(pd, pb) * MathUtils.radDeg;
- }
- let rx = rotation + shearX - prx;
- let ry = rotation + shearY - prx + 90;
- let la = MathUtils.cosDeg(rx) * scaleX;
- let lb = MathUtils.cosDeg(ry) * scaleY;
- let lc = MathUtils.sinDeg(rx) * scaleX;
- let ld = MathUtils.sinDeg(ry) * scaleY;
- m.a = pa * la - pb * lc;
- m.c = pa * lb - pb * ld;
- m.b = pc * la + pd * lc;
- m.d = pc * lb + pd * ld;
- break;
- }
- case TransformMode.NoScale:
- case TransformMode.NoScaleOrReflection: {
- let cos = MathUtils.cosDeg(rotation);
- let sin = MathUtils.sinDeg(rotation);
- let za = (pa * cos + pb * sin) / sx;
- let zc = (pc * cos + pd * sin) / sy;
- let s = Math.sqrt(za * za + zc * zc);
- if (s > 0.00001) s = 1 / s;
- za *= s;
- zc *= s;
- s = Math.sqrt(za * za + zc * zc);
- if (
- this.data.transformMode == TransformMode.NoScale
- && (pa * pd - pb * pc < 0) != (settings.yDown?
- (this.skeleton.scaleX < 0 != this.skeleton.scaleY > 0) :
- (this.skeleton.scaleX < 0 != this.skeleton.scaleY < 0))
- ) s = -s;
- let r = Math.PI / 2 + Math.atan2(zc, za);
- let zb = Math.cos(r) * s;
- let zd = Math.sin(r) * s;
- let la = MathUtils.cosDeg(shearX) * scaleX;
- let lb = MathUtils.cosDeg(90 + shearY) * scaleY;
- let lc = MathUtils.sinDeg(shearX) * scaleX;
- let ld = MathUtils.sinDeg(90 + shearY) * scaleY;
- m.a = za * la + zb * lc;
- m.c = za * lb + zb * ld;
- m.b = zc * la + zd * lc;
- m.d = zc * lb + zd * ld;
- break;
- }
- }
- m.a *= sx;
- m.c *= sx;
- m.b *= sy;
- m.d *= sy;
- }
- setToSetupPose() {
- let data = this.data;
- this.x = data.x;
- this.y = data.y;
- this.rotation = data.rotation;
- this.scaleX = data.scaleX;
- this.scaleY = data.scaleY;
- this.shearX = data.shearX;
- this.shearY = data.shearY;
- }
- getWorldRotationX() {
- return Math.atan2(this.matrix.b, this.matrix.a) * MathUtils.radDeg;
- }
- getWorldRotationY() {
- return Math.atan2(this.matrix.d, this.matrix.c) * MathUtils.radDeg;
- }
- getWorldScaleX() {
- let m = this.matrix;
- return Math.sqrt(m.a * m.a + m.c * m.c);
- }
- getWorldScaleY() {
- let m = this.matrix;
- return Math.sqrt(m.b * m.b + m.d * m.d);
- }
- /** Computes the individual applied transform values from the world transform. This can be useful to perform processing using
- * the applied transform after the world transform has been modified directly (eg, by a constraint).
- * <p>
- * Some information is ambiguous in the world transform, such as -1,-1 scale versus 180 rotation. */
- updateAppliedTransform() {
- this.appliedValid = true;
- let parent = this.parent;
- let m = this.matrix;
- if (parent == null) {
- this.ax = m.tx;
- this.ay = m.ty;
- this.arotation = Math.atan2(m.b, m.a) * MathUtils.radDeg;
- this.ascaleX = Math.sqrt(m.a * m.a + m.b * m.b);
- this.ascaleY = Math.sqrt(m.c * m.c + m.d * m.d);
- this.ashearX = 0;
- this.ashearY = Math.atan2(m.a * m.c + m.b * m.d, m.a * m.d - m.b * m.c) * MathUtils.radDeg;
- return;
- }
- let pm = parent.matrix;
- let pid = 1 / (pm.a * pm.d - pm.b * pm.c);
- let dx = m.tx - pm.tx, dy = m.ty - pm.ty;
- this.ax = (dx * pm.d * pid - dy * pm.c * pid);
- this.ay = (dy * pm.a * pid - dx * pm.b * pid);
- let ia = pid * pm.d;
- let id = pid * pm.a;
- let ib = pid * pm.c;
- let ic = pid * pm.b;
- let ra = ia * m.a - ib * m.b;
- let rb = ia * m.c - ib * m.d;
- let rc = id * m.b - ic * m.a;
- let rd = id * m.d - ic * m.c;
- this.ashearX = 0;
- this.ascaleX = Math.sqrt(ra * ra + rc * rc);
- if (this.ascaleX > 0.0001) {
- let det = ra * rd - rb * rc;
- this.ascaleY = det / this.ascaleX;
- this.ashearY = Math.atan2(ra * rb + rc * rd, det) * MathUtils.radDeg;
- this.arotation = Math.atan2(rc, ra) * MathUtils.radDeg;
- } else {
- this.ascaleX = 0;
- this.ascaleY = Math.sqrt(rb * rb + rd * rd);
- this.ashearY = 0;
- this.arotation = 90 - Math.atan2(rd, rb) * MathUtils.radDeg;
- }
- }
- worldToLocal(world) {
- let m = this.matrix;
- let a = m.a, b = m.c, c = m.b, d = m.d;
- let invDet = 1 / (a * d - b * c);
- let x = world.x - m.tx, y = world.y - m.ty;
- world.x = (x * d * invDet - y * b * invDet);
- world.y = (y * a * invDet - x * c * invDet);
- return world;
- }
- localToWorld(local) {
- let m = this.matrix;
- let x = local.x, y = local.y;
- local.x = x * m.a + y * m.c + m.tx;
- local.y = x * m.b + y * m.d + m.ty;
- return local;
- }
- worldToLocalRotation (worldRotation) {
- let sin = MathUtils.sinDeg(worldRotation), cos = MathUtils.cosDeg(worldRotation);
- let mat = this.matrix;
- return Math.atan2(mat.a * sin - mat.b * cos, mat.d * cos - mat.c * sin) * MathUtils.radDeg;
- }
- localToWorldRotation (localRotation) {
- let sin = MathUtils.sinDeg(localRotation), cos = MathUtils.cosDeg(localRotation);
- let mat = this.matrix;
- return Math.atan2(cos * mat.b + sin * mat.d, cos * mat.a + sin * mat.c) * MathUtils.radDeg;
- }
- rotateWorld (degrees) {
- let mat = this.matrix;
- let a = mat.a, b = mat.c, c = mat.b, d = mat.d;
- let cos = MathUtils.cosDeg(degrees), sin = MathUtils.sinDeg(degrees);
- mat.a = cos * a - sin * c;
- mat.c = cos * b - sin * d;
- mat.b = sin * a + cos * c;
- mat.d = sin * b + cos * d;
- this.appliedValid = false;
- }
- }
- /**
- * @public
- */
- class ConstraintData {
- constructor( name, order, skinRequired) {this.name = name;this.order = order;this.skinRequired = skinRequired; }
- }
- /**
- * @public
- */
- class Event {
-
-
-
-
-
-
-
- constructor(time, data) {
- if (data == null) throw new Error("data cannot be null.");
- this.time = time;
- this.data = data;
- }
- }
- /**
- * @public
- */
- class EventData {
-
-
-
-
-
-
-
- constructor (name) {
- this.name = name;
- }
- }
- /**
- * @public
- */
- class IkConstraint {
-
-
-
- __init() {this.bendDirection = 0;}
- __init2() {this.compress = false;}
- __init3() {this.stretch = false;}
- __init4() {this.mix = 1;}
- __init5() {this.softness = 0;}
- __init6() {this.active = false;}
- constructor (data, skeleton) {IkConstraint.prototype.__init.call(this);IkConstraint.prototype.__init2.call(this);IkConstraint.prototype.__init3.call(this);IkConstraint.prototype.__init4.call(this);IkConstraint.prototype.__init5.call(this);IkConstraint.prototype.__init6.call(this);
- if (data == null) throw new Error("data cannot be null.");
- if (skeleton == null) throw new Error("skeleton cannot be null.");
- this.data = data;
- this.mix = data.mix;
- this.softness = data.softness;
- this.bendDirection = data.bendDirection;
- this.compress = data.compress;
- this.stretch = data.stretch;
- this.bones = new Array();
- for (let i = 0; i < data.bones.length; i++)
- this.bones.push(skeleton.findBone(data.bones[i].name));
- this.target = skeleton.findBone(data.target.name);
- }
- isActive () {
- return this.active;
- }
- apply () {
- this.update();
- }
- update () {
- let target = this.target;
- let bones = this.bones;
- switch (bones.length) {
- case 1:
- this.apply1(bones[0], target.worldX, target.worldY, this.compress, this.stretch, this.data.uniform, this.mix);
- break;
- case 2:
- this.apply2(bones[0], bones[1], target.worldX, target.worldY, this.bendDirection, this.stretch, this.softness, this.mix);
- break;
- }
- }
- /** Adjusts the bone rotation so the tip is as close to the target position as possible. The target is specified in the world
- * coordinate system. */
- apply1 (bone, targetX, targetY, compress, stretch, uniform, alpha) {
- if (!bone.appliedValid) bone.updateAppliedTransform();
- let p = bone.parent.matrix;
- let pa = p.a, pb = p.c, pc = p.b, pd = p.d;
- let rotationIK = -bone.ashearX - bone.arotation, tx = 0, ty = 0;
- switch(bone.data.transformMode) {
- case TransformMode.OnlyTranslation:
- tx = targetX - bone.worldX;
- ty = targetY - bone.worldY;
- break;
- case TransformMode.NoRotationOrReflection:
- let s = Math.abs(pa * pd - pb * pc) / (pa * pa + pc * pc);
- let sa = pa / bone.skeleton.scaleX;
- let sc = pc / bone.skeleton.scaleY;
- pb = -sc * s * bone.skeleton.scaleX;
- pd = sa * s * bone.skeleton.scaleY;
- rotationIK += Math.atan2(sc, sa) * MathUtils.radDeg;
- // Fall through
- default:
- let x = targetX - p.tx, y = targetY - p.ty;
- let d = pa * pd - pb * pc;
- tx = (x * pd - y * pb) / d - bone.ax;
- ty = (y * pa - x * pc) / d - bone.ay;
- }
- rotationIK += Math.atan2(ty, tx) * MathUtils.radDeg;
- if (bone.ascaleX < 0) rotationIK += 180;
- if (rotationIK > 180)
- rotationIK -= 360;
- else if (rotationIK < -180) rotationIK += 360;
- let sx = bone.ascaleX, sy = bone.ascaleY;
- if (compress || stretch) {
- switch (bone.data.transformMode) {
- case TransformMode.NoScale:
- case TransformMode.NoScaleOrReflection:
- tx = targetX - bone.worldX;
- ty = targetY - bone.worldY;
- }
- let b = bone.data.length * sx, dd = Math.sqrt(tx * tx + ty * ty);
- if ((compress && dd < b) || (stretch && dd > b) && b > 0.0001) {
- let s = (dd / b - 1) * alpha + 1;
- sx *= s;
- if (uniform) sy *= s;
- }
- }
- bone.updateWorldTransformWith(bone.ax, bone.ay, bone.arotation + rotationIK * alpha, sx, sy, bone.ashearX,
- bone.ashearY);
- }
- /** Adjusts the parent and child bone rotations so the tip of the child is as close to the target position as possible. The
- * target is specified in the world coordinate system.
- * @param child A direct descendant of the parent bone. */
- apply2 (parent, child, targetX, targetY, bendDir, stretch, softness, alpha) {
- if (alpha == 0) {
- child.updateWorldTransform();
- return;
- }
- if (!parent.appliedValid) parent.updateAppliedTransform();
- if (!child.appliedValid) child.updateAppliedTransform();
- let px = parent.ax, py = parent.ay, psx = parent.ascaleX, sx = psx, psy = parent.ascaleY, csx = child.ascaleX;
- let pmat = parent.matrix;
- let os1 = 0, os2 = 0, s2 = 0;
- if (psx < 0) {
- psx = -psx;
- os1 = 180;
- s2 = -1;
- } else {
- os1 = 0;
- s2 = 1;
- }
- if (psy < 0) {
- psy = -psy;
- s2 = -s2;
- }
- if (csx < 0) {
- csx = -csx;
- os2 = 180;
- } else
- os2 = 0;
- let cx = child.ax, cy = 0, cwx = 0, cwy = 0, a = pmat.a, b = pmat.c, c = pmat.b, d = pmat.d;
- let u = Math.abs(psx - psy) <= 0.0001;
- if (!u) {
- cy = 0;
- cwx = a * cx + pmat.tx;
- cwy = c * cx + pmat.ty;
- } else {
- cy = child.ay;
- cwx = a * cx + b * cy + pmat.tx;
- cwy = c * cx + d * cy + pmat.ty;
- }
- let pp = parent.parent.matrix;
- a = pp.a;
- b = pp.c;
- c = pp.b;
- d = pp.d;
- let id = 1 / (a * d - b * c), x = cwx - pp.tx, y = cwy - pp.ty;
- let dx = (x * d - y * b) * id - px, dy = (y * a - x * c) * id - py;
- let l1 = Math.sqrt(dx * dx + dy * dy), l2 = child.data.length * csx, a1, a2;
- if (l1 < 0.0001) {
- this.apply1(parent, targetX, targetY, false, stretch, false, alpha);
- child.updateWorldTransformWith(cx, cy, 0, child.ascaleX, child.ascaleY, child.ashearX, child.ashearY);
- return;
- }
- x = targetX - pp.tx;
- y = targetY - pp.ty;
- let tx = (x * d - y * b) * id - px, ty = (y * a - x * c) * id - py;
- let dd = tx * tx + ty * ty;
- if (softness != 0) {
- softness *= psx * (csx + 1) / 2;
- let td = Math.sqrt(dd), sd = td - l1 - l2 * psx + softness;
- if (sd > 0) {
- let p = Math.min(1, sd / (softness * 2)) - 1;
- p = (sd - softness * (1 - p * p)) / td;
- tx -= p * tx;
- ty -= p * ty;
- dd = tx * tx + ty * ty;
- }
- }
- outer:
- if (u) {
- l2 *= psx;
- let cos = (dd - l1 * l1 - l2 * l2) / (2 * l1 * l2);
- if (cos < -1)
- cos = -1;
- else if (cos > 1) {
- cos = 1;
- if (stretch) sx *= (Math.sqrt(dd) / (l1 + l2) - 1) * alpha + 1;
- }
- a2 = Math.acos(cos) * bendDir;
- a = l1 + l2 * cos;
- b = l2 * Math.sin(a2);
- a1 = Math.atan2(ty * a - tx * b, tx * a + ty * b);
- } else {
- a = psx * l2;
- b = psy * l2;
- let aa = a * a, bb = b * b, ta = Math.atan2(ty, tx);
- c = bb * l1 * l1 + aa * dd - aa * bb;
- let c1 = -2 * bb * l1, c2 = bb - aa;
- d = c1 * c1 - 4 * c2 * c;
- if (d >= 0) {
- let q = Math.sqrt(d);
- if (c1 < 0) q = -q;
- q = -(c1 + q) / 2;
- let r0 = q / c2, r1 = c / q;
- let r = Math.abs(r0) < Math.abs(r1) ? r0 : r1;
- if (r * r <= dd) {
- y = Math.sqrt(dd - r * r) * bendDir;
- a1 = ta - Math.atan2(y, r);
- a2 = Math.atan2(y / psy, (r - l1) / psx);
- break outer;
- }
- }
- let minAngle = MathUtils.PI, minX = l1 - a, minDist = minX * minX, minY = 0;
- let maxAngle = 0, maxX = l1 + a, maxDist = maxX * maxX, maxY = 0;
- c = -a * l1 / (aa - bb);
- if (c >= -1 && c <= 1) {
- c = Math.acos(c);
- x = a * Math.cos(c) + l1;
- y = b * Math.sin(c);
- d = x * x + y * y;
- if (d < minDist) {
- minAngle = c;
- minDist = d;
- minX = x;
- minY = y;
- }
- if (d > maxDist) {
- maxAngle = c;
- maxDist = d;
- maxX = x;
- maxY = y;
- }
- }
- if (dd <= (minDist + maxDist) / 2) {
- a1 = ta - Math.atan2(minY * bendDir, minX);
- a2 = minAngle * bendDir;
- } else {
- a1 = ta - Math.atan2(maxY * bendDir, maxX);
- a2 = maxAngle * bendDir;
- }
- }
- let os = Math.atan2(cy, cx) * s2;
- let rotation = parent.arotation;
- a1 = (a1 - os) * MathUtils.radDeg + os1 - rotation;
- if (a1 > 180)
- a1 -= 360;
- else if (a1 < -180) a1 += 360;
- parent.updateWorldTransformWith(px, py, rotation + a1 * alpha, sx, parent.ascaleY, 0, 0);
- rotation = child.arotation;
- a2 = ((a2 + os) * MathUtils.radDeg - child.ashearX) * s2 + os2 - rotation;
- if (a2 > 180)
- a2 -= 360;
- else if (a2 < -180) a2 += 360;
- child.updateWorldTransformWith(cx, cy, rotation + a2 * alpha, child.ascaleX, child.ascaleY, child.ashearX, child.ashearY);
- }
- }
- /**
- * @public
- */
- class IkConstraintData extends ConstraintData {
- __init() {this.bones = new Array();}
-
- __init2() {this.bendDirection = 1;}
- __init3() {this.compress = false;}
- __init4() {this.stretch = false;}
- __init5() {this.uniform = false;}
- __init6() {this.mix = 1;}
- __init7() {this.softness = 0;}
- constructor (name) {
- super(name, 0, false);IkConstraintData.prototype.__init.call(this);IkConstraintData.prototype.__init2.call(this);IkConstraintData.prototype.__init3.call(this);IkConstraintData.prototype.__init4.call(this);IkConstraintData.prototype.__init5.call(this);IkConstraintData.prototype.__init6.call(this);IkConstraintData.prototype.__init7.call(this); }
- }
- /**
- * @public
- */
- class PathConstraintData extends ConstraintData {
- __init() {this.bones = new Array();}
-
-
-
-
-
-
- constructor (name) {
- super(name, 0, false);PathConstraintData.prototype.__init.call(this); }
- }
- /**
- * @public
- */
- var PositionMode; (function (PositionMode) {
- const Fixed = 0; PositionMode[PositionMode["Fixed"] = Fixed] = "Fixed"; const Percent = Fixed + 1; PositionMode[PositionMode["Percent"] = Percent] = "Percent";
- })(PositionMode || (PositionMode = {}));
- /**
- * @public
- */
- var SpacingMode; (function (SpacingMode) {
- const Length = 0; SpacingMode[SpacingMode["Length"] = Length] = "Length"; const Fixed = Length + 1; SpacingMode[SpacingMode["Fixed"] = Fixed] = "Fixed"; const Percent = Fixed + 1; SpacingMode[SpacingMode["Percent"] = Percent] = "Percent";
- })(SpacingMode || (SpacingMode = {}));
- /**
- * @public
- */
- var RotateMode; (function (RotateMode) {
- const Tangent = 0; RotateMode[RotateMode["Tangent"] = Tangent] = "Tangent"; const Chain = Tangent + 1; RotateMode[RotateMode["Chain"] = Chain] = "Chain"; const ChainScale = Chain + 1; RotateMode[RotateMode["ChainScale"] = ChainScale] = "ChainScale";
- })(RotateMode || (RotateMode = {}));
- /**
- * @public
- */
- class PathConstraint {
- static __initStatic() {this.NONE = -1;} static __initStatic2() {this.BEFORE = -2;} static __initStatic3() {this.AFTER = -3;}
- static __initStatic4() {this.epsilon = 0.00001;}
-
-
-
- __init() {this.position = 0;} __init2() {this.spacing = 0;} __init3() {this.rotateMix = 0;} __init4() {this.translateMix = 0;}
- __init5() {this.spaces = new Array();} __init6() {this.positions = new Array();}
- __init7() {this.world = new Array();} __init8() {this.curves = new Array();} __init9() {this.lengths = new Array();}
- __init10() {this.segments = new Array();}
- __init11() {this.active = false;}
- constructor (data, skeleton) {PathConstraint.prototype.__init.call(this);PathConstraint.prototype.__init2.call(this);PathConstraint.prototype.__init3.call(this);PathConstraint.prototype.__init4.call(this);PathConstraint.prototype.__init5.call(this);PathConstraint.prototype.__init6.call(this);PathConstraint.prototype.__init7.call(this);PathConstraint.prototype.__init8.call(this);PathConstraint.prototype.__init9.call(this);PathConstraint.prototype.__init10.call(this);PathConstraint.prototype.__init11.call(this);
- if (data == null) throw new Error("data cannot be null.");
- if (skeleton == null) throw new Error("skeleton cannot be null.");
- this.data = data;
- this.bones = new Array();
- for (let i = 0, n = data.bones.length; i < n; i++)
- this.bones.push(skeleton.findBone(data.bones[i].name));
- this.target = skeleton.findSlot(data.target.name);
- this.position = data.position;
- this.spacing = data.spacing;
- this.rotateMix = data.rotateMix;
- this.translateMix = data.translateMix;
- }
- isActive () {
- return this.active;
- }
- apply () {
- this.update();
- }
- update () {
- let attachment = this.target.getAttachment();
- if (!(attachment instanceof PathAttachment)) return;
- let rotateMix = this.rotateMix, translateMix = this.translateMix;
- let translate = translateMix > 0, rotate = rotateMix > 0;
- if (!translate && !rotate) return;
- let data = this.data;
- let spacingMode = data.spacingMode;
- let lengthSpacing = spacingMode == SpacingMode.Length;
- let rotateMode = data.rotateMode;
- let tangents = rotateMode == RotateMode.Tangent, scale = rotateMode == RotateMode.ChainScale;
- let boneCount = this.bones.length, spacesCount = tangents ? boneCount : boneCount + 1;
- let bones = this.bones;
- let spaces = Utils.setArraySize(this.spaces, spacesCount), lengths = null;
- let spacing = this.spacing;
- if (scale || lengthSpacing) {
- if (scale) lengths = Utils.setArraySize(this.lengths, boneCount);
- for (let i = 0, n = spacesCount - 1; i < n;) {
- let bone = bones[i];
- let setupLength = bone.data.length;
- if (setupLength < PathConstraint.epsilon) {
- if (scale) lengths[i] = 0;
- spaces[++i] = 0;
- } else {
- let x = setupLength * bone.matrix.a, y = setupLength * bone.matrix.b;
- let length = Math.sqrt(x * x + y * y);
- if (scale) lengths[i] = length;
- spaces[++i] = (lengthSpacing ? setupLength + spacing : spacing) * length / setupLength;
- }
- }
- } else {
- for (let i = 1; i < spacesCount; i++)
- spaces[i] = spacing;
- }
- let positions = this.computeWorldPositions(attachment, spacesCount, tangents,
- data.positionMode == PositionMode.Percent, spacingMode == SpacingMode.Percent);
- let boneX = positions[0], boneY = positions[1], offsetRotation = data.offsetRotation;
- let tip = false;
- if (offsetRotation == 0)
- tip = rotateMode == RotateMode.Chain;
- else {
- tip = false;
- let p = this.target.bone.matrix;
- offsetRotation *= p.a * p.d - p.b * p.c > 0 ? MathUtils.degRad : -MathUtils.degRad;
- }
- for (let i = 0, p = 3; i < boneCount; i++, p += 3) {
- let bone = bones[i];
- let mat = bone.matrix;
- mat.tx += (boneX - mat.tx) * translateMix;
- mat.ty += (boneY - mat.ty) * translateMix;
- let x = positions[p], y = positions[p + 1], dx = x - boneX, dy = y - boneY;
- if (scale) {
- let length = lengths[i];
- if (length != 0) {
- let s = (Math.sqrt(dx * dx + dy * dy) / length - 1) * rotateMix + 1;
- mat.a *= s;
- mat.b *= s;
- }
- }
- boneX = x;
- boneY = y;
- if (rotate) {
- let a = mat.a, b = mat.c, c = mat.b, d = mat.d, r = 0, cos = 0, sin = 0;
- if (tangents)
- r = positions[p - 1];
- else if (spaces[i + 1] == 0)
- r = positions[p + 2];
- else
- r = Math.atan2(dy, dx);
- r -= Math.atan2(c, a);
- if (tip) {
- cos = Math.cos(r);
- sin = Math.sin(r);
- let length = bone.data.length;
- boneX += (length * (cos * a - sin * c) - dx) * rotateMix;
- boneY += (length * (sin * a + cos * c) - dy) * rotateMix;
- } else {
- r += offsetRotation;
- }
- if (r > MathUtils.PI)
- r -= MathUtils.PI2;
- else if (r < -MathUtils.PI) //
- r += MathUtils.PI2;
- r *= rotateMix;
- cos = Math.cos(r);
- sin = Math.sin(r);
- mat.a = cos * a - sin * c;
- mat.c = cos * b - sin * d;
- mat.b = sin * a + cos * c;
- mat.d = sin * b + cos * d;
- }
- bone.appliedValid = false;
- }
- }
- computeWorldPositions (path, spacesCount, tangents, percentPosition,
- percentSpacing) {
- let target = this.target;
- let position = this.position;
- let spaces = this.spaces, out = Utils.setArraySize(this.positions, spacesCount * 3 + 2), world = null;
- let closed = path.closed;
- let verticesLength = path.worldVerticesLength, curveCount = verticesLength / 6, prevCurve = PathConstraint.NONE;
- if (!path.constantSpeed) {
- let lengths = path.lengths;
- curveCount -= closed ? 1 : 2;
- let pathLength = lengths[curveCount];
- if (percentPosition) position *= pathLength;
- if (percentSpacing) {
- for (let i = 0; i < spacesCount; i++)
- spaces[i] *= pathLength;
- }
- world = Utils.setArraySize(this.world, 8);
- for (let i = 0, o = 0, curve = 0; i < spacesCount; i++, o += 3) {
- let space = spaces[i];
- position += space;
- let p = position;
- if (closed) {
- p %= pathLength;
- if (p < 0) p += pathLength;
- curve = 0;
- } else if (p < 0) {
- if (prevCurve != PathConstraint.BEFORE) {
- prevCurve = PathConstraint.BEFORE;
- path.computeWorldVertices(target, 2, 4, world, 0, 2);
- }
- this.addBeforePosition(p, world, 0, out, o);
- continue;
- } else if (p > pathLength) {
- if (prevCurve != PathConstraint.AFTER) {
- prevCurve = PathConstraint.AFTER;
- path.computeWorldVertices(target, verticesLength - 6, 4, world, 0, 2);
- }
- this.addAfterPosition(p - pathLength, world, 0, out, o);
- continue;
- }
- // Determine curve containing position.
- for (;; curve++) {
- let length = lengths[curve];
- if (p > length) continue;
- if (curve == 0)
- p /= length;
- else {
- let prev = lengths[curve - 1];
- p = (p - prev) / (length - prev);
- }
- break;
- }
- if (curve != prevCurve) {
- prevCurve = curve;
- if (closed && curve == curveCount) {
- path.computeWorldVertices(target, verticesLength - 4, 4, world, 0, 2);
- path.computeWorldVertices(target, 0, 4, world, 4, 2);
- } else
- path.computeWorldVertices(target, curve * 6 + 2, 8, world, 0, 2);
- }
- this.addCurvePosition(p, world[0], world[1], world[2], world[3], world[4], world[5], world[6], world[7], out, o,
- tangents || (i > 0 && space == 0));
- }
- return out;
- }
- // World vertices.
- if (closed) {
- verticesLength += 2;
- world = Utils.setArraySize(this.world, verticesLength);
- path.computeWorldVertices(target, 2, verticesLength - 4, world, 0, 2);
- path.computeWorldVertices(target, 0, 2, world, verticesLength - 4, 2);
- world[verticesLength - 2] = world[0];
- world[verticesLength - 1] = world[1];
- } else {
- curveCount--;
- verticesLength -= 4;
- world = Utils.setArraySize(this.world, verticesLength);
- path.computeWorldVertices(target, 2, verticesLength, world, 0, 2);
- }
- // Curve lengths.
- let curves = Utils.setArraySize(this.curves, curveCount);
- let pathLength = 0;
- let x1 = world[0], y1 = world[1], cx1 = 0, cy1 = 0, cx2 = 0, cy2 = 0, x2 = 0, y2 = 0;
- let tmpx = 0, tmpy = 0, dddfx = 0, dddfy = 0, ddfx = 0, ddfy = 0, dfx = 0, dfy = 0;
- for (let i = 0, w = 2; i < curveCount; i++, w += 6) {
- cx1 = world[w];
- cy1 = world[w + 1];
- cx2 = world[w + 2];
- cy2 = world[w + 3];
- x2 = world[w + 4];
- y2 = world[w + 5];
- tmpx = (x1 - cx1 * 2 + cx2) * 0.1875;
- tmpy = (y1 - cy1 * 2 + cy2) * 0.1875;
- dddfx = ((cx1 - cx2) * 3 - x1 + x2) * 0.09375;
- dddfy = ((cy1 - cy2) * 3 - y1 + y2) * 0.09375;
- ddfx = tmpx * 2 + dddfx;
- ddfy = tmpy * 2 + dddfy;
- dfx = (cx1 - x1) * 0.75 + tmpx + dddfx * 0.16666667;
- dfy = (cy1 - y1) * 0.75 + tmpy + dddfy * 0.16666667;
- pathLength += Math.sqrt(dfx * dfx + dfy * dfy);
- dfx += ddfx;
- dfy += ddfy;
- ddfx += dddfx;
- ddfy += dddfy;
- pathLength += Math.sqrt(dfx * dfx + dfy * dfy);
- dfx += ddfx;
- dfy += ddfy;
- pathLength += Math.sqrt(dfx * dfx + dfy * dfy);
- dfx += ddfx + dddfx;
- dfy += ddfy + dddfy;
- pathLength += Math.sqrt(dfx * dfx + dfy * dfy);
- curves[i] = pathLength;
- x1 = x2;
- y1 = y2;
- }
- if (percentPosition) position *= pathLength;
- if (percentSpacing) {
- for (let i = 0; i < spacesCount; i++)
- spaces[i] *= pathLength;
- }
- let segments = this.segments;
- let curveLength = 0;
- for (let i = 0, o = 0, curve = 0, segment = 0; i < spacesCount; i++, o += 3) {
- let space = spaces[i];
- position += space;
- let p = position;
- if (closed) {
- p %= pathLength;
- if (p < 0) p += pathLength;
- curve = 0;
- } else if (p < 0) {
- this.addBeforePosition(p, world, 0, out, o);
- continue;
- } else if (p > pathLength) {
- this.addAfterPosition(p - pathLength, world, verticesLength - 4, out, o);
- continue;
- }
- // Determine curve containing position.
- for (;; curve++) {
- let length = curves[curve];
- if (p > length) continue;
- if (curve == 0)
- p /= length;
- else {
- let prev = curves[curve - 1];
- p = (p - prev) / (length - prev);
- }
- break;
- }
- // Curve segment lengths.
- if (curve != prevCurve) {
- prevCurve = curve;
- let ii = curve * 6;
- x1 = world[ii];
- y1 = world[ii + 1];
- cx1 = world[ii + 2];
- cy1 = world[ii + 3];
- cx2 = world[ii + 4];
- cy2 = world[ii + 5];
- x2 = world[ii + 6];
- y2 = world[ii + 7];
- tmpx = (x1 - cx1 * 2 + cx2) * 0.03;
- tmpy = (y1 - cy1 * 2 + cy2) * 0.03;
- dddfx = ((cx1 - cx2) * 3 - x1 + x2) * 0.006;
- dddfy = ((cy1 - cy2) * 3 - y1 + y2) * 0.006;
- ddfx = tmpx * 2 + dddfx;
- ddfy = tmpy * 2 + dddfy;
- dfx = (cx1 - x1) * 0.3 + tmpx + dddfx * 0.16666667;
- dfy = (cy1 - y1) * 0.3 + tmpy + dddfy * 0.16666667;
- curveLength = Math.sqrt(dfx * dfx + dfy * dfy);
- segments[0] = curveLength;
- for (ii = 1; ii < 8; ii++) {
- dfx += ddfx;
- dfy += ddfy;
- ddfx += dddfx;
- ddfy += dddfy;
- curveLength += Math.sqrt(dfx * dfx + dfy * dfy);
- segments[ii] = curveLength;
- }
- dfx += ddfx;
- dfy += ddfy;
- curveLength += Math.sqrt(dfx * dfx + dfy * dfy);
- segments[8] = curveLength;
- dfx += ddfx + dddfx;
- dfy += ddfy + dddfy;
- curveLength += Math.sqrt(dfx * dfx + dfy * dfy);
- segments[9] = curveLength;
- segment = 0;
- }
- // Weight by segment length.
- p *= curveLength;
- for (;; segment++) {
- let length = segments[segment];
- if (p > length) continue;
- if (segment == 0)
- p /= length;
- else {
- let prev = segments[segment - 1];
- p = segment + (p - prev) / (length - prev);
- }
- break;
- }
- this.addCurvePosition(p * 0.1, x1, y1, cx1, cy1, cx2, cy2, x2, y2, out, o, tangents || (i > 0 && space == 0));
- }
- return out;
- }
- addBeforePosition (p, temp, i, out, o) {
- let x1 = temp[i], y1 = temp[i + 1], dx = temp[i + 2] - x1, dy = temp[i + 3] - y1, r = Math.atan2(dy, dx);
- out[o] = x1 + p * Math.cos(r);
- out[o + 1] = y1 + p * Math.sin(r);
- out[o + 2] = r;
- }
- addAfterPosition (p, temp, i, out, o) {
- let x1 = temp[i + 2], y1 = temp[i + 3], dx = x1 - temp[i], dy = y1 - temp[i + 1], r = Math.atan2(dy, dx);
- out[o] = x1 + p * Math.cos(r);
- out[o + 1] = y1 + p * Math.sin(r);
- out[o + 2] = r;
- }
- addCurvePosition (p, x1, y1, cx1, cy1, cx2, cy2, x2, y2,
- out, o, tangents) {
- if (p == 0 || isNaN(p)) p = 0.0001;
- let tt = p * p, ttt = tt * p, u = 1 - p, uu = u * u, uuu = uu * u;
- let ut = u * p, ut3 = ut * 3, uut3 = u * ut3, utt3 = ut3 * p;
- let x = x1 * uuu + cx1 * uut3 + cx2 * utt3 + x2 * ttt, y = y1 * uuu + cy1 * uut3 + cy2 * utt3 + y2 * ttt;
- out[o] = x;
- out[o + 1] = y;
- if (tangents) out[o + 2] = Math.atan2(y - (y1 * uu + cy1 * ut * 2 + cy2 * tt), x - (x1 * uu + cx1 * ut * 2 + cx2 * tt));
- }
- } PathConstraint.__initStatic(); PathConstraint.__initStatic2(); PathConstraint.__initStatic3(); PathConstraint.__initStatic4();
- /**
- * @public
- */
- class Slot {
- //this is canon
-
-
-
-
-
-
-
-
- __init() {this.deform = new Array();}
- constructor (data, bone) {Slot.prototype.__init.call(this);
- if (data == null) throw new Error("data cannot be null.");
- if (bone == null) throw new Error("bone cannot be null.");
- this.data = data;
- this.bone = bone;
- this.color = new Color();
- this.darkColor = data.darkColor == null ? null : new Color();
- this.setToSetupPose();
- this.blendMode = this.data.blendMode;
- }
- /** @return May be null. */
- getAttachment () {
- return this.attachment;
- }
- /** Sets the attachment and if it changed, resets {@link #getAttachmentTime()} and clears {@link #getAttachmentVertices()}.
- * @param attachment May be null. */
- setAttachment (attachment) {
- if (this.attachment == attachment) return;
- this.attachment = attachment;
- this.attachmentTime = this.bone.skeleton.time;
- this.deform.length = 0;
- }
- setAttachmentTime (time) {
- this.attachmentTime = this.bone.skeleton.time - time;
- }
- /** Returns the time since the attachment was set. */
- getAttachmentTime () {
- return this.bone.skeleton.time - this.attachmentTime;
- }
- setToSetupPose () {
- this.color.setFromColor(this.data.color);
- if (this.darkColor != null) this.darkColor.setFromColor(this.data.darkColor);
- if (this.data.attachmentName == null)
- this.attachment = null;
- else {
- this.attachment = null;
- this.setAttachment(this.bone.skeleton.getAttachment(this.data.index, this.data.attachmentName));
- }
- }
- }
- /**
- * @public
- */
- class TransformConstraint {
-
-
-
- __init() {this.rotateMix = 0;}
- __init2() {this.translateMix = 0;}
- __init3() {this.scaleMix = 0;}
- __init4() {this.shearMix = 0;}
- __init5() {this.temp = new Vector2();}
- __init6() {this.active = false;}
- constructor(data, skeleton) {TransformConstraint.prototype.__init.call(this);TransformConstraint.prototype.__init2.call(this);TransformConstraint.prototype.__init3.call(this);TransformConstraint.prototype.__init4.call(this);TransformConstraint.prototype.__init5.call(this);TransformConstraint.prototype.__init6.call(this);
- if (data == null) throw new Error("data cannot be null.");
- if (skeleton == null) throw new Error("skeleton cannot be null.");
- this.data = data;
- this.rotateMix = data.rotateMix;
- this.translateMix = data.translateMix;
- this.scaleMix = data.scaleMix;
- this.shearMix = data.shearMix;
- this.bones = new Array();
- for (let i = 0; i < data.bones.length; i++)
- this.bones.push(skeleton.findBone(data.bones[i].name));
- this.target = skeleton.findBone(data.target.name);
- }
- isActive () {
- return this.active;
- }
- apply() {
- this.update();
- }
- update() {
- if (this.data.local) {
- if (this.data.relative)
- this.applyRelativeLocal();
- else
- this.applyAbsoluteLocal();
- } else {
- if (this.data.relative)
- this.applyRelativeWorld();
- else
- this.applyAbsoluteWorld();
- }
- }
- applyAbsoluteWorld() {
- let rotateMix = this.rotateMix, translateMix = this.translateMix, scaleMix = this.scaleMix,
- shearMix = this.shearMix;
- let target = this.target;
- let targetMat = target.matrix;
- let ta = targetMat.a, tb = targetMat.c, tc = targetMat.b, td = targetMat.d;
- let degRadReflect = ta * td - tb * tc > 0 ? MathUtils.degRad : -MathUtils.degRad;
- let offsetRotation = this.data.offsetRotation * degRadReflect;
- let offsetShearY = this.data.offsetShearY * degRadReflect;
- let bones = this.bones;
- for (let i = 0, n = bones.length; i < n; i++) {
- let bone = bones[i];
- let modified = false;
- let mat = bone.matrix;
- if (rotateMix != 0) {
- let a = mat.a, b = mat.c, c = mat.b, d = mat.d;
- let r = Math.atan2(tc, ta) - Math.atan2(c, a) + offsetRotation;
- if (r > MathUtils.PI)
- r -= MathUtils.PI2;
- else if (r < -MathUtils.PI)
- r += MathUtils.PI2;
- r *= rotateMix;
- let cos = Math.cos(r), sin = Math.sin(r);
- mat.a = cos * a - sin * c;
- mat.c = cos * b - sin * d;
- mat.b = sin * a + cos * c;
- mat.d = sin * b + cos * d;
- modified = true;
- }
- if (translateMix != 0) {
- let temp = this.temp;
- target.localToWorld(temp.set(this.data.offsetX, this.data.offsetY));
- mat.tx += (temp.x - mat.tx) * translateMix;
- mat.ty += (temp.y - mat.ty) * translateMix;
- modified = true;
- }
- if (scaleMix > 0) {
- let s = Math.sqrt(mat.a * mat.a + mat.b * mat.b);
- let ts = Math.sqrt(ta * ta + tc * tc);
- if (s > 0.00001) s = (s + (ts - s + this.data.offsetScaleX) * scaleMix) / s;
- mat.a *= s;
- mat.b *= s;
- s = Math.sqrt(mat.c * mat.c + mat.d * mat.d);
- ts = Math.sqrt(tb * tb + td * td);
- if (s > 0.00001) s = (s + (ts - s + this.data.offsetScaleY) * scaleMix) / s;
- mat.c *= s;
- mat.d *= s;
- modified = true;
- }
- if (shearMix > 0) {
- let b = mat.c, d = mat.d;
- let by = Math.atan2(d, b);
- let r = Math.atan2(td, tb) - Math.atan2(tc, ta) - (by - Math.atan2(mat.b, mat.a));
- if (r > MathUtils.PI)
- r -= MathUtils.PI2;
- else if (r < -MathUtils.PI)
- r += MathUtils.PI2;
- r = by + (r + offsetShearY) * shearMix;
- let s = Math.sqrt(b * b + d * d);
- mat.c = Math.cos(r) * s;
- mat.d = Math.sin(r) * s;
- modified = true;
- }
- if (modified) bone.appliedValid = false;
- }
- }
- applyRelativeWorld() {
- let rotateMix = this.rotateMix, translateMix = this.translateMix, scaleMix = this.scaleMix,
- shearMix = this.shearMix;
- let target = this.target;
- let targetMat = target.matrix;
- let ta = targetMat.a, tb = targetMat.c, tc = targetMat.b, td = targetMat.d;
- let degRadReflect = ta * td - tb * tc > 0 ? MathUtils.degRad : -MathUtils.degRad;
- let offsetRotation = this.data.offsetRotation * degRadReflect,
- offsetShearY = this.data.offsetShearY * degRadReflect;
- let bones = this.bones;
- for (let i = 0, n = bones.length; i < n; i++) {
- let bone = bones[i];
- let modified = false;
- let mat = bone.matrix;
- if (rotateMix != 0) {
- let a = mat.a, b = mat.c, c = mat.b, d = mat.d;
- let r = Math.atan2(tc, ta) + offsetRotation;
- if (r > MathUtils.PI)
- r -= MathUtils.PI2;
- else if (r < -MathUtils.PI) r += MathUtils.PI2;
- r *= rotateMix;
- let cos = Math.cos(r), sin = Math.sin(r);
- mat.a = cos * a - sin * c;
- mat.c = cos * b - sin * d;
- mat.b = sin * a + cos * c;
- mat.d = sin * b + cos * d;
- modified = true;
- }
- if (translateMix != 0) {
- let temp = this.temp;
- target.localToWorld(temp.set(this.data.offsetX, this.data.offsetY));
- mat.tx += temp.x * translateMix;
- mat.ty += temp.y * translateMix;
- modified = true;
- }
- if (scaleMix > 0) {
- let s = (Math.sqrt(ta * ta + tc * tc) - 1 + this.data.offsetScaleX) * scaleMix + 1;
- mat.a *= s;
- mat.b *= s;
- s = (Math.sqrt(tb * tb + td * td) - 1 + this.data.offsetScaleY) * scaleMix + 1;
- mat.c *= s;
- mat.d *= s;
- modified = true;
- }
- if (shearMix > 0) {
- let r = Math.atan2(td, tb) - Math.atan2(tc, ta);
- if (r > MathUtils.PI)
- r -= MathUtils.PI2;
- else if (r < -MathUtils.PI) r += MathUtils.PI2;
- let b = mat.c, d = mat.d;
- r = Math.atan2(d, b) + (r - MathUtils.PI / 2 + offsetShearY) * shearMix;
- let s = Math.sqrt(b * b + d * d);
- mat.c = Math.cos(r) * s;
- mat.d = Math.sin(r) * s;
- modified = true;
- }
- if (modified) bone.appliedValid = false;
- }
- }
- applyAbsoluteLocal() {
- let rotateMix = this.rotateMix, translateMix = this.translateMix, scaleMix = this.scaleMix,
- shearMix = this.shearMix;
- let target = this.target;
- if (!target.appliedValid) target.updateAppliedTransform();
- let bones = this.bones;
- for (let i = 0, n = bones.length; i < n; i++) {
- let bone = bones[i];
- if (!bone.appliedValid) bone.updateAppliedTransform();
- let rotation = bone.arotation;
- if (rotateMix != 0) {
- let r = target.arotation - rotation + this.data.offsetRotation;
- r -= (16384 - ((16384.499999999996 - r / 360) | 0)) * 360;
- rotation += r * rotateMix;
- }
- let x = bone.ax, y = bone.ay;
- if (translateMix != 0) {
- x += (target.ax - x + this.data.offsetX) * translateMix;
- y += (target.ay - y + this.data.offsetY) * translateMix;
- }
- let scaleX = bone.ascaleX, scaleY = bone.ascaleY;
- if (scaleMix > 0) {
- if (scaleX > 0.00001) scaleX = (scaleX + (target.ascaleX - scaleX + this.data.offsetScaleX) * scaleMix) / scaleX;
- if (scaleY > 0.00001) scaleY = (scaleY + (target.ascaleY - scaleY + this.data.offsetScaleY) * scaleMix) / scaleY;
- }
- let shearY = bone.ashearY;
- if (shearMix > 0) {
- let r = target.ashearY - shearY + this.data.offsetShearY;
- r -= (16384 - ((16384.499999999996 - r / 360) | 0)) * 360;
- bone.shearY += r * shearMix;
- }
- bone.updateWorldTransformWith(x, y, rotation, scaleX, scaleY, bone.ashearX, shearY);
- }
- }
- applyRelativeLocal() {
- let rotateMix = this.rotateMix, translateMix = this.translateMix, scaleMix = this.scaleMix,
- shearMix = this.shearMix;
- let target = this.target;
- if (!target.appliedValid) target.updateAppliedTransform();
- let bones = this.bones;
- for (let i = 0, n = bones.length; i < n; i++) {
- let bone = bones[i];
- if (!bone.appliedValid) bone.updateAppliedTransform();
- let rotation = bone.arotation;
- if (rotateMix != 0) rotation += (target.arotation + this.data.offsetRotation) * rotateMix;
- let x = bone.ax, y = bone.ay;
- if (translateMix != 0) {
- x += (target.ax + this.data.offsetX) * translateMix;
- y += (target.ay + this.data.offsetY) * translateMix;
- }
- let scaleX = bone.ascaleX, scaleY = bone.ascaleY;
- if (scaleMix > 0) {
- if (scaleX > 0.00001) scaleX *= ((target.ascaleX - 1 + this.data.offsetScaleX) * scaleMix) + 1;
- if (scaleY > 0.00001) scaleY *= ((target.ascaleY - 1 + this.data.offsetScaleY) * scaleMix) + 1;
- }
- let shearY = bone.ashearY;
- if (shearMix > 0) shearY += (target.ashearY + this.data.offsetShearY) * shearMix;
- bone.updateWorldTransformWith(x, y, rotation, scaleX, scaleY, bone.ashearX, shearY);
- }
- }
- }
- /**
- * @public
- */
- class Skeleton {
-
-
-
-
-
-
-
- __init() {this._updateCache = new Array();}
- __init2() {this.updateCacheReset = new Array();}
-
-
- __init3() {this.time = 0;}
- __init4() {this.scaleX = 1;} __init5() {this.scaleY = 1;}
- __init6() {this.x = 0;} __init7() {this.y = 0;}
- constructor (data) {Skeleton.prototype.__init.call(this);Skeleton.prototype.__init2.call(this);Skeleton.prototype.__init3.call(this);Skeleton.prototype.__init4.call(this);Skeleton.prototype.__init5.call(this);Skeleton.prototype.__init6.call(this);Skeleton.prototype.__init7.call(this);
- if (data == null) throw new Error("data cannot be null.");
- this.data = data;
- this.bones = new Array();
- for (let i = 0; i < data.bones.length; i++) {
- let boneData = data.bones[i];
- let bone;
- if (boneData.parent == null)
- bone = new Bone(boneData, this, null);
- else {
- let parent = this.bones[boneData.parent.index];
- bone = new Bone(boneData, this, parent);
- parent.children.push(bone);
- }
- this.bones.push(bone);
- }
- this.slots = new Array();
- this.drawOrder = new Array();
- for (let i = 0; i < data.slots.length; i++) {
- let slotData = data.slots[i];
- let bone = this.bones[slotData.boneData.index];
- let slot = new Slot(slotData, bone);
- this.slots.push(slot);
- this.drawOrder.push(slot);
- }
- this.ikConstraints = new Array();
- for (let i = 0; i < data.ikConstraints.length; i++) {
- let ikConstraintData = data.ikConstraints[i];
- this.ikConstraints.push(new IkConstraint(ikConstraintData, this));
- }
- this.transformConstraints = new Array();
- for (let i = 0; i < data.transformConstraints.length; i++) {
- let transformConstraintData = data.transformConstraints[i];
- this.transformConstraints.push(new TransformConstraint(transformConstraintData, this));
- }
- this.pathConstraints = new Array();
- for (let i = 0; i < data.pathConstraints.length; i++) {
- let pathConstraintData = data.pathConstraints[i];
- this.pathConstraints.push(new PathConstraint(pathConstraintData, this));
- }
- this.color = new Color(1, 1, 1, 1);
- this.updateCache();
- }
- updateCache () {
- let updateCache = this._updateCache;
- updateCache.length = 0;
- this.updateCacheReset.length = 0;
- let bones = this.bones;
- for (let i = 0, n = bones.length; i < n; i++) {
- let bone = bones[i];
- bone.sorted = bone.data.skinRequired;
- bone.active = !bone.sorted;
- }
- if (this.skin != null) {
- let skinBones = this.skin.bones;
- for (let i = 0, n = this.skin.bones.length; i < n; i++) {
- let bone = this.bones[skinBones[i].index];
- do {
- bone.sorted = false;
- bone.active = true;
- bone = bone.parent;
- } while (bone != null);
- }
- }
- // IK first, lowest hierarchy depth first.
- let ikConstraints = this.ikConstraints;
- let transformConstraints = this.transformConstraints;
- let pathConstraints = this.pathConstraints;
- let ikCount = ikConstraints.length, transformCount = transformConstraints.length, pathCount = pathConstraints.length;
- let constraintCount = ikCount + transformCount + pathCount;
- outer:
- for (let i = 0; i < constraintCount; i++) {
- for (let ii = 0; ii < ikCount; ii++) {
- let constraint = ikConstraints[ii];
- if (constraint.data.order == i) {
- this.sortIkConstraint(constraint);
- continue outer;
- }
- }
- for (let ii = 0; ii < transformCount; ii++) {
- let constraint = transformConstraints[ii];
- if (constraint.data.order == i) {
- this.sortTransformConstraint(constraint);
- continue outer;
- }
- }
- for (let ii = 0; ii < pathCount; ii++) {
- let constraint = pathConstraints[ii];
- if (constraint.data.order == i) {
- this.sortPathConstraint(constraint);
- continue outer;
- }
- }
- }
- for (let i = 0, n = bones.length; i < n; i++)
- this.sortBone(bones[i]);
- }
- sortIkConstraint (constraint) {
- constraint.active = constraint.target.isActive() && (!constraint.data.skinRequired || (this.skin != null && Utils.contains(this.skin.constraints, constraint.data, true)));
- if (!constraint.active) return;
- let target = constraint.target;
- this.sortBone(target);
- let constrained = constraint.bones;
- let parent = constrained[0];
- this.sortBone(parent);
- if (constrained.length > 1) {
- let child = constrained[constrained.length - 1];
- if (!(this._updateCache.indexOf(child) > -1)) this.updateCacheReset.push(child);
- }
- this._updateCache.push(constraint);
- this.sortReset(parent.children);
- constrained[constrained.length - 1].sorted = true;
- }
- sortPathConstraint (constraint) {
- constraint.active = constraint.target.bone.isActive() && (!constraint.data.skinRequired || (this.skin != null && Utils.contains(this.skin.constraints, constraint.data, true)));
- if (!constraint.active) return;
- let slot = constraint.target;
- let slotIndex = slot.data.index;
- let slotBone = slot.bone;
- if (this.skin != null) this.sortPathConstraintAttachment(this.skin, slotIndex, slotBone);
- if (this.data.defaultSkin != null && this.data.defaultSkin != this.skin)
- this.sortPathConstraintAttachment(this.data.defaultSkin, slotIndex, slotBone);
- for (let i = 0, n = this.data.skins.length; i < n; i++)
- this.sortPathConstraintAttachment(this.data.skins[i], slotIndex, slotBone);
- let attachment = slot.getAttachment();
- if (attachment instanceof PathAttachment) this.sortPathConstraintAttachmentWith(attachment, slotBone);
- let constrained = constraint.bones;
- let boneCount = constrained.length;
- for (let i = 0; i < boneCount; i++)
- this.sortBone(constrained[i]);
- this._updateCache.push(constraint);
- for (let i = 0; i < boneCount; i++)
- this.sortReset(constrained[i].children);
- for (let i = 0; i < boneCount; i++)
- constrained[i].sorted = true;
- }
- sortTransformConstraint (constraint) {
- constraint.active = constraint.target.isActive() && (!constraint.data.skinRequired || (this.skin != null && Utils.contains(this.skin.constraints, constraint.data, true)));
- if (!constraint.active) return;
- this.sortBone(constraint.target);
- let constrained = constraint.bones;
- let boneCount = constrained.length;
- if (constraint.data.local) {
- for (let i = 0; i < boneCount; i++) {
- let child = constrained[i];
- this.sortBone(child.parent);
- if (!(this._updateCache.indexOf(child) > -1)) this.updateCacheReset.push(child);
- }
- } else {
- for (let i = 0; i < boneCount; i++) {
- this.sortBone(constrained[i]);
- }
- }
- this._updateCache.push(constraint);
- for (let ii = 0; ii < boneCount; ii++)
- this.sortReset(constrained[ii].children);
- for (let ii = 0; ii < boneCount; ii++)
- constrained[ii].sorted = true;
- }
- sortPathConstraintAttachment (skin, slotIndex, slotBone) {
- let attachments = skin.attachments[slotIndex];
- if (!attachments) return;
- for (let key in attachments) {
- this.sortPathConstraintAttachmentWith(attachments[key], slotBone);
- }
- }
- sortPathConstraintAttachmentWith (attachment, slotBone) {
- if (!(attachment instanceof PathAttachment)) return;
- let pathBones = (attachment).bones;
- if (pathBones == null)
- this.sortBone(slotBone);
- else {
- let bones = this.bones;
- let i = 0;
- while (i < pathBones.length) {
- let boneCount = pathBones[i++];
- for (let n = i + boneCount; i < n; i++) {
- let boneIndex = pathBones[i];
- this.sortBone(bones[boneIndex]);
- }
- }
- }
- }
- sortBone (bone) {
- if (bone.sorted) return;
- let parent = bone.parent;
- if (parent != null) this.sortBone(parent);
- bone.sorted = true;
- this._updateCache.push(bone);
- }
- sortReset (bones) {
- for (let i = 0, n = bones.length; i < n; i++) {
- let bone = bones[i];
- if (!bone.active) continue;
- if (bone.sorted) this.sortReset(bone.children);
- bone.sorted = false;
- }
- }
- /** Updates the world transform for each bone and applies constraints. */
- updateWorldTransform () {
- let updateCacheReset = this.updateCacheReset;
- for (let i = 0, n = updateCacheReset.length; i < n; i++) {
- let bone = updateCacheReset[i] ;
- bone.ax = bone.x;
- bone.ay = bone.y;
- bone.arotation = bone.rotation;
- bone.ascaleX = bone.scaleX;
- bone.ascaleY = bone.scaleY;
- bone.ashearX = bone.shearX;
- bone.ashearY = bone.shearY;
- bone.appliedValid = true;
- }
- let updateCache = this._updateCache;
- for (let i = 0, n = updateCache.length; i < n; i++)
- updateCache[i].update();
- }
- /** Sets the bones, constraints, and slots to their setup pose values. */
- setToSetupPose () {
- this.setBonesToSetupPose();
- this.setSlotsToSetupPose();
- }
- /** Sets the bones and constraints to their setup pose values. */
- setBonesToSetupPose () {
- let bones = this.bones;
- for (let i = 0, n = bones.length; i < n; i++)
- bones[i].setToSetupPose();
- let ikConstraints = this.ikConstraints;
- for (let i = 0, n = ikConstraints.length; i < n; i++) {
- let constraint = ikConstraints[i];
- constraint.mix = constraint.data.mix;
- constraint.softness = constraint.data.softness;
- constraint.bendDirection = constraint.data.bendDirection;
- constraint.compress = constraint.data.compress;
- constraint.stretch = constraint.data.stretch;
- }
- let transformConstraints = this.transformConstraints;
- for (let i = 0, n = transformConstraints.length; i < n; i++) {
- let constraint = transformConstraints[i];
- let data = constraint.data;
- constraint.rotateMix = data.rotateMix;
- constraint.translateMix = data.translateMix;
- constraint.scaleMix = data.scaleMix;
- constraint.shearMix = data.shearMix;
- }
- let pathConstraints = this.pathConstraints;
- for (let i = 0, n = pathConstraints.length; i < n; i++) {
- let constraint = pathConstraints[i];
- let data = constraint.data;
- constraint.position = data.position;
- constraint.spacing = data.spacing;
- constraint.rotateMix = data.rotateMix;
- constraint.translateMix = data.translateMix;
- }
- }
- setSlotsToSetupPose () {
- let slots = this.slots;
- Utils.arrayCopy(slots, 0, this.drawOrder, 0, slots.length);
- for (let i = 0, n = slots.length; i < n; i++)
- slots[i].setToSetupPose();
- }
- /** @return May return null. */
- getRootBone () {
- if (this.bones.length == 0) return null;
- return this.bones[0];
- }
- /** @return May be null. */
- findBone (boneName) {
- if (boneName == null) throw new Error("boneName cannot be null.");
- let bones = this.bones;
- for (let i = 0, n = bones.length; i < n; i++) {
- let bone = bones[i];
- if (bone.data.name == boneName) return bone;
- }
- return null;
- }
- /** @return -1 if the bone was not found. */
- findBoneIndex (boneName) {
- if (boneName == null) throw new Error("boneName cannot be null.");
- let bones = this.bones;
- for (let i = 0, n = bones.length; i < n; i++)
- if (bones[i].data.name == boneName) return i;
- return -1;
- }
- /** @return May be null. */
- findSlot (slotName) {
- if (slotName == null) throw new Error("slotName cannot be null.");
- let slots = this.slots;
- for (let i = 0, n = slots.length; i < n; i++) {
- let slot = slots[i];
- if (slot.data.name == slotName) return slot;
- }
- return null;
- }
- /** @return -1 if the bone was not found. */
- findSlotIndex (slotName) {
- if (slotName == null) throw new Error("slotName cannot be null.");
- let slots = this.slots;
- for (let i = 0, n = slots.length; i < n; i++)
- if (slots[i].data.name == slotName) return i;
- return -1;
- }
- /** Sets a skin by name.
- * @see #setSkin(Skin) */
- setSkinByName (skinName) {
- let skin = this.data.findSkin(skinName);
- if (skin == null) throw new Error("Skin not found: " + skinName);
- this.setSkin(skin);
- }
- /** Sets the skin used to look up attachments before looking in the {@link SkeletonData#getDefaultSkin() default skin}.
- * Attachments from the new skin are attached if the corresponding attachment from the old skin was attached. If there was no
- * old skin, each slot's setup mode attachment is attached from the new skin.
- * @param newSkin May be null. */
- setSkin (newSkin) {
- if (newSkin == this.skin) return;
- if (newSkin != null) {
- if (this.skin != null)
- newSkin.attachAll(this, this.skin);
- else {
- let slots = this.slots;
- for (let i = 0, n = slots.length; i < n; i++) {
- let slot = slots[i];
- let name = slot.data.attachmentName;
- if (name != null) {
- let attachment = newSkin.getAttachment(i, name);
- if (attachment != null) slot.setAttachment(attachment);
- }
- }
- }
- }
- this.skin = newSkin;
- this.updateCache();
- }
- /** @return May be null. */
- getAttachmentByName (slotName, attachmentName) {
- return this.getAttachment(this.data.findSlotIndex(slotName), attachmentName);
- }
- /** @return May be null. */
- getAttachment (slotIndex, attachmentName) {
- if (attachmentName == null) throw new Error("attachmentName cannot be null.");
- if (this.skin != null) {
- let attachment = this.skin.getAttachment(slotIndex, attachmentName);
- if (attachment != null) return attachment;
- }
- if (this.data.defaultSkin != null) return this.data.defaultSkin.getAttachment(slotIndex, attachmentName);
- return null;
- }
- /** @param attachmentName May be null. */
- setAttachment (slotName, attachmentName) {
- if (slotName == null) throw new Error("slotName cannot be null.");
- let slots = this.slots;
- for (let i = 0, n = slots.length; i < n; i++) {
- let slot = slots[i];
- if (slot.data.name == slotName) {
- let attachment = null;
- if (attachmentName != null) {
- attachment = this.getAttachment(i, attachmentName);
- if (attachment == null)
- throw new Error("Attachment not found: " + attachmentName + ", for slot: " + slotName);
- }
- slot.setAttachment(attachment);
- return;
- }
- }
- throw new Error("Slot not found: " + slotName);
- }
- /** @return May be null. */
- findIkConstraint (constraintName) {
- if (constraintName == null) throw new Error("constraintName cannot be null.");
- let ikConstraints = this.ikConstraints;
- for (let i = 0, n = ikConstraints.length; i < n; i++) {
- let ikConstraint = ikConstraints[i];
- if (ikConstraint.data.name == constraintName) return ikConstraint;
- }
- return null;
- }
- /** @return May be null. */
- findTransformConstraint (constraintName) {
- if (constraintName == null) throw new Error("constraintName cannot be null.");
- let transformConstraints = this.transformConstraints;
- for (let i = 0, n = transformConstraints.length; i < n; i++) {
- let constraint = transformConstraints[i];
- if (constraint.data.name == constraintName) return constraint;
- }
- return null;
- }
- /** @return May be null. */
- findPathConstraint (constraintName) {
- if (constraintName == null) throw new Error("constraintName cannot be null.");
- let pathConstraints = this.pathConstraints;
- for (let i = 0, n = pathConstraints.length; i < n; i++) {
- let constraint = pathConstraints[i];
- if (constraint.data.name == constraintName) return constraint;
- }
- return null;
- }
- /** Returns the axis aligned bounding box (AABB) of the region and mesh attachments for the current pose.
- * @param offset The distance from the skeleton origin to the bottom left corner of the AABB.
- * @param size The width and height of the AABB.
- * @param temp Working memory */
- getBounds (offset, size, temp = new Array(2)) {
- if (offset == null) throw new Error("offset cannot be null.");
- if (size == null) throw new Error("size cannot be null.");
- let drawOrder = this.drawOrder;
- let minX = Number.POSITIVE_INFINITY, minY = Number.POSITIVE_INFINITY, maxX = Number.NEGATIVE_INFINITY, maxY = Number.NEGATIVE_INFINITY;
- for (let i = 0, n = drawOrder.length; i < n; i++) {
- let slot = drawOrder[i];
- if (!slot.bone.active) continue;
- let verticesLength = 0;
- let vertices = null;
- let attachment = slot.getAttachment();
- if (attachment instanceof RegionAttachment) {
- verticesLength = 8;
- vertices = Utils.setArraySize(temp, verticesLength, 0);
- (attachment).computeWorldVertices(slot.bone, vertices, 0, 2);
- } else if (attachment instanceof MeshAttachment) {
- let mesh = (attachment);
- verticesLength = mesh.worldVerticesLength;
- vertices = Utils.setArraySize(temp, verticesLength, 0);
- mesh.computeWorldVertices(slot, 0, verticesLength, vertices, 0, 2);
- }
- if (vertices != null) {
- for (let ii = 0, nn = vertices.length; ii < nn; ii += 2) {
- let x = vertices[ii], y = vertices[ii + 1];
- minX = Math.min(minX, x);
- minY = Math.min(minY, y);
- maxX = Math.max(maxX, x);
- maxY = Math.max(maxY, y);
- }
- }
- }
- offset.set(minX, minY);
- size.set(maxX - minX, maxY - minY);
- }
- update (delta) {
- this.time += delta;
- }
- get flipX() {
- return this.scaleX == -1;
- }
- set flipX(value) {
- if (!Skeleton.deprecatedWarning1) {
- Skeleton.deprecatedWarning1 = true;
- console.warn("Spine Deprecation Warning: `Skeleton.flipX/flipY` was deprecated, please use scaleX/scaleY");
- }
- this.scaleX = value ? 1.0 : -1.0;
- }
- get flipY() {
- return this.scaleY == -1;
- }
- set flipY(value) {
- if (!Skeleton.deprecatedWarning1) {
- Skeleton.deprecatedWarning1 = true;
- console.warn("Spine Deprecation Warning: `Skeleton.flipX/flipY` was deprecated, please use scaleX/scaleY");
- }
- this.scaleY = value ? 1.0 : -1.0;
- }
- static __initStatic() {this.deprecatedWarning1 = false;}
- } Skeleton.__initStatic();
- /**
- * @public
- */
- class SkeletonData {constructor() { SkeletonData.prototype.__init.call(this);SkeletonData.prototype.__init2.call(this);SkeletonData.prototype.__init3.call(this);SkeletonData.prototype.__init4.call(this);SkeletonData.prototype.__init5.call(this);SkeletonData.prototype.__init6.call(this);SkeletonData.prototype.__init7.call(this);SkeletonData.prototype.__init8.call(this);SkeletonData.prototype.__init9.call(this); }
-
- __init() {this.bones = new Array();} // Ordered parents first.
- __init2() {this.slots = new Array();} // Setup pose draw order.
- __init3() {this.skins = new Array();}
-
- __init4() {this.events = new Array();}
- __init5() {this.animations = new Array();}
- __init6() {this.ikConstraints = new Array();}
- __init7() {this.transformConstraints = new Array();}
- __init8() {this.pathConstraints = new Array();}
-
-
- // Nonessential
- __init9() {this.fps = 0;}
-
-
- findBone (boneName) {
- if (boneName == null) throw new Error("boneName cannot be null.");
- let bones = this.bones;
- for (let i = 0, n = bones.length; i < n; i++) {
- let bone = bones[i];
- if (bone.name == boneName) return bone;
- }
- return null;
- }
- findBoneIndex (boneName) {
- if (boneName == null) throw new Error("boneName cannot be null.");
- let bones = this.bones;
- for (let i = 0, n = bones.length; i < n; i++)
- if (bones[i].name == boneName) return i;
- return -1;
- }
- findSlot (slotName) {
- if (slotName == null) throw new Error("slotName cannot be null.");
- let slots = this.slots;
- for (let i = 0, n = slots.length; i < n; i++) {
- let slot = slots[i];
- if (slot.name == slotName) return slot;
- }
- return null;
- }
- findSlotIndex (slotName) {
- if (slotName == null) throw new Error("slotName cannot be null.");
- let slots = this.slots;
- for (let i = 0, n = slots.length; i < n; i++)
- if (slots[i].name == slotName) return i;
- return -1;
- }
- findSkin (skinName) {
- if (skinName == null) throw new Error("skinName cannot be null.");
- let skins = this.skins;
- for (let i = 0, n = skins.length; i < n; i++) {
- let skin = skins[i];
- if (skin.name == skinName) return skin;
- }
- return null;
- }
- findEvent (eventDataName) {
- if (eventDataName == null) throw new Error("eventDataName cannot be null.");
- let events = this.events;
- for (let i = 0, n = events.length; i < n; i++) {
- let event = events[i];
- if (event.name == eventDataName) return event;
- }
- return null;
- }
- findAnimation (animationName) {
- if (animationName == null) throw new Error("animationName cannot be null.");
- let animations = this.animations;
- for (let i = 0, n = animations.length; i < n; i++) {
- let animation = animations[i];
- if (animation.name == animationName) return animation;
- }
- return null;
- }
- findIkConstraint (constraintName) {
- if (constraintName == null) throw new Error("constraintName cannot be null.");
- let ikConstraints = this.ikConstraints;
- for (let i = 0, n = ikConstraints.length; i < n; i++) {
- let constraint = ikConstraints[i];
- if (constraint.name == constraintName) return constraint;
- }
- return null;
- }
- findTransformConstraint (constraintName) {
- if (constraintName == null) throw new Error("constraintName cannot be null.");
- let transformConstraints = this.transformConstraints;
- for (let i = 0, n = transformConstraints.length; i < n; i++) {
- let constraint = transformConstraints[i];
- if (constraint.name == constraintName) return constraint;
- }
- return null;
- }
- findPathConstraint (constraintName) {
- if (constraintName == null) throw new Error("constraintName cannot be null.");
- let pathConstraints = this.pathConstraints;
- for (let i = 0, n = pathConstraints.length; i < n; i++) {
- let constraint = pathConstraints[i];
- if (constraint.name == constraintName) return constraint;
- }
- return null;
- }
- findPathConstraintIndex (pathConstraintName) {
- if (pathConstraintName == null) throw new Error("pathConstraintName cannot be null.");
- let pathConstraints = this.pathConstraints;
- for (let i = 0, n = pathConstraints.length; i < n; i++)
- if (pathConstraints[i].name == pathConstraintName) return i;
- return -1;
- }
- }
- /**
- * @public
- */
- class SlotData {
-
-
-
- __init() {this.color = new Color(1, 1, 1, 1);}
-
-
-
- constructor (index, name, boneData) {SlotData.prototype.__init.call(this);
- if (index < 0) throw new Error("index must be >= 0.");
- if (name == null) throw new Error("name cannot be null.");
- if (boneData == null) throw new Error("boneData cannot be null.");
- this.index = index;
- this.name = name;
- this.boneData = boneData;
- }
- }
- /**
- * @public
- */
- class TransformConstraintData extends ConstraintData {
- __init() {this.bones = new Array();}
-
- __init2() {this.rotateMix = 0;} __init3() {this.translateMix = 0;} __init4() {this.scaleMix = 0;} __init5() {this.shearMix = 0;}
- __init6() {this.offsetRotation = 0;} __init7() {this.offsetX = 0;} __init8() {this.offsetY = 0;} __init9() {this.offsetScaleX = 0;} __init10() {this.offsetScaleY = 0;} __init11() {this.offsetShearY = 0;}
- __init12() {this.relative = false;}
- __init13() {this.local = false;}
- constructor (name) {
- super(name, 0, false);TransformConstraintData.prototype.__init.call(this);TransformConstraintData.prototype.__init2.call(this);TransformConstraintData.prototype.__init3.call(this);TransformConstraintData.prototype.__init4.call(this);TransformConstraintData.prototype.__init5.call(this);TransformConstraintData.prototype.__init6.call(this);TransformConstraintData.prototype.__init7.call(this);TransformConstraintData.prototype.__init8.call(this);TransformConstraintData.prototype.__init9.call(this);TransformConstraintData.prototype.__init10.call(this);TransformConstraintData.prototype.__init11.call(this);TransformConstraintData.prototype.__init12.call(this);TransformConstraintData.prototype.__init13.call(this); }
- }
- /**
- * @public
- */
- class SkinEntry {
- constructor( slotIndex, name, attachment) {this.slotIndex = slotIndex;this.name = name;this.attachment = attachment; }
- }
- /**
- * @public
- */
- class Skin {
-
- __init() {this.attachments = new Array();}
- __init2() {this.bones = Array();}
- __init3() {this.constraints = new Array();}
- constructor (name) {Skin.prototype.__init.call(this);Skin.prototype.__init2.call(this);Skin.prototype.__init3.call(this);
- if (name == null) throw new Error("name cannot be null.");
- this.name = name;
- }
- setAttachment (slotIndex, name, attachment) {
- if (attachment == null) throw new Error("attachment cannot be null.");
- let attachments = this.attachments;
- if (slotIndex >= attachments.length) attachments.length = slotIndex + 1;
- if (!attachments[slotIndex]) attachments[slotIndex] = { };
- attachments[slotIndex][name] = attachment;
- }
- addSkin (skin) {
- for(let i = 0; i < skin.bones.length; i++) {
- let bone = skin.bones[i];
- let contained = false;
- for (let j = 0; j < this.bones.length; j++) {
- if (this.bones[j] == bone) {
- contained = true;
- break;
- }
- }
- if (!contained) this.bones.push(bone);
- }
- for(let i = 0; i < skin.constraints.length; i++) {
- let constraint = skin.constraints[i];
- let contained = false;
- for (let j = 0; j < this.constraints.length; j++) {
- if (this.constraints[j] == constraint) {
- contained = true;
- break;
- }
- }
- if (!contained) this.constraints.push(constraint);
- }
- let attachments = skin.getAttachments();
- for (let i = 0; i < attachments.length; i++) {
- var attachment = attachments[i];
- this.setAttachment(attachment.slotIndex, attachment.name, attachment.attachment);
- }
- }
- copySkin (skin) {
- for(let i = 0; i < skin.bones.length; i++) {
- let bone = skin.bones[i];
- let contained = false;
- for (let j = 0; j < this.bones.length; j++) {
- if (this.bones[j] == bone) {
- contained = true;
- break;
- }
- }
- if (!contained) this.bones.push(bone);
- }
- for(let i = 0; i < skin.constraints.length; i++) {
- let constraint = skin.constraints[i];
- let contained = false;
- for (let j = 0; j < this.constraints.length; j++) {
- if (this.constraints[j] == constraint) {
- contained = true;
- break;
- }
- }
- if (!contained) this.constraints.push(constraint);
- }
- let attachments = skin.getAttachments();
- for (let i = 0; i < attachments.length; i++) {
- var attachment = attachments[i];
- if (attachment.attachment == null) continue;
- if (attachment.attachment instanceof MeshAttachment) {
- attachment.attachment = attachment.attachment.newLinkedMesh();
- this.setAttachment(attachment.slotIndex, attachment.name, attachment.attachment);
- } else {
- attachment.attachment = attachment.attachment.copy();
- this.setAttachment(attachment.slotIndex, attachment.name, attachment.attachment);
- }
- }
- }
- /** @return May be null. */
- getAttachment (slotIndex, name) {
- let dictionary = this.attachments[slotIndex];
- return dictionary ? dictionary[name] : null;
- }
- removeAttachment (slotIndex, name) {
- let dictionary = this.attachments[slotIndex];
- if (dictionary) dictionary[name] = null;
- }
- getAttachments () {
- let entries = new Array();
- for (var i = 0; i < this.attachments.length; i++) {
- let slotAttachments = this.attachments[i];
- if (slotAttachments) {
- for (let name in slotAttachments) {
- let attachment = slotAttachments[name];
- if (attachment) entries.push(new SkinEntry(i, name, attachment));
- }
- }
- }
- return entries;
- }
- getAttachmentsForSlot (slotIndex, attachments) {
- let slotAttachments = this.attachments[slotIndex];
- if (slotAttachments) {
- for (let name in slotAttachments) {
- let attachment = slotAttachments[name];
- if (attachment) attachments.push(new SkinEntry(slotIndex, name, attachment));
- }
- }
- }
- clear () {
- this.attachments.length = 0;
- this.bones.length = 0;
- this.constraints.length = 0;
- }
- /** Attach each attachment in this skin if the corresponding attachment in the old skin is currently attached. */
- attachAll (skeleton, oldSkin) {
- let slotIndex = 0;
- for (let i = 0; i < skeleton.slots.length; i++) {
- let slot = skeleton.slots[i];
- let slotAttachment = slot.getAttachment();
- if (slotAttachment && slotIndex < oldSkin.attachments.length) {
- let dictionary = oldSkin.attachments[slotIndex];
- for (let key in dictionary) {
- let skinAttachment = dictionary[key];
- if (slotAttachment == skinAttachment) {
- let attachment = this.getAttachment(slotIndex, key);
- if (attachment != null) slot.setAttachment(attachment);
- break;
- }
- }
- }
- slotIndex++;
- }
- }
- }
- /**
- * @public
- */
- class SkeletonBinary {
- static __initStatic() {this.AttachmentTypeValues = [ 0 /*AttachmentType.Region*/, 1/*AttachmentType.BoundingBox*/, 2/*AttachmentType.Mesh*/, 3/*AttachmentType.LinkedMesh*/, 4/*AttachmentType.Path*/, 5/*AttachmentType.Point*/, 6/*AttachmentType.Clipping*/ ];}
- static __initStatic2() {this.TransformModeValues = [TransformMode.Normal, TransformMode.OnlyTranslation, TransformMode.NoRotationOrReflection, TransformMode.NoScale, TransformMode.NoScaleOrReflection];}
- static __initStatic3() {this.PositionModeValues = [ PositionMode.Fixed, PositionMode.Percent ];}
- static __initStatic4() {this.SpacingModeValues = [ SpacingMode.Length, SpacingMode.Fixed, SpacingMode.Percent];}
- static __initStatic5() {this.RotateModeValues = [ RotateMode.Tangent, RotateMode.Chain, RotateMode.ChainScale ];}
- static __initStatic6() {this.BlendModeValues = [ constants.BLEND_MODES.NORMAL, constants.BLEND_MODES.ADD, constants.BLEND_MODES.MULTIPLY, constants.BLEND_MODES.SCREEN];}
- static __initStatic7() {this.BONE_ROTATE = 0;}
- static __initStatic8() {this.BONE_TRANSLATE = 1;}
- static __initStatic9() {this.BONE_SCALE = 2;}
- static __initStatic10() {this.BONE_SHEAR = 3;}
- static __initStatic11() {this.SLOT_ATTACHMENT = 0;}
- static __initStatic12() {this.SLOT_COLOR = 1;}
- static __initStatic13() {this.SLOT_TWO_COLOR = 2;}
- static __initStatic14() {this.PATH_POSITION = 0;}
- static __initStatic15() {this.PATH_SPACING = 1;}
- static __initStatic16() {this.PATH_MIX = 2;}
- static __initStatic17() {this.CURVE_LINEAR = 0;}
- static __initStatic18() {this.CURVE_STEPPED = 1;}
- static __initStatic19() {this.CURVE_BEZIER = 2;}
-
- __init() {this.scale = 1;}
- __init2() {this.linkedMeshes = new Array();}
- constructor (attachmentLoader) {SkeletonBinary.prototype.__init.call(this);SkeletonBinary.prototype.__init2.call(this);
- this.attachmentLoader = attachmentLoader;
- }
- readSkeletonData (binary) {
- let scale = this.scale;
- let skeletonData = new SkeletonData();
- skeletonData.name = ""; // BOZO
- let input = new BinaryInput(binary);
- skeletonData.hash = input.readString();
- skeletonData.version = input.readString();
- if (skeletonData.version === '3.8.75')
- {
- let error = `Unsupported skeleton data, 3.8.75 is deprecated, please export with a newer version of Spine.`;
- console.error(error);
- }
- skeletonData.x = input.readFloat();
- skeletonData.y = input.readFloat();
- skeletonData.width = input.readFloat();
- skeletonData.height = input.readFloat();
- let nonessential = input.readBoolean();
- if (nonessential) {
- skeletonData.fps = input.readFloat();
- skeletonData.imagesPath = input.readString();
- skeletonData.audioPath = input.readString();
- }
- let n = 0;
- // Strings.
- n = input.readInt(true);
- for (let i = 0; i < n; i++)
- input.strings.push(input.readString());
- // Bones.
- n = input.readInt(true);
- for (let i = 0; i < n; i++) {
- let name = input.readString();
- let parent = i == 0 ? null : skeletonData.bones[input.readInt(true)];
- let data = new BoneData(i, name, parent);
- data.rotation = input.readFloat();
- data.x = input.readFloat() * scale;
- data.y = input.readFloat() * scale;
- data.scaleX = input.readFloat();
- data.scaleY = input.readFloat();
- data.shearX = input.readFloat();
- data.shearY = input.readFloat();
- data.length = input.readFloat() * scale;
- data.transformMode = SkeletonBinary.TransformModeValues[input.readInt(true)];
- data.skinRequired = input.readBoolean();
- if (nonessential) Color.rgba8888ToColor(data.color, input.readInt32());
- skeletonData.bones.push(data);
- }
- // Slots.
- n = input.readInt(true);
- for (let i = 0; i < n; i++) {
- let slotName = input.readString();
- let boneData = skeletonData.bones[input.readInt(true)];
- let data = new SlotData(i, slotName, boneData);
- Color.rgba8888ToColor(data.color, input.readInt32());
- let darkColor = input.readInt32();
- if (darkColor != -1) Color.rgb888ToColor(data.darkColor = new Color(), darkColor);
- data.attachmentName = input.readStringRef();
- data.blendMode = SkeletonBinary.BlendModeValues[input.readInt(true)];
- skeletonData.slots.push(data);
- }
- // IK constraints.
- n = input.readInt(true);
- for (let i = 0, nn; i < n; i++) {
- let data = new IkConstraintData(input.readString());
- data.order = input.readInt(true);
- data.skinRequired = input.readBoolean();
- nn = input.readInt(true);
- for (let ii = 0; ii < nn; ii++)
- data.bones.push(skeletonData.bones[input.readInt(true)]);
- data.target = skeletonData.bones[input.readInt(true)];
- data.mix = input.readFloat();
- data.softness = input.readFloat() * scale;
- data.bendDirection = input.readByte();
- data.compress = input.readBoolean();
- data.stretch = input.readBoolean();
- data.uniform = input.readBoolean();
- skeletonData.ikConstraints.push(data);
- }
- // Transform constraints.
- n = input.readInt(true);
- for (let i = 0, nn; i < n; i++) {
- let data = new TransformConstraintData(input.readString());
- data.order = input.readInt(true);
- data.skinRequired = input.readBoolean();
- nn = input.readInt(true);
- for (let ii = 0; ii < nn; ii++)
- data.bones.push(skeletonData.bones[input.readInt(true)]);
- data.target = skeletonData.bones[input.readInt(true)];
- data.local = input.readBoolean();
- data.relative = input.readBoolean();
- data.offsetRotation = input.readFloat();
- data.offsetX = input.readFloat() * scale;
- data.offsetY = input.readFloat() * scale;
- data.offsetScaleX = input.readFloat();
- data.offsetScaleY = input.readFloat();
- data.offsetShearY = input.readFloat();
- data.rotateMix = input.readFloat();
- data.translateMix = input.readFloat();
- data.scaleMix = input.readFloat();
- data.shearMix = input.readFloat();
- skeletonData.transformConstraints.push(data);
- }
- // Path constraints.
- n = input.readInt(true);
- for (let i = 0, nn; i < n; i++) {
- let data = new PathConstraintData(input.readString());
- data.order = input.readInt(true);
- data.skinRequired = input.readBoolean();
- nn = input.readInt(true);
- for (let ii = 0; ii < nn; ii++)
- data.bones.push(skeletonData.bones[input.readInt(true)]);
- data.target = skeletonData.slots[input.readInt(true)];
- data.positionMode = SkeletonBinary.PositionModeValues[input.readInt(true)];
- data.spacingMode = SkeletonBinary.SpacingModeValues[input.readInt(true)];
- data.rotateMode = SkeletonBinary.RotateModeValues[input.readInt(true)];
- data.offsetRotation = input.readFloat();
- data.position = input.readFloat();
- if (data.positionMode == PositionMode.Fixed) data.position *= scale;
- data.spacing = input.readFloat();
- if (data.spacingMode == SpacingMode.Length || data.spacingMode == SpacingMode.Fixed) data.spacing *= scale;
- data.rotateMix = input.readFloat();
- data.translateMix = input.readFloat();
- skeletonData.pathConstraints.push(data);
- }
- // Default skin.
- let defaultSkin = this.readSkin(input, skeletonData, true, nonessential);
- if (defaultSkin != null) {
- skeletonData.defaultSkin = defaultSkin;
- skeletonData.skins.push(defaultSkin);
- }
- // Skins.
- {
- let i = skeletonData.skins.length;
- Utils.setArraySize(skeletonData.skins, n = i + input.readInt(true));
- for (; i < n; i++)
- skeletonData.skins[i] = this.readSkin(input, skeletonData, false, nonessential);
- }
- // Linked meshes.
- n = this.linkedMeshes.length;
- for (let i = 0; i < n; i++) {
- let linkedMesh = this.linkedMeshes[i];
- let skin = linkedMesh.skin == null ? skeletonData.defaultSkin : skeletonData.findSkin(linkedMesh.skin);
- if (skin == null) throw new Error("Skin not found: " + linkedMesh.skin);
- let parent = skin.getAttachment(linkedMesh.slotIndex, linkedMesh.parent);
- if (parent == null) throw new Error("Parent mesh not found: " + linkedMesh.parent);
- linkedMesh.mesh.deformAttachment = linkedMesh.inheritDeform ? parent : linkedMesh.mesh;
- linkedMesh.mesh.setParentMesh(parent );
- // linkedMesh.mesh.updateUVs();
- }
- this.linkedMeshes.length = 0;
- // Events.
- n = input.readInt(true);
- for (let i = 0; i < n; i++) {
- let data = new EventData(input.readStringRef());
- data.intValue = input.readInt(false);
- data.floatValue = input.readFloat();
- data.stringValue = input.readString();
- data.audioPath = input.readString();
- if (data.audioPath != null) {
- data.volume = input.readFloat();
- data.balance = input.readFloat();
- }
- skeletonData.events.push(data);
- }
- // Animations.
- n = input.readInt(true);
- for (let i = 0; i < n; i++)
- skeletonData.animations.push(this.readAnimation(input, input.readString(), skeletonData));
- return skeletonData;
- }
- readSkin (input, skeletonData, defaultSkin, nonessential) {
- let skin = null;
- let slotCount = 0;
- if (defaultSkin) {
- slotCount = input.readInt(true);
- if (slotCount == 0) return null;
- skin = new Skin("default");
- } else {
- skin = new Skin(input.readStringRef());
- skin.bones.length = input.readInt(true);
- for (let i = 0, n = skin.bones.length; i < n; i++)
- skin.bones[i] = skeletonData.bones[input.readInt(true)];
- for (let i = 0, n = input.readInt(true); i < n; i++)
- skin.constraints.push(skeletonData.ikConstraints[input.readInt(true)]);
- for (let i = 0, n = input.readInt(true); i < n; i++)
- skin.constraints.push(skeletonData.transformConstraints[input.readInt(true)]);
- for (let i = 0, n = input.readInt(true); i < n; i++)
- skin.constraints.push(skeletonData.pathConstraints[input.readInt(true)]);
- slotCount = input.readInt(true);
- }
- for (let i = 0; i < slotCount; i++) {
- let slotIndex = input.readInt(true);
- for (let ii = 0, nn = input.readInt(true); ii < nn; ii++) {
- let name = input.readStringRef();
- let attachment = this.readAttachment(input, skeletonData, skin, slotIndex, name, nonessential);
- if (attachment != null) skin.setAttachment(slotIndex, name, attachment);
- }
- }
- return skin;
- }
- readAttachment(input, skeletonData, skin, slotIndex, attachmentName, nonessential) {
- let scale = this.scale;
- let name = input.readStringRef();
- if (name == null) name = attachmentName;
- let typeIndex = input.readByte();
- let type = SkeletonBinary.AttachmentTypeValues[typeIndex];
- switch (type) {
- case exports.AttachmentType.Region: {
- let path = input.readStringRef();
- let rotation = input.readFloat();
- let x = input.readFloat();
- let y = input.readFloat();
- let scaleX = input.readFloat();
- let scaleY = input.readFloat();
- let width = input.readFloat();
- let height = input.readFloat();
- let color = input.readInt32();
- if (path == null) path = name;
- let region = this.attachmentLoader.newRegionAttachment(skin, name, path);
- if (region == null) return null;
- region.path = path;
- region.x = x * scale;
- region.y = y * scale;
- region.scaleX = scaleX;
- region.scaleY = scaleY;
- region.rotation = rotation;
- region.width = width * scale;
- region.height = height * scale;
- Color.rgba8888ToColor(region.color, color);
- // region.updateOffset();
- return region;
- }
- case exports.AttachmentType.BoundingBox: {
- let vertexCount = input.readInt(true);
- let vertices = this.readVertices(input, vertexCount);
- let color = nonessential ? input.readInt32() : 0;
- let box = this.attachmentLoader.newBoundingBoxAttachment(skin, name);
- if (box == null) return null;
- box.worldVerticesLength = vertexCount << 1;
- box.vertices = vertices.vertices;
- box.bones = vertices.bones;
- if (nonessential) Color.rgba8888ToColor(box.color, color);
- return box;
- }
- case exports.AttachmentType.Mesh: {
- let path = input.readStringRef();
- let color = input.readInt32();
- let vertexCount = input.readInt(true);
- let uvs = this.readFloatArray(input, vertexCount << 1, 1);
- let triangles = this.readShortArray(input);
- let vertices = this.readVertices(input, vertexCount);
- let hullLength = input.readInt(true);
- let edges = null;
- let width = 0, height = 0;
- if (nonessential) {
- edges = this.readShortArray(input);
- width = input.readFloat();
- height = input.readFloat();
- }
- if (path == null) path = name;
- let mesh = this.attachmentLoader.newMeshAttachment(skin, name, path);
- if (mesh == null) return null;
- mesh.path = path;
- Color.rgba8888ToColor(mesh.color, color);
- mesh.bones = vertices.bones;
- mesh.vertices = vertices.vertices;
- mesh.worldVerticesLength = vertexCount << 1;
- mesh.triangles = triangles;
- mesh.regionUVs = new Float32Array(uvs);
- // mesh.updateUVs();
- mesh.hullLength = hullLength << 1;
- if (nonessential) {
- mesh.edges = edges;
- mesh.width = width * scale;
- mesh.height = height * scale;
- }
- return mesh;
- }
- case exports.AttachmentType.LinkedMesh: {
- let path = input.readStringRef();
- let color = input.readInt32();
- let skinName = input.readStringRef();
- let parent = input.readStringRef();
- let inheritDeform = input.readBoolean();
- let width = 0, height = 0;
- if (nonessential) {
- width = input.readFloat();
- height = input.readFloat();
- }
- if (path == null) path = name;
- let mesh = this.attachmentLoader.newMeshAttachment(skin, name, path);
- if (mesh == null) return null;
- mesh.path = path;
- Color.rgba8888ToColor(mesh.color, color);
- if (nonessential) {
- mesh.width = width * scale;
- mesh.height = height * scale;
- }
- this.linkedMeshes.push(new LinkedMesh(mesh, skinName, slotIndex, parent, inheritDeform));
- return mesh;
- }
- case exports.AttachmentType.Path: {
- let closed = input.readBoolean();
- let constantSpeed = input.readBoolean();
- let vertexCount = input.readInt(true);
- let vertices = this.readVertices(input, vertexCount);
- let lengths = Utils.newArray(vertexCount / 3, 0);
- for (let i = 0, n = lengths.length; i < n; i++)
- lengths[i] = input.readFloat() * scale;
- let color = nonessential ? input.readInt32() : 0;
- let path = this.attachmentLoader.newPathAttachment(skin, name);
- if (path == null) return null;
- path.closed = closed;
- path.constantSpeed = constantSpeed;
- path.worldVerticesLength = vertexCount << 1;
- path.vertices = vertices.vertices;
- path.bones = vertices.bones;
- path.lengths = lengths;
- if (nonessential) Color.rgba8888ToColor(path.color, color);
- return path;
- }
- case exports.AttachmentType.Point: {
- let rotation = input.readFloat();
- let x = input.readFloat();
- let y = input.readFloat();
- let color = nonessential ? input.readInt32() : 0;
- let point = this.attachmentLoader.newPointAttachment(skin, name);
- if (point == null) return null;
- point.x = x * scale;
- point.y = y * scale;
- point.rotation = rotation;
- if (nonessential) Color.rgba8888ToColor(point.color, color);
- return point;
- }
- case exports.AttachmentType.Clipping: {
- let endSlotIndex = input.readInt(true);
- let vertexCount = input.readInt(true);
- let vertices = this.readVertices(input, vertexCount);
- let color = nonessential ? input.readInt32() : 0;
- let clip = this.attachmentLoader.newClippingAttachment(skin, name);
- if (clip == null) return null;
- clip.endSlot = skeletonData.slots[endSlotIndex];
- clip.worldVerticesLength = vertexCount << 1;
- clip.vertices = vertices.vertices;
- clip.bones = vertices.bones;
- if (nonessential) Color.rgba8888ToColor(clip.color, color);
- return clip;
- }
- }
- return null;
- }
- readVertices (input, vertexCount) {
- let verticesLength = vertexCount << 1;
- let vertices = new Vertices();
- let scale = this.scale;
- if (!input.readBoolean()) {
- vertices.vertices = this.readFloatArray(input, verticesLength, scale);
- return vertices;
- }
- let weights = new Array();
- let bonesArray = new Array();
- for (let i = 0; i < vertexCount; i++) {
- let boneCount = input.readInt(true);
- bonesArray.push(boneCount);
- for (let ii = 0; ii < boneCount; ii++) {
- bonesArray.push(input.readInt(true));
- weights.push(input.readFloat() * scale);
- weights.push(input.readFloat() * scale);
- weights.push(input.readFloat());
- }
- }
- vertices.vertices = Utils.toFloatArray(weights);
- vertices.bones = bonesArray;
- return vertices;
- }
- readFloatArray (input, n, scale) {
- let array = new Array(n);
- if (scale == 1) {
- for (let i = 0; i < n; i++)
- array[i] = input.readFloat();
- } else {
- for (let i = 0; i < n; i++)
- array[i] = input.readFloat() * scale;
- }
- return array;
- }
- readShortArray (input) {
- let n = input.readInt(true);
- let array = new Array(n);
- for (let i = 0; i < n; i++)
- array[i] = input.readShort();
- return array;
- }
- readAnimation (input, name, skeletonData) {
- let timelines = new Array();
- let scale = this.scale;
- let duration = 0;
- let tempColor1 = new Color();
- let tempColor2 = new Color();
- // Slot timelines.
- for (let i = 0, n = input.readInt(true); i < n; i++) {
- let slotIndex = input.readInt(true);
- for (let ii = 0, nn = input.readInt(true); ii < nn; ii++) {
- let timelineType = input.readByte();
- let frameCount = input.readInt(true);
- switch (timelineType) {
- case SkeletonBinary.SLOT_ATTACHMENT: {
- let timeline = new AttachmentTimeline(frameCount);
- timeline.slotIndex = slotIndex;
- for (let frameIndex = 0; frameIndex < frameCount; frameIndex++)
- timeline.setFrame(frameIndex, input.readFloat(), input.readStringRef());
- timelines.push(timeline);
- duration = Math.max(duration, timeline.frames[frameCount - 1]);
- break;
- }
- case SkeletonBinary.SLOT_COLOR: {
- let timeline = new ColorTimeline(frameCount);
- timeline.slotIndex = slotIndex;
- for (let frameIndex = 0; frameIndex < frameCount; frameIndex++) {
- let time = input.readFloat();
- Color.rgba8888ToColor(tempColor1, input.readInt32());
- timeline.setFrame(frameIndex, time, tempColor1.r, tempColor1.g, tempColor1.b, tempColor1.a);
- if (frameIndex < frameCount - 1) this.readCurve(input, frameIndex, timeline);
- }
- timelines.push(timeline);
- duration = Math.max(duration, timeline.frames[(frameCount - 1) * ColorTimeline.ENTRIES]);
- break;
- }
- case SkeletonBinary.SLOT_TWO_COLOR: {
- let timeline = new TwoColorTimeline(frameCount);
- timeline.slotIndex = slotIndex;
- for (let frameIndex = 0; frameIndex < frameCount; frameIndex++) {
- let time = input.readFloat();
- Color.rgba8888ToColor(tempColor1, input.readInt32());
- Color.rgb888ToColor(tempColor2, input.readInt32());
- timeline.setFrame(frameIndex, time, tempColor1.r, tempColor1.g, tempColor1.b, tempColor1.a, tempColor2.r,
- tempColor2.g, tempColor2.b);
- if (frameIndex < frameCount - 1) this.readCurve(input, frameIndex, timeline);
- }
- timelines.push(timeline);
- duration = Math.max(duration, timeline.frames[(frameCount - 1) * TwoColorTimeline.ENTRIES]);
- break;
- }
- }
- }
- }
- // Bone timelines.
- for (let i = 0, n = input.readInt(true); i < n; i++) {
- let boneIndex = input.readInt(true);
- for (let ii = 0, nn = input.readInt(true); ii < nn; ii++) {
- let timelineType = input.readByte();
- let frameCount = input.readInt(true);
- switch (timelineType) {
- case SkeletonBinary.BONE_ROTATE: {
- let timeline = new RotateTimeline(frameCount);
- timeline.boneIndex = boneIndex;
- for (let frameIndex = 0; frameIndex < frameCount; frameIndex++) {
- timeline.setFrame(frameIndex, input.readFloat(), input.readFloat());
- if (frameIndex < frameCount - 1) this.readCurve(input, frameIndex, timeline);
- }
- timelines.push(timeline);
- duration = Math.max(duration, timeline.frames[(frameCount - 1) * RotateTimeline.ENTRIES]);
- break;
- }
- case SkeletonBinary.BONE_TRANSLATE:
- case SkeletonBinary.BONE_SCALE:
- case SkeletonBinary.BONE_SHEAR: {
- let timeline;
- let timelineScale = 1;
- if (timelineType == SkeletonBinary.BONE_SCALE)
- timeline = new ScaleTimeline(frameCount);
- else if (timelineType == SkeletonBinary.BONE_SHEAR)
- timeline = new ShearTimeline(frameCount);
- else {
- timeline = new TranslateTimeline(frameCount);
- timelineScale = scale;
- }
- timeline.boneIndex = boneIndex;
- for (let frameIndex = 0; frameIndex < frameCount; frameIndex++) {
- timeline.setFrame(frameIndex, input.readFloat(), input.readFloat() * timelineScale,
- input.readFloat() * timelineScale);
- if (frameIndex < frameCount - 1) this.readCurve(input, frameIndex, timeline);
- }
- timelines.push(timeline);
- duration = Math.max(duration, timeline.frames[(frameCount - 1) * TranslateTimeline.ENTRIES]);
- break;
- }
- }
- }
- }
- // IK constraint timelines.
- for (let i = 0, n = input.readInt(true); i < n; i++) {
- let index = input.readInt(true);
- let frameCount = input.readInt(true);
- let timeline = new IkConstraintTimeline(frameCount);
- timeline.ikConstraintIndex = index;
- for (let frameIndex = 0; frameIndex < frameCount; frameIndex++) {
- timeline.setFrame(frameIndex, input.readFloat(), input.readFloat(), input.readFloat() * scale, input.readByte(), input.readBoolean(),
- input.readBoolean());
- if (frameIndex < frameCount - 1) this.readCurve(input, frameIndex, timeline);
- }
- timelines.push(timeline);
- duration = Math.max(duration, timeline.frames[(frameCount - 1) * IkConstraintTimeline.ENTRIES]);
- }
- // Transform constraint timelines.
- for (let i = 0, n = input.readInt(true); i < n; i++) {
- let index = input.readInt(true);
- let frameCount = input.readInt(true);
- let timeline = new TransformConstraintTimeline(frameCount);
- timeline.transformConstraintIndex = index;
- for (let frameIndex = 0; frameIndex < frameCount; frameIndex++) {
- timeline.setFrame(frameIndex, input.readFloat(), input.readFloat(), input.readFloat(), input.readFloat(),
- input.readFloat());
- if (frameIndex < frameCount - 1) this.readCurve(input, frameIndex, timeline);
- }
- timelines.push(timeline);
- duration = Math.max(duration, timeline.frames[(frameCount - 1) * TransformConstraintTimeline.ENTRIES]);
- }
- // Path constraint timelines.
- for (let i = 0, n = input.readInt(true); i < n; i++) {
- let index = input.readInt(true);
- let data = skeletonData.pathConstraints[index];
- for (let ii = 0, nn = input.readInt(true); ii < nn; ii++) {
- let timelineType = input.readByte();
- let frameCount = input.readInt(true);
- switch (timelineType) {
- case SkeletonBinary.PATH_POSITION:
- case SkeletonBinary.PATH_SPACING: {
- let timeline;
- let timelineScale = 1;
- if (timelineType == SkeletonBinary.PATH_SPACING) {
- timeline = new PathConstraintSpacingTimeline(frameCount);
- if (data.spacingMode == SpacingMode.Length || data.spacingMode == SpacingMode.Fixed) timelineScale = scale;
- } else {
- timeline = new PathConstraintPositionTimeline(frameCount);
- if (data.positionMode == PositionMode.Fixed) timelineScale = scale;
- }
- timeline.pathConstraintIndex = index;
- for (let frameIndex = 0; frameIndex < frameCount; frameIndex++) {
- timeline.setFrame(frameIndex, input.readFloat(), input.readFloat() * timelineScale);
- if (frameIndex < frameCount - 1) this.readCurve(input, frameIndex, timeline);
- }
- timelines.push(timeline);
- duration = Math.max(duration, timeline.frames[(frameCount - 1) * PathConstraintPositionTimeline.ENTRIES]);
- break;
- }
- case SkeletonBinary.PATH_MIX: {
- let timeline = new PathConstraintMixTimeline(frameCount);
- timeline.pathConstraintIndex = index;
- for (let frameIndex = 0; frameIndex < frameCount; frameIndex++) {
- timeline.setFrame(frameIndex, input.readFloat(), input.readFloat(), input.readFloat());
- if (frameIndex < frameCount - 1) this.readCurve(input, frameIndex, timeline);
- }
- timelines.push(timeline);
- duration = Math.max(duration, timeline.frames[(frameCount - 1) * PathConstraintMixTimeline.ENTRIES]);
- break;
- }
- }
- }
- }
- // Deform timelines.
- for (let i = 0, n = input.readInt(true); i < n; i++) {
- let skin = skeletonData.skins[input.readInt(true)];
- for (let ii = 0, nn = input.readInt(true); ii < nn; ii++) {
- let slotIndex = input.readInt(true);
- for (let iii = 0, nnn = input.readInt(true); iii < nnn; iii++) {
- let attachment = skin.getAttachment(slotIndex, input.readStringRef()) ;
- let weighted = attachment.bones != null;
- let vertices = attachment.vertices;
- let deformLength = weighted ? vertices.length / 3 * 2 : vertices.length;
- let frameCount = input.readInt(true);
- let timeline = new DeformTimeline(frameCount);
- timeline.slotIndex = slotIndex;
- timeline.attachment = attachment;
- for (let frameIndex = 0; frameIndex < frameCount; frameIndex++) {
- let time = input.readFloat();
- let deform;
- let end = input.readInt(true);
- if (end == 0)
- deform = weighted ? Utils.newFloatArray(deformLength) : vertices;
- else {
- deform = Utils.newFloatArray(deformLength);
- let start = input.readInt(true);
- end += start;
- if (scale == 1) {
- for (let v = start; v < end; v++)
- deform[v] = input.readFloat();
- } else {
- for (let v = start; v < end; v++)
- deform[v] = input.readFloat() * scale;
- }
- if (!weighted) {
- for (let v = 0, vn = deform.length; v < vn; v++)
- deform[v] += vertices[v];
- }
- }
- timeline.setFrame(frameIndex, time, deform);
- if (frameIndex < frameCount - 1) this.readCurve(input, frameIndex, timeline);
- }
- timelines.push(timeline);
- duration = Math.max(duration, timeline.frames[frameCount - 1]);
- }
- }
- }
- // Draw order timeline.
- let drawOrderCount = input.readInt(true);
- if (drawOrderCount > 0) {
- let timeline = new DrawOrderTimeline(drawOrderCount);
- let slotCount = skeletonData.slots.length;
- for (let i = 0; i < drawOrderCount; i++) {
- let time = input.readFloat();
- let offsetCount = input.readInt(true);
- let drawOrder = Utils.newArray(slotCount, 0);
- for (let ii = slotCount - 1; ii >= 0; ii--)
- drawOrder[ii] = -1;
- let unchanged = Utils.newArray(slotCount - offsetCount, 0);
- let originalIndex = 0, unchangedIndex = 0;
- for (let ii = 0; ii < offsetCount; ii++) {
- let slotIndex = input.readInt(true);
- // Collect unchanged items.
- while (originalIndex != slotIndex)
- unchanged[unchangedIndex++] = originalIndex++;
- // Set changed items.
- drawOrder[originalIndex + input.readInt(true)] = originalIndex++;
- }
- // Collect remaining unchanged items.
- while (originalIndex < slotCount)
- unchanged[unchangedIndex++] = originalIndex++;
- // Fill in unchanged items.
- for (let ii = slotCount - 1; ii >= 0; ii--)
- if (drawOrder[ii] == -1) drawOrder[ii] = unchanged[--unchangedIndex];
- timeline.setFrame(i, time, drawOrder);
- }
- timelines.push(timeline);
- duration = Math.max(duration, timeline.frames[drawOrderCount - 1]);
- }
- // Event timeline.
- let eventCount = input.readInt(true);
- if (eventCount > 0) {
- let timeline = new EventTimeline(eventCount);
- for (let i = 0; i < eventCount; i++) {
- let time = input.readFloat();
- let eventData = skeletonData.events[input.readInt(true)];
- let event = new Event(time, eventData);
- event.intValue = input.readInt(false);
- event.floatValue = input.readFloat();
- event.stringValue = input.readBoolean() ? input.readString() : eventData.stringValue;
- if (event.data.audioPath != null) {
- event.volume = input.readFloat();
- event.balance = input.readFloat();
- }
- timeline.setFrame(i, event);
- }
- timelines.push(timeline);
- duration = Math.max(duration, timeline.frames[eventCount - 1]);
- }
- return new Animation(name, timelines, duration);
- }
- readCurve (input, frameIndex, timeline) {
- switch (input.readByte()) {
- case SkeletonBinary.CURVE_STEPPED:
- timeline.setStepped(frameIndex);
- break;
- case SkeletonBinary.CURVE_BEZIER:
- this.setCurve(timeline, frameIndex, input.readFloat(), input.readFloat(), input.readFloat(), input.readFloat());
- break;
- }
- }
- setCurve (timeline, frameIndex, cx1, cy1, cx2, cy2) {
- timeline.setCurve(frameIndex, cx1, cy1, cx2, cy2);
- }
- } SkeletonBinary.__initStatic(); SkeletonBinary.__initStatic2(); SkeletonBinary.__initStatic3(); SkeletonBinary.__initStatic4(); SkeletonBinary.__initStatic5(); SkeletonBinary.__initStatic6(); SkeletonBinary.__initStatic7(); SkeletonBinary.__initStatic8(); SkeletonBinary.__initStatic9(); SkeletonBinary.__initStatic10(); SkeletonBinary.__initStatic11(); SkeletonBinary.__initStatic12(); SkeletonBinary.__initStatic13(); SkeletonBinary.__initStatic14(); SkeletonBinary.__initStatic15(); SkeletonBinary.__initStatic16(); SkeletonBinary.__initStatic17(); SkeletonBinary.__initStatic18(); SkeletonBinary.__initStatic19();
- class LinkedMesh {
-
-
-
-
- constructor (mesh, skin, slotIndex, parent, inheritDeform) {
- this.mesh = mesh;
- this.skin = skin;
- this.slotIndex = slotIndex;
- this.parent = parent;
- this.inheritDeform = inheritDeform;
- }
- }
- class Vertices {
- constructor( bones = null, vertices = null) {this.bones = bones;this.vertices = vertices; }
- }
- /**
- * @public
- */
- class SkeletonBounds {constructor() { SkeletonBounds.prototype.__init.call(this);SkeletonBounds.prototype.__init2.call(this);SkeletonBounds.prototype.__init3.call(this);SkeletonBounds.prototype.__init4.call(this);SkeletonBounds.prototype.__init5.call(this);SkeletonBounds.prototype.__init6.call(this);SkeletonBounds.prototype.__init7.call(this); }
- __init() {this.minX = 0;} __init2() {this.minY = 0;} __init3() {this.maxX = 0;} __init4() {this.maxY = 0;}
- __init5() {this.boundingBoxes = new Array();}
- __init6() {this.polygons = new Array();}
- __init7() {this.polygonPool = new Pool(() => {
- return Utils.newFloatArray(16);
- });}
- update (skeleton, updateAabb) {
- if (skeleton == null) throw new Error("skeleton cannot be null.");
- let boundingBoxes = this.boundingBoxes;
- let polygons = this.polygons;
- let polygonPool = this.polygonPool;
- let slots = skeleton.slots;
- let slotCount = slots.length;
- boundingBoxes.length = 0;
- polygonPool.freeAll(polygons);
- polygons.length = 0;
- for (let i = 0; i < slotCount; i++) {
- let slot = slots[i];
- if (!slot.bone.active) continue;
- let attachment = slot.getAttachment();
- if (attachment instanceof BoundingBoxAttachment) {
- let boundingBox = attachment ;
- boundingBoxes.push(boundingBox);
- let polygon = polygonPool.obtain();
- if (polygon.length != boundingBox.worldVerticesLength) {
- polygon = Utils.newFloatArray(boundingBox.worldVerticesLength);
- }
- polygons.push(polygon);
- boundingBox.computeWorldVertices(slot, 0, boundingBox.worldVerticesLength, polygon, 0, 2);
- }
- }
- if (updateAabb) {
- this.aabbCompute();
- } else {
- this.minX = Number.POSITIVE_INFINITY;
- this.minY = Number.POSITIVE_INFINITY;
- this.maxX = Number.NEGATIVE_INFINITY;
- this.maxY = Number.NEGATIVE_INFINITY;
- }
- }
- aabbCompute () {
- let minX = Number.POSITIVE_INFINITY, minY = Number.POSITIVE_INFINITY, maxX = Number.NEGATIVE_INFINITY, maxY = Number.NEGATIVE_INFINITY;
- let polygons = this.polygons;
- for (let i = 0, n = polygons.length; i < n; i++) {
- let polygon = polygons[i];
- let vertices = polygon;
- for (let ii = 0, nn = polygon.length; ii < nn; ii += 2) {
- let x = vertices[ii];
- let y = vertices[ii + 1];
- minX = Math.min(minX, x);
- minY = Math.min(minY, y);
- maxX = Math.max(maxX, x);
- maxY = Math.max(maxY, y);
- }
- }
- this.minX = minX;
- this.minY = minY;
- this.maxX = maxX;
- this.maxY = maxY;
- }
- /** Returns true if the axis aligned bounding box contains the point. */
- aabbContainsPoint (x, y) {
- return x >= this.minX && x <= this.maxX && y >= this.minY && y <= this.maxY;
- }
- /** Returns true if the axis aligned bounding box intersects the line segment. */
- aabbIntersectsSegment (x1, y1, x2, y2) {
- let minX = this.minX;
- let minY = this.minY;
- let maxX = this.maxX;
- let maxY = this.maxY;
- if ((x1 <= minX && x2 <= minX) || (y1 <= minY && y2 <= minY) || (x1 >= maxX && x2 >= maxX) || (y1 >= maxY && y2 >= maxY))
- return false;
- let m = (y2 - y1) / (x2 - x1);
- let y = m * (minX - x1) + y1;
- if (y > minY && y < maxY) return true;
- y = m * (maxX - x1) + y1;
- if (y > minY && y < maxY) return true;
- let x = (minY - y1) / m + x1;
- if (x > minX && x < maxX) return true;
- x = (maxY - y1) / m + x1;
- if (x > minX && x < maxX) return true;
- return false;
- }
- /** Returns true if the axis aligned bounding box intersects the axis aligned bounding box of the specified bounds. */
- aabbIntersectsSkeleton (bounds) {
- return this.minX < bounds.maxX && this.maxX > bounds.minX && this.minY < bounds.maxY && this.maxY > bounds.minY;
- }
- /** Returns the first bounding box attachment that contains the point, or null. When doing many checks, it is usually more
- * efficient to only call this method if {@link #aabbContainsPoint(float, float)} returns true. */
- containsPoint (x, y) {
- let polygons = this.polygons;
- for (let i = 0, n = polygons.length; i < n; i++)
- if (this.containsPointPolygon(polygons[i], x, y)) return this.boundingBoxes[i];
- return null;
- }
- /** Returns true if the polygon contains the point. */
- containsPointPolygon (polygon, x, y) {
- let vertices = polygon;
- let nn = polygon.length;
- let prevIndex = nn - 2;
- let inside = false;
- for (let ii = 0; ii < nn; ii += 2) {
- let vertexY = vertices[ii + 1];
- let prevY = vertices[prevIndex + 1];
- if ((vertexY < y && prevY >= y) || (prevY < y && vertexY >= y)) {
- let vertexX = vertices[ii];
- if (vertexX + (y - vertexY) / (prevY - vertexY) * (vertices[prevIndex] - vertexX) < x) inside = !inside;
- }
- prevIndex = ii;
- }
- return inside;
- }
- /** Returns the first bounding box attachment that contains any part of the line segment, or null. When doing many checks, it
- * is usually more efficient to only call this method if {@link #aabbIntersectsSegment(float, float, float, float)} returns
- * true. */
- intersectsSegment (x1, y1, x2, y2) {
- let polygons = this.polygons;
- for (let i = 0, n = polygons.length; i < n; i++)
- if (this.intersectsSegmentPolygon(polygons[i], x1, y1, x2, y2)) return this.boundingBoxes[i];
- return null;
- }
- /** Returns true if the polygon contains any part of the line segment. */
- intersectsSegmentPolygon (polygon, x1, y1, x2, y2) {
- let vertices = polygon;
- let nn = polygon.length;
- let width12 = x1 - x2, height12 = y1 - y2;
- let det1 = x1 * y2 - y1 * x2;
- let x3 = vertices[nn - 2], y3 = vertices[nn - 1];
- for (let ii = 0; ii < nn; ii += 2) {
- let x4 = vertices[ii], y4 = vertices[ii + 1];
- let det2 = x3 * y4 - y3 * x4;
- let width34 = x3 - x4, height34 = y3 - y4;
- let det3 = width12 * height34 - height12 * width34;
- let x = (det1 * width34 - width12 * det2) / det3;
- if (((x >= x3 && x <= x4) || (x >= x4 && x <= x3)) && ((x >= x1 && x <= x2) || (x >= x2 && x <= x1))) {
- let y = (det1 * height34 - height12 * det2) / det3;
- if (((y >= y3 && y <= y4) || (y >= y4 && y <= y3)) && ((y >= y1 && y <= y2) || (y >= y2 && y <= y1))) return true;
- }
- x3 = x4;
- y3 = y4;
- }
- return false;
- }
- /** Returns the polygon for the specified bounding box, or null. */
- getPolygon (boundingBox) {
- if (boundingBox == null) throw new Error("boundingBox cannot be null.");
- let index = this.boundingBoxes.indexOf(boundingBox);
- return index == -1 ? null : this.polygons[index];
- }
- getWidth () {
- return this.maxX - this.minX;
- }
- getHeight () {
- return this.maxY - this.minY;
- }
- }
- /**
- * @public
- */
- class SkeletonJson {
-
- __init() {this.scale = 1;}
- __init2() {this.linkedMeshes = new Array();}
- constructor (attachmentLoader) {SkeletonJson.prototype.__init.call(this);SkeletonJson.prototype.__init2.call(this);
- this.attachmentLoader = attachmentLoader;
- }
- readSkeletonData (json) {
- let scale = this.scale;
- let skeletonData = new SkeletonData();
- let root = typeof(json) === "string" ? JSON.parse(json) : json;
- // Skeleton
- let skeletonMap = root.skeleton;
- if (skeletonMap != null) {
- skeletonData.hash = skeletonMap.hash;
- skeletonData.version = skeletonMap.spine;
- if (skeletonData.version.substr(0, 3) !== '3.8') {
- let error = `Spine 3.8 loader cant load version ${skeletonMap.spine}. Please configure your pixi-spine bundle`;
- console.error(error);
- }
- if (skeletonData.version === '3.8.75')
- {
- let error = `Unsupported skeleton data, 3.8.75 is deprecated, please export with a newer version of Spine.`;
- console.error(error);
- }
- skeletonData.x = skeletonMap.x;
- skeletonData.y = skeletonMap.y;
- skeletonData.width = skeletonMap.width;
- skeletonData.height = skeletonMap.height;
- skeletonData.fps = skeletonMap.fps;
- skeletonData.imagesPath = skeletonMap.images;
- }
- // Bones
- if (root.bones) {
- for (let i = 0; i < root.bones.length; i++) {
- let boneMap = root.bones[i];
- let parent = null;
- let parentName = this.getValue(boneMap, "parent", null);
- if (parentName != null) {
- parent = skeletonData.findBone(parentName);
- if (parent == null) throw new Error("Parent bone not found: " + parentName);
- }
- let data = new BoneData(skeletonData.bones.length, boneMap.name, parent);
- data.length = this.getValue(boneMap, "length", 0) * scale;
- data.x = this.getValue(boneMap, "x", 0) * scale;
- data.y = this.getValue(boneMap, "y", 0) * scale;
- data.rotation = this.getValue(boneMap, "rotation", 0);
- data.scaleX = this.getValue(boneMap, "scaleX", 1);
- data.scaleY = this.getValue(boneMap, "scaleY", 1);
- data.shearX = this.getValue(boneMap, "shearX", 0);
- data.shearY = this.getValue(boneMap, "shearY", 0);
- data.transformMode = SkeletonJson.transformModeFromString(this.getValue(boneMap, "transform", "normal"));
- data.skinRequired = this.getValue(boneMap, "skin", false);
- skeletonData.bones.push(data);
- }
- }
- // Slots.
- if (root.slots) {
- for (let i = 0; i < root.slots.length; i++) {
- let slotMap = root.slots[i];
- let slotName = slotMap.name;
- let boneName = slotMap.bone;
- let boneData = skeletonData.findBone(boneName);
- if (boneData == null) throw new Error("Slot bone not found: " + boneName);
- let data = new SlotData(skeletonData.slots.length, slotName, boneData);
- let color = this.getValue(slotMap, "color", null);
- if (color != null) data.color.setFromString(color);
- let dark = this.getValue(slotMap, "dark", null);
- if (dark != null) {
- data.darkColor = new Color(1, 1, 1, 1);
- data.darkColor.setFromString(dark);
- }
- data.attachmentName = this.getValue(slotMap, "attachment", null);
- data.blendMode = SkeletonJson.blendModeFromString(this.getValue(slotMap, "blend", "normal"));
- skeletonData.slots.push(data);
- }
- }
- // IK constraints
- if (root.ik) {
- for (let i = 0; i < root.ik.length; i++) {
- let constraintMap = root.ik[i];
- let data = new IkConstraintData(constraintMap.name);
- data.order = this.getValue(constraintMap, "order", 0);
- data.skinRequired = this.getValue(constraintMap, "skin", false);
- for (let j = 0; j < constraintMap.bones.length; j++) {
- let boneName = constraintMap.bones[j];
- let bone = skeletonData.findBone(boneName);
- if (bone == null) throw new Error("IK bone not found: " + boneName);
- data.bones.push(bone);
- }
- let targetName = constraintMap.target;
- data.target = skeletonData.findBone(targetName);
- if (data.target == null) throw new Error("IK target bone not found: " + targetName);
- data.mix = this.getValue(constraintMap, "mix", 1);
- data.softness = this.getValue(constraintMap, "softness", 0) * scale;
- data.bendDirection = this.getValue(constraintMap, "bendPositive", true) ? 1 : -1;
- data.compress = this.getValue(constraintMap, "compress", false);
- data.stretch = this.getValue(constraintMap, "stretch", false);
- data.uniform = this.getValue(constraintMap, "uniform", false);
- skeletonData.ikConstraints.push(data);
- }
- }
- // Transform constraints.
- if (root.transform) {
- for (let i = 0; i < root.transform.length; i++) {
- let constraintMap = root.transform[i];
- let data = new TransformConstraintData(constraintMap.name);
- data.order = this.getValue(constraintMap, "order", 0);
- data.skinRequired = this.getValue(constraintMap, "skin", false);
- for (let j = 0; j < constraintMap.bones.length; j++) {
- let boneName = constraintMap.bones[j];
- let bone = skeletonData.findBone(boneName);
- if (bone == null) throw new Error("Transform constraint bone not found: " + boneName);
- data.bones.push(bone);
- }
- let targetName = constraintMap.target;
- data.target = skeletonData.findBone(targetName);
- if (data.target == null) throw new Error("Transform constraint target bone not found: " + targetName);
- data.local = this.getValue(constraintMap, "local", false);
- data.relative = this.getValue(constraintMap, "relative", false);
- data.offsetRotation = this.getValue(constraintMap, "rotation", 0);
- data.offsetX = this.getValue(constraintMap, "x", 0) * scale;
- data.offsetY = this.getValue(constraintMap, "y", 0) * scale;
- data.offsetScaleX = this.getValue(constraintMap, "scaleX", 0);
- data.offsetScaleY = this.getValue(constraintMap, "scaleY", 0);
- data.offsetShearY = this.getValue(constraintMap, "shearY", 0);
- data.rotateMix = this.getValue(constraintMap, "rotateMix", 1);
- data.translateMix = this.getValue(constraintMap, "translateMix", 1);
- data.scaleMix = this.getValue(constraintMap, "scaleMix", 1);
- data.shearMix = this.getValue(constraintMap, "shearMix", 1);
- skeletonData.transformConstraints.push(data);
- }
- }
- // Path constraints.
- if (root.path) {
- for (let i = 0; i < root.path.length; i++) {
- let constraintMap = root.path[i];
- let data = new PathConstraintData(constraintMap.name);
- data.order = this.getValue(constraintMap, "order", 0);
- data.skinRequired = this.getValue(constraintMap, "skin", false);
- for (let j = 0; j < constraintMap.bones.length; j++) {
- let boneName = constraintMap.bones[j];
- let bone = skeletonData.findBone(boneName);
- if (bone == null) throw new Error("Transform constraint bone not found: " + boneName);
- data.bones.push(bone);
- }
- let targetName = constraintMap.target;
- data.target = skeletonData.findSlot(targetName);
- if (data.target == null) throw new Error("Path target slot not found: " + targetName);
- data.positionMode = SkeletonJson.positionModeFromString(this.getValue(constraintMap, "positionMode", "percent"));
- data.spacingMode = SkeletonJson.spacingModeFromString(this.getValue(constraintMap, "spacingMode", "length"));
- data.rotateMode = SkeletonJson.rotateModeFromString(this.getValue(constraintMap, "rotateMode", "tangent"));
- data.offsetRotation = this.getValue(constraintMap, "rotation", 0);
- data.position = this.getValue(constraintMap, "position", 0);
- if (data.positionMode == PositionMode.Fixed) data.position *= scale;
- data.spacing = this.getValue(constraintMap, "spacing", 0);
- if (data.spacingMode == SpacingMode.Length || data.spacingMode == SpacingMode.Fixed) data.spacing *= scale;
- data.rotateMix = this.getValue(constraintMap, "rotateMix", 1);
- data.translateMix = this.getValue(constraintMap, "translateMix", 1);
- skeletonData.pathConstraints.push(data);
- }
- }
- // Skins.
- if (root.skins) {
- for (let i = 0; i < root.skins.length; i++) {
- let skinMap = root.skins[i];
- let skin = new Skin(skinMap.name);
- if (skinMap.bones) {
- for (let ii = 0; ii < skinMap.bones.length; ii++) {
- let bone = skeletonData.findBone(skinMap.bones[ii]);
- if (bone == null) throw new Error("Skin bone not found: " + skinMap.bones[i]);
- skin.bones.push(bone);
- }
- }
- if (skinMap.ik) {
- for (let ii = 0; ii < skinMap.ik.length; ii++) {
- let constraint = skeletonData.findIkConstraint(skinMap.ik[ii]);
- if (constraint == null) throw new Error("Skin IK constraint not found: " + skinMap.ik[i]);
- skin.constraints.push(constraint);
- }
- }
- if (skinMap.transform) {
- for (let ii = 0; ii < skinMap.transform.length; ii++) {
- let constraint = skeletonData.findTransformConstraint(skinMap.transform[ii]);
- if (constraint == null) throw new Error("Skin transform constraint not found: " + skinMap.transform[i]);
- skin.constraints.push(constraint);
- }
- }
- if (skinMap.path) {
- for (let ii = 0; ii < skinMap.path.length; ii++) {
- let constraint = skeletonData.findPathConstraint(skinMap.path[ii]);
- if (constraint == null) throw new Error("Skin path constraint not found: " + skinMap.path[i]);
- skin.constraints.push(constraint);
- }
- }
- for (let slotName in skinMap.attachments) {
- let slot = skeletonData.findSlot(slotName);
- if (slot == null) throw new Error("Slot not found: " + slotName);
- let slotMap = skinMap.attachments[slotName];
- for (let entryName in slotMap) {
- let attachment = this.readAttachment(slotMap[entryName], skin, slot.index, entryName, skeletonData);
- if (attachment != null) skin.setAttachment(slot.index, entryName, attachment);
- }
- }
- skeletonData.skins.push(skin);
- if (skin.name == "default") skeletonData.defaultSkin = skin;
- }
- }
- // Linked meshes.
- for (let i = 0, n = this.linkedMeshes.length; i < n; i++) {
- let linkedMesh = this.linkedMeshes[i];
- let skin = linkedMesh.skin == null ? skeletonData.defaultSkin : skeletonData.findSkin(linkedMesh.skin);
- if (skin == null) throw new Error("Skin not found: " + linkedMesh.skin);
- let parent = skin.getAttachment(linkedMesh.slotIndex, linkedMesh.parent);
- if (parent == null) throw new Error("Parent mesh not found: " + linkedMesh.parent);
- linkedMesh.mesh.deformAttachment = linkedMesh.inheritDeform ? parent : linkedMesh.mesh;
- linkedMesh.mesh.setParentMesh( parent);
- // linkedMesh.mesh.updateUVs();
- }
- this.linkedMeshes.length = 0;
- // Events.
- if (root.events) {
- for (let eventName in root.events) {
- let eventMap = root.events[eventName];
- let data = new EventData(eventName);
- data.intValue = this.getValue(eventMap, "int", 0);
- data.floatValue = this.getValue(eventMap, "float", 0);
- data.stringValue = this.getValue(eventMap, "string", "");
- data.audioPath = this.getValue(eventMap, "audio", null);
- if (data.audioPath != null) {
- data.volume = this.getValue(eventMap, "volume", 1);
- data.balance = this.getValue(eventMap, "balance", 0);
- }
- skeletonData.events.push(data);
- }
- }
- // Animations.
- if (root.animations) {
- for (let animationName in root.animations) {
- let animationMap = root.animations[animationName];
- this.readAnimation(animationMap, animationName, skeletonData);
- }
- }
- return skeletonData;
- }
- readAttachment (map, skin, slotIndex, name, skeletonData) {
- let scale = this.scale;
- name = this.getValue(map, "name", name);
- let type = this.getValue(map, "type", "region");
- switch (type) {
- case "region": {
- let path = this.getValue(map, "path", name);
- let region = this.attachmentLoader.newRegionAttachment(skin, name, path);
- if (region == null) return null;
- region.path = path;
- region.x = this.getValue(map, "x", 0) * scale;
- region.y = this.getValue(map, "y", 0) * scale;
- region.scaleX = this.getValue(map, "scaleX", 1);
- region.scaleY = this.getValue(map, "scaleY", 1);
- region.rotation = this.getValue(map, "rotation", 0);
- region.width = map.width * scale;
- region.height = map.height * scale;
- let color = this.getValue(map, "color", null);
- if (color != null) region.color.setFromString(color);
- // region.updateOffset();
- return region;
- }
- case "boundingbox": {
- let box = this.attachmentLoader.newBoundingBoxAttachment(skin, name);
- if (box == null) return null;
- this.readVertices(map, box, map.vertexCount << 1);
- let color = this.getValue(map, "color", null);
- if (color != null) box.color.setFromString(color);
- return box;
- }
- case "mesh":
- case "linkedmesh": {
- let path = this.getValue(map, "path", name);
- let mesh = this.attachmentLoader.newMeshAttachment(skin, name, path);
- if (mesh == null) return null;
- mesh.path = path;
- let color = this.getValue(map, "color", null);
- if (color != null) mesh.color.setFromString(color);
- mesh.width = this.getValue(map, "width", 0) * scale;
- mesh.height = this.getValue(map, "height", 0) * scale;
- let parent = this.getValue(map, "parent", null);
- if (parent != null) {
- this.linkedMeshes.push(new LinkedMesh$1(mesh, this.getValue(map, "skin", null), slotIndex, parent, this.getValue(map, "deform", true)));
- return mesh;
- }
- let uvs = map.uvs;
- this.readVertices(map, mesh, uvs.length);
- mesh.triangles = map.triangles;
- mesh.regionUVs = new Float32Array(uvs);
- // mesh.updateUVs();
- mesh.edges = this.getValue(map, "edges", null);
- mesh.hullLength = this.getValue(map, "hull", 0) * 2;
- return mesh;
- }
- case "path": {
- let path = this.attachmentLoader.newPathAttachment(skin, name);
- if (path == null) return null;
- path.closed = this.getValue(map, "closed", false);
- path.constantSpeed = this.getValue(map, "constantSpeed", true);
- let vertexCount = map.vertexCount;
- this.readVertices(map, path, vertexCount << 1);
- let lengths = Utils.newArray(vertexCount / 3, 0);
- for (let i = 0; i < map.lengths.length; i++)
- lengths[i] = map.lengths[i] * scale;
- path.lengths = lengths;
- let color = this.getValue(map, "color", null);
- if (color != null) path.color.setFromString(color);
- return path;
- }
- case "point": {
- let point = this.attachmentLoader.newPointAttachment(skin, name);
- if (point == null) return null;
- point.x = this.getValue(map, "x", 0) * scale;
- point.y = this.getValue(map, "y", 0) * scale;
- point.rotation = this.getValue(map, "rotation", 0);
- let color = this.getValue(map, "color", null);
- if (color != null) point.color.setFromString(color);
- return point;
- }
- case "clipping": {
- let clip = this.attachmentLoader.newClippingAttachment(skin, name);
- if (clip == null) return null;
- let end = this.getValue(map, "end", null);
- if (end != null) {
- let slot = skeletonData.findSlot(end);
- if (slot == null) throw new Error("Clipping end slot not found: " + end);
- clip.endSlot = slot;
- }
- let vertexCount = map.vertexCount;
- this.readVertices(map, clip, vertexCount << 1);
- let color = this.getValue(map, "color", null);
- if (color != null) clip.color.setFromString(color);
- return clip;
- }
- }
- return null;
- }
- readVertices (map, attachment, verticesLength) {
- let scale = this.scale;
- attachment.worldVerticesLength = verticesLength;
- let vertices = map.vertices;
- if (verticesLength == vertices.length) {
- let scaledVertices = Utils.toFloatArray(vertices);
- if (scale != 1) {
- for (let i = 0, n = vertices.length; i < n; i++)
- scaledVertices[i] *= scale;
- }
- attachment.vertices = scaledVertices;
- return;
- }
- let weights = new Array();
- let bones = new Array();
- for (let i = 0, n = vertices.length; i < n;) {
- let boneCount = vertices[i++];
- bones.push(boneCount);
- for (let nn = i + boneCount * 4; i < nn; i += 4) {
- bones.push(vertices[i]);
- weights.push(vertices[i + 1] * scale);
- weights.push(vertices[i + 2] * scale);
- weights.push(vertices[i + 3]);
- }
- }
- attachment.bones = bones;
- attachment.vertices = Utils.toFloatArray(weights);
- }
- readAnimation (map, name, skeletonData) {
- let scale = this.scale;
- let timelines = new Array();
- let duration = 0;
- // Slot timelines.
- if (map.slots) {
- for (let slotName in map.slots) {
- let slotMap = map.slots[slotName];
- let slotIndex = skeletonData.findSlotIndex(slotName);
- if (slotIndex == -1) throw new Error("Slot not found: " + slotName);
- for (let timelineName in slotMap) {
- let timelineMap = slotMap[timelineName];
- if (timelineName == "attachment") {
- let timeline = new AttachmentTimeline(timelineMap.length);
- timeline.slotIndex = slotIndex;
- let frameIndex = 0;
- for (let i = 0; i < timelineMap.length; i++) {
- let valueMap = timelineMap[i];
- timeline.setFrame(frameIndex++, this.getValue(valueMap, "time", 0), valueMap.name);
- }
- timelines.push(timeline);
- duration = Math.max(duration, timeline.frames[timeline.getFrameCount() - 1]);
- } else if (timelineName == "color") {
- let timeline = new ColorTimeline(timelineMap.length);
- timeline.slotIndex = slotIndex;
- let frameIndex = 0;
- for (let i = 0; i < timelineMap.length; i++) {
- let valueMap = timelineMap[i];
- let color = new Color();
- color.setFromString(valueMap.color || "ffffffff");
- timeline.setFrame(frameIndex, this.getValue(valueMap, "time", 0), color.r, color.g, color.b, color.a);
- this.readCurve(valueMap, timeline, frameIndex);
- frameIndex++;
- }
- timelines.push(timeline);
- duration = Math.max(duration, timeline.frames[(timeline.getFrameCount() - 1) * ColorTimeline.ENTRIES]);
- } else if (timelineName == "twoColor") {
- let timeline = new TwoColorTimeline(timelineMap.length);
- timeline.slotIndex = slotIndex;
- let frameIndex = 0;
- for (let i = 0; i < timelineMap.length; i++) {
- let valueMap = timelineMap[i];
- let light = new Color();
- let dark = new Color();
- light.setFromString(valueMap.light);
- dark.setFromString(valueMap.dark);
- timeline.setFrame(frameIndex, this.getValue(valueMap, "time", 0), light.r, light.g, light.b, light.a, dark.r, dark.g, dark.b);
- this.readCurve(valueMap, timeline, frameIndex);
- frameIndex++;
- }
- timelines.push(timeline);
- duration = Math.max(duration, timeline.frames[(timeline.getFrameCount() - 1) * TwoColorTimeline.ENTRIES]);
- } else
- throw new Error("Invalid timeline type for a slot: " + timelineName + " (" + slotName + ")");
- }
- }
- }
- // Bone timelines.
- if (map.bones) {
- for (let boneName in map.bones) {
- let boneMap = map.bones[boneName];
- let boneIndex = skeletonData.findBoneIndex(boneName);
- if (boneIndex == -1) throw new Error("Bone not found: " + boneName);
- for (let timelineName in boneMap) {
- let timelineMap = boneMap[timelineName];
- if (timelineName === "rotate") {
- let timeline = new RotateTimeline(timelineMap.length);
- timeline.boneIndex = boneIndex;
- let frameIndex = 0;
- for (let i = 0; i < timelineMap.length; i++) {
- let valueMap = timelineMap[i];
- timeline.setFrame(frameIndex, this.getValue(valueMap, "time", 0), this.getValue(valueMap, "angle", 0));
- this.readCurve(valueMap, timeline, frameIndex);
- frameIndex++;
- }
- timelines.push(timeline);
- duration = Math.max(duration, timeline.frames[(timeline.getFrameCount() - 1) * RotateTimeline.ENTRIES]);
- } else if (timelineName === "translate" || timelineName === "scale" || timelineName === "shear") {
- let timeline = null;
- let timelineScale = 1, defaultValue = 0;
- if (timelineName === "scale") {
- timeline = new ScaleTimeline(timelineMap.length);
- defaultValue = 1;
- } else if (timelineName === "shear")
- timeline = new ShearTimeline(timelineMap.length);
- else {
- timeline = new TranslateTimeline(timelineMap.length);
- timelineScale = scale;
- }
- timeline.boneIndex = boneIndex;
- let frameIndex = 0;
- for (let i = 0; i < timelineMap.length; i++) {
- let valueMap = timelineMap[i];
- let x = this.getValue(valueMap, "x", defaultValue), y = this.getValue(valueMap, "y", defaultValue);
- timeline.setFrame(frameIndex, this.getValue(valueMap, "time", 0), x * timelineScale, y * timelineScale);
- this.readCurve(valueMap, timeline, frameIndex);
- frameIndex++;
- }
- timelines.push(timeline);
- duration = Math.max(duration, timeline.frames[(timeline.getFrameCount() - 1) * TranslateTimeline.ENTRIES]);
- } else
- throw new Error("Invalid timeline type for a bone: " + timelineName + " (" + boneName + ")");
- }
- }
- }
- // IK constraint timelines.
- if (map.ik) {
- for (let constraintName in map.ik) {
- let constraintMap = map.ik[constraintName];
- let constraint = skeletonData.findIkConstraint(constraintName);
- let timeline = new IkConstraintTimeline(constraintMap.length);
- timeline.ikConstraintIndex = skeletonData.ikConstraints.indexOf(constraint);
- let frameIndex = 0;
- for (let i = 0; i < constraintMap.length; i++) {
- let valueMap = constraintMap[i];
- timeline.setFrame(frameIndex, this.getValue(valueMap, "time", 0), this.getValue(valueMap, "mix", 1), this.getValue(valueMap, "softness", 0) * scale,
- this.getValue(valueMap, "bendPositive", true) ? 1 : -1, this.getValue(valueMap, "compress", false), this.getValue(valueMap, "stretch", false));
- this.readCurve(valueMap, timeline, frameIndex);
- frameIndex++;
- }
- timelines.push(timeline);
- duration = Math.max(duration, timeline.frames[(timeline.getFrameCount() - 1) * IkConstraintTimeline.ENTRIES]);
- }
- }
- // Transform constraint timelines.
- if (map.transform) {
- for (let constraintName in map.transform) {
- let constraintMap = map.transform[constraintName];
- let constraint = skeletonData.findTransformConstraint(constraintName);
- let timeline = new TransformConstraintTimeline(constraintMap.length);
- timeline.transformConstraintIndex = skeletonData.transformConstraints.indexOf(constraint);
- let frameIndex = 0;
- for (let i = 0; i < constraintMap.length; i++) {
- let valueMap = constraintMap[i];
- timeline.setFrame(frameIndex, this.getValue(valueMap, "time", 0), this.getValue(valueMap, "rotateMix", 1),
- this.getValue(valueMap, "translateMix", 1), this.getValue(valueMap, "scaleMix", 1), this.getValue(valueMap, "shearMix", 1));
- this.readCurve(valueMap, timeline, frameIndex);
- frameIndex++;
- }
- timelines.push(timeline);
- duration = Math.max(duration,
- timeline.frames[(timeline.getFrameCount() - 1) * TransformConstraintTimeline.ENTRIES]);
- }
- }
- // Path constraint timelines.
- if (map.path) {
- for (let constraintName in map.path) {
- let constraintMap = map.path[constraintName];
- let index = skeletonData.findPathConstraintIndex(constraintName);
- if (index == -1) throw new Error("Path constraint not found: " + constraintName);
- let data = skeletonData.pathConstraints[index];
- for (let timelineName in constraintMap) {
- let timelineMap = constraintMap[timelineName];
- if (timelineName === "position" || timelineName === "spacing") {
- let timeline = null;
- let timelineScale = 1;
- if (timelineName === "spacing") {
- timeline = new PathConstraintSpacingTimeline(timelineMap.length);
- if (data.spacingMode == SpacingMode.Length || data.spacingMode == SpacingMode.Fixed) timelineScale = scale;
- } else {
- timeline = new PathConstraintPositionTimeline(timelineMap.length);
- if (data.positionMode == PositionMode.Fixed) timelineScale = scale;
- }
- timeline.pathConstraintIndex = index;
- let frameIndex = 0;
- for (let i = 0; i < timelineMap.length; i++) {
- let valueMap = timelineMap[i];
- timeline.setFrame(frameIndex, this.getValue(valueMap, "time", 0), this.getValue(valueMap, timelineName, 0) * timelineScale);
- this.readCurve(valueMap, timeline, frameIndex);
- frameIndex++;
- }
- timelines.push(timeline);
- duration = Math.max(duration,
- timeline.frames[(timeline.getFrameCount() - 1) * PathConstraintPositionTimeline.ENTRIES]);
- } else if (timelineName === "mix") {
- let timeline = new PathConstraintMixTimeline(timelineMap.length);
- timeline.pathConstraintIndex = index;
- let frameIndex = 0;
- for (let i = 0; i < timelineMap.length; i++) {
- let valueMap = timelineMap[i];
- timeline.setFrame(frameIndex, this.getValue(valueMap, "time", 0), this.getValue(valueMap, "rotateMix", 1),
- this.getValue(valueMap, "translateMix", 1));
- this.readCurve(valueMap, timeline, frameIndex);
- frameIndex++;
- }
- timelines.push(timeline);
- duration = Math.max(duration,
- timeline.frames[(timeline.getFrameCount() - 1) * PathConstraintMixTimeline.ENTRIES]);
- }
- }
- }
- }
- // Deform timelines.
- if (map.deform) {
- for (let deformName in map.deform) {
- let deformMap = map.deform[deformName];
- let skin = skeletonData.findSkin(deformName);
- if (skin == null) {
- if (settings.FAIL_ON_NON_EXISTING_SKIN) {
- throw new Error("Skin not found: " + deformName);
- } else {
- continue;
- }
- }
- for (let slotName in deformMap) {
- let slotMap = deformMap[slotName];
- let slotIndex = skeletonData.findSlotIndex(slotName);
- if (slotIndex == -1) throw new Error("Slot not found: " + slotMap.name);
- for (let timelineName in slotMap) {
- let timelineMap = slotMap[timelineName];
- let attachment = skin.getAttachment(slotIndex, timelineName);
- if (attachment == null) throw new Error("Deform attachment not found: " + timelineMap.name);
- let weighted = attachment.bones != null;
- let vertices = attachment.vertices;
- let deformLength = weighted ? vertices.length / 3 * 2 : vertices.length;
- let timeline = new DeformTimeline(timelineMap.length);
- timeline.slotIndex = slotIndex;
- timeline.attachment = attachment;
- let frameIndex = 0;
- for (let j = 0; j < timelineMap.length; j++) {
- let valueMap = timelineMap[j];
- let deform;
- let verticesValue = this.getValue(valueMap, "vertices", null);
- if (verticesValue == null)
- deform = weighted ? Utils.newFloatArray(deformLength) : vertices;
- else {
- deform = Utils.newFloatArray(deformLength);
- let start = this.getValue(valueMap, "offset", 0);
- Utils.arrayCopy(verticesValue, 0, deform, start, verticesValue.length);
- if (scale != 1) {
- for (let i = start, n = i + verticesValue.length; i < n; i++)
- deform[i] *= scale;
- }
- if (!weighted) {
- for (let i = 0; i < deformLength; i++)
- deform[i] += vertices[i];
- }
- }
- timeline.setFrame(frameIndex, this.getValue(valueMap, "time", 0), deform);
- this.readCurve(valueMap, timeline, frameIndex);
- frameIndex++;
- }
- timelines.push(timeline);
- duration = Math.max(duration, timeline.frames[timeline.getFrameCount() - 1]);
- }
- }
- }
- }
- // Draw order timeline.
- let drawOrderNode = map.drawOrder;
- if (drawOrderNode == null) drawOrderNode = map.draworder;
- if (drawOrderNode != null) {
- let timeline = new DrawOrderTimeline(drawOrderNode.length);
- let slotCount = skeletonData.slots.length;
- let frameIndex = 0;
- for (let j = 0; j < drawOrderNode.length; j++) {
- let drawOrderMap = drawOrderNode[j];
- let drawOrder = null;
- let offsets = this.getValue(drawOrderMap, "offsets", null);
- if (offsets != null) {
- drawOrder = Utils.newArray(slotCount, -1);
- let unchanged = Utils.newArray(slotCount - offsets.length, 0);
- let originalIndex = 0, unchangedIndex = 0;
- for (let i = 0; i < offsets.length; i++) {
- let offsetMap = offsets[i];
- let slotIndex = skeletonData.findSlotIndex(offsetMap.slot);
- if (slotIndex == -1) throw new Error("Slot not found: " + offsetMap.slot);
- // Collect unchanged items.
- while (originalIndex != slotIndex)
- unchanged[unchangedIndex++] = originalIndex++;
- // Set changed items.
- drawOrder[originalIndex + offsetMap.offset] = originalIndex++;
- }
- // Collect remaining unchanged items.
- while (originalIndex < slotCount)
- unchanged[unchangedIndex++] = originalIndex++;
- // Fill in unchanged items.
- for (let i = slotCount - 1; i >= 0; i--)
- if (drawOrder[i] == -1) drawOrder[i] = unchanged[--unchangedIndex];
- }
- timeline.setFrame(frameIndex++, this.getValue(drawOrderMap, "time", 0), drawOrder);
- }
- timelines.push(timeline);
- duration = Math.max(duration, timeline.frames[timeline.getFrameCount() - 1]);
- }
- // Event timeline.
- if (map.events) {
- let timeline = new EventTimeline(map.events.length);
- let frameIndex = 0;
- for (let i = 0; i < map.events.length; i++) {
- let eventMap = map.events[i];
- let eventData = skeletonData.findEvent(eventMap.name);
- if (eventData == null) throw new Error("Event not found: " + eventMap.name);
- let event = new Event(Utils.toSinglePrecision(this.getValue(eventMap, "time", 0)), eventData);
- event.intValue = this.getValue(eventMap, "int", eventData.intValue);
- event.floatValue = this.getValue(eventMap, "float", eventData.floatValue);
- event.stringValue = this.getValue(eventMap, "string", eventData.stringValue);
- if (event.data.audioPath != null) {
- event.volume = this.getValue(eventMap, "volume", 1);
- event.balance = this.getValue(eventMap, "balance", 0);
- }
- timeline.setFrame(frameIndex++, event);
- }
- timelines.push(timeline);
- duration = Math.max(duration, timeline.frames[timeline.getFrameCount() - 1]);
- }
- if (isNaN(duration)) {
- throw new Error("Error while parsing animation, duration is NaN");
- }
- skeletonData.animations.push(new Animation(name, timelines, duration));
- }
- readCurve (map, timeline, frameIndex) {
- if (!map.hasOwnProperty("curve")) return;
- if (map.curve === "stepped")
- timeline.setStepped(frameIndex);
- else {
- let curve = map.curve;
- timeline.setCurve(frameIndex, curve, this.getValue(map, "c2", 0), this.getValue(map, "c3", 1), this.getValue(map, "c4", 1));
- }
- }
- getValue (map, prop, defaultValue) {
- return map[prop] !== undefined ? map[prop] : defaultValue;
- }
- static blendModeFromString (str) {
- str = str.toLowerCase();
- if (str == "normal") return constants.BLEND_MODES.NORMAL;
- if (str == "additive") return constants.BLEND_MODES.ADD;
- if (str == "multiply") return constants.BLEND_MODES.MULTIPLY;
- if (str == "screen") return constants.BLEND_MODES.SCREEN;
- throw new Error(`Unknown blend mode: ${str}`);
- }
- static positionModeFromString (str) {
- str = str.toLowerCase();
- if (str == "fixed") return PositionMode.Fixed;
- if (str == "percent") return PositionMode.Percent;
- throw new Error(`Unknown position mode: ${str}`);
- }
- static spacingModeFromString (str) {
- str = str.toLowerCase();
- if (str == "length") return SpacingMode.Length;
- if (str == "fixed") return SpacingMode.Fixed;
- if (str == "percent") return SpacingMode.Percent;
- throw new Error(`Unknown position mode: ${str}`);
- }
- static rotateModeFromString (str) {
- str = str.toLowerCase();
- if (str == "tangent") return RotateMode.Tangent;
- if (str == "chain") return RotateMode.Chain;
- if (str == "chainscale") return RotateMode.ChainScale;
- throw new Error(`Unknown rotate mode: ${str}`);
- }
- static transformModeFromString(str) {
- str = str.toLowerCase();
- if (str == "normal") return TransformMode.Normal;
- if (str == "onlytranslation") return TransformMode.OnlyTranslation;
- if (str == "norotationorreflection") return TransformMode.NoRotationOrReflection;
- if (str == "noscale") return TransformMode.NoScale;
- if (str == "noscaleorreflection") return TransformMode.NoScaleOrReflection;
- throw new Error(`Unknown transform mode: ${str}`);
- }
- }
- class LinkedMesh$1 {
-
-
-
-
- constructor (mesh, skin, slotIndex, parent, inheritDeform) {
- this.mesh = mesh;
- this.skin = skin;
- this.slotIndex = slotIndex;
- this.parent = parent;
- this.inheritDeform = inheritDeform;
- }
- }
- /**
- * @public
- */
- class Spine extends SpineBase {
- createSkeleton(spineData) {
- this.skeleton = new Skeleton(spineData);
- this.skeleton.updateWorldTransform();
- this.stateData = new AnimationStateData(spineData);
- this.state = new AnimationState(this.stateData);
- }
- }
- var spine38 = /*#__PURE__*/Object.freeze({
- __proto__: null,
- Animation: Animation,
- AnimationState: AnimationState,
- AnimationStateAdapter: AnimationStateAdapter,
- AnimationStateData: AnimationStateData,
- AtlasAttachmentLoader: AtlasAttachmentLoader,
- Attachment: Attachment,
- AttachmentTimeline: AttachmentTimeline,
- Bone: Bone,
- BoneData: BoneData,
- BoundingBoxAttachment: BoundingBoxAttachment,
- ClippingAttachment: ClippingAttachment,
- ColorTimeline: ColorTimeline,
- ConstraintData: ConstraintData,
- CurveTimeline: CurveTimeline,
- DeformTimeline: DeformTimeline,
- DrawOrderTimeline: DrawOrderTimeline,
- Event: Event,
- EventData: EventData,
- EventQueue: EventQueue,
- EventTimeline: EventTimeline,
- get EventType () { return EventType; },
- IkConstraint: IkConstraint,
- IkConstraintData: IkConstraintData,
- IkConstraintTimeline: IkConstraintTimeline,
- JitterEffect: JitterEffect,
- MeshAttachment: MeshAttachment,
- get MixBlend () { return MixBlend; },
- get MixDirection () { return MixDirection; },
- PathAttachment: PathAttachment,
- PathConstraint: PathConstraint,
- PathConstraintData: PathConstraintData,
- PathConstraintMixTimeline: PathConstraintMixTimeline,
- PathConstraintPositionTimeline: PathConstraintPositionTimeline,
- PathConstraintSpacingTimeline: PathConstraintSpacingTimeline,
- PointAttachment: PointAttachment,
- get PositionMode () { return PositionMode; },
- RegionAttachment: RegionAttachment,
- get RotateMode () { return RotateMode; },
- RotateTimeline: RotateTimeline,
- ScaleTimeline: ScaleTimeline,
- ShearTimeline: ShearTimeline,
- Skeleton: Skeleton,
- SkeletonBinary: SkeletonBinary,
- SkeletonBounds: SkeletonBounds,
- SkeletonData: SkeletonData,
- SkeletonJson: SkeletonJson,
- Skin: Skin,
- SkinEntry: SkinEntry,
- Slot: Slot,
- SlotData: SlotData,
- get SpacingMode () { return SpacingMode; },
- Spine: Spine,
- SwirlEffect: SwirlEffect,
- get TimelineType () { return TimelineType; },
- TrackEntry: TrackEntry,
- TransformConstraint: TransformConstraint,
- TransformConstraintData: TransformConstraintData,
- TransformConstraintTimeline: TransformConstraintTimeline,
- get TransformMode () { return TransformMode; },
- TranslateTimeline: TranslateTimeline,
- TwoColorTimeline: TwoColorTimeline,
- VertexAttachment: VertexAttachment
- });
- /* eslint-disable */
- /**
- * @public
- */
- class Attachment$1 {
-
-
- constructor(name) {
- if (name == null) throw new Error("name cannot be null.");
- this.name = name;
- }
- }
- /**
- * @public
- */
- class VertexAttachment$1 extends Attachment$1 {
- static __initStatic() {this.nextID = 0;}
- __init() {this.id = (VertexAttachment$1.nextID++ & 65535) << 11;}
-
-
- __init2() {this.worldVerticesLength = 0;}
- constructor(name) {
- super(name);VertexAttachment$1.prototype.__init.call(this);VertexAttachment$1.prototype.__init2.call(this); }
- computeWorldVerticesOld(slot, worldVertices) {
- this.computeWorldVertices(slot, 0, this.worldVerticesLength, worldVertices, 0, 2);
- }
- /** Transforms local vertices to world coordinates.
- * @param start The index of the first local vertex value to transform. Each vertex has 2 values, x and y.
- * @param count The number of world vertex values to output. Must be <= {@link #getWorldVerticesLength()} - start.
- * @param worldVertices The output world vertices. Must have a length >= offset + count.
- * @param offset The worldVertices index to begin writing values. */
- computeWorldVertices(slot, start, count, worldVertices, offset, stride) {
- count = offset + (count >> 1) * stride;
- let skeleton = slot.bone.skeleton;
- let deformArray = slot.attachmentVertices;
- let vertices = this.vertices;
- let bones = this.bones;
- if (bones == null) {
- if (deformArray.length > 0) vertices = deformArray;
- let mat = slot.bone.matrix;
- let x = mat.tx;
- let y = mat.ty;
- let a = mat.a, b = mat.c, c = mat.b, d = mat.d;
- for (let v = start, w = offset; w < count; v += 2, w += stride) {
- let vx = vertices[v], vy = vertices[v + 1];
- worldVertices[w] = vx * a + vy * b + x;
- worldVertices[w + 1] = vx * c + vy * d + y;
- }
- return;
- }
- let v = 0, skip = 0;
- for (let i = 0; i < start; i += 2) {
- let n = bones[v];
- v += n + 1;
- skip += n;
- }
- let skeletonBones = skeleton.bones;
- if (deformArray.length == 0) {
- for (let w = offset, b = skip * 3; w < count; w += stride) {
- let wx = 0, wy = 0;
- let n = bones[v++];
- n += v;
- for (; v < n; v++, b += 3) {
- let mat = skeletonBones[bones[v]].matrix;
- let vx = vertices[b], vy = vertices[b + 1], weight = vertices[b + 2];
- wx += (vx * mat.a + vy * mat.c + mat.tx) * weight;
- wy += (vx * mat.b + vy * mat.d + mat.ty) * weight;
- }
- worldVertices[w] = wx;
- worldVertices[w + 1] = wy;
- }
- } else {
- let deform = deformArray;
- for (let w = offset, b = skip * 3, f = skip << 1; w < count; w += stride) {
- let wx = 0, wy = 0;
- let n = bones[v++];
- n += v;
- for (; v < n; v++, b += 3, f += 2) {
- let mat = skeletonBones[bones[v]].matrix;
- let vx = vertices[b] + deform[f], vy = vertices[b + 1] + deform[f + 1],
- weight = vertices[b + 2];
- wx += (vx * mat.a + vy * mat.c + mat.tx) * weight;
- wy += (vx * mat.b + vy * mat.d + mat.ty) * weight;
- }
- worldVertices[w] = wx;
- worldVertices[w + 1] = wy;
- }
- }
- }
- /** Returns true if a deform originally applied to the specified attachment should be applied to this attachment. */
- applyDeform(sourceAttachment) {
- return this == sourceAttachment;
- }
- } VertexAttachment$1.__initStatic();
- /**
- * @public
- */
- class BoundingBoxAttachment$1 extends VertexAttachment$1 {
- __init() {this.type = exports.AttachmentType.BoundingBox;}
- __init2() {this.color = new Color(1, 1, 1, 1);}
- constructor(name) {
- super(name);BoundingBoxAttachment$1.prototype.__init.call(this);BoundingBoxAttachment$1.prototype.__init2.call(this); }
- }
- /**
- * @public
- */
- class ClippingAttachment$1 extends VertexAttachment$1 {
- __init() {this.type = exports.AttachmentType.Clipping;}
-
- // Nonessential.
- __init2() {this.color = new Color(0.2275, 0.2275, 0.8078, 1);} // ce3a3aff
- constructor(name) {
- super(name);ClippingAttachment$1.prototype.__init.call(this);ClippingAttachment$1.prototype.__init2.call(this); }
- }
- /**
- * @public
- */
- class MeshAttachment$1 extends VertexAttachment$1 {
- __init() {this.type = exports.AttachmentType.Mesh;}
-
-
-
-
- __init2() {this.color = new Color(1, 1, 1, 1);}
-
-
- __init3() {this.inheritDeform = false;}
- __init4() {this.tempColor = new Color(0, 0, 0, 0);}
- constructor (name) {
- super(name);MeshAttachment$1.prototype.__init.call(this);MeshAttachment$1.prototype.__init2.call(this);MeshAttachment$1.prototype.__init3.call(this);MeshAttachment$1.prototype.__init4.call(this); }
- applyDeform (sourceAttachment) {
- return this == sourceAttachment || (this.inheritDeform && this.parentMesh == sourceAttachment);
- }
- getParentMesh () {
- return this.parentMesh;
- }
- /** @param parentMesh May be null. */
- setParentMesh (parentMesh) {
- this.parentMesh = parentMesh;
- if (parentMesh != null) {
- this.bones = parentMesh.bones;
- this.vertices = parentMesh.vertices;
- this.worldVerticesLength = parentMesh.worldVerticesLength;
- this.regionUVs = parentMesh.regionUVs;
- this.triangles = parentMesh.triangles;
- this.hullLength = parentMesh.hullLength;
- this.worldVerticesLength = parentMesh.worldVerticesLength;
- }
- }
- //computeWorldVerticesWith(slot, 0, this.worldVerticesLength, worldVertices, 0);
- }
- /**
- * @public
- */
- class PathAttachment$1 extends VertexAttachment$1 {
- __init() {this.type = exports.AttachmentType.Path;}
-
- __init2() {this.closed = false;}
- __init3() {this.constantSpeed = false;}
- __init4() {this.color = new Color(1, 1, 1, 1);}
- constructor(name) {
- super(name);PathAttachment$1.prototype.__init.call(this);PathAttachment$1.prototype.__init2.call(this);PathAttachment$1.prototype.__init3.call(this);PathAttachment$1.prototype.__init4.call(this); }
- }
- /**
- * @public
- */
- class PointAttachment$1 extends VertexAttachment$1 {
- __init() {this.type = exports.AttachmentType.Point;}
-
-
-
- __init2() {this.color = new Color(0.38, 0.94, 0, 1);}
- constructor(name) {
- super(name);PointAttachment$1.prototype.__init.call(this);PointAttachment$1.prototype.__init2.call(this); }
- computeWorldPosition(bone, point) {
- const mat = bone.matrix;
- point.x = this.x * mat.a + this.y * mat.c + bone.worldX;
- point.y = this.x * mat.b + this.y * mat.d + bone.worldY;
- return point;
- }
- computeWorldRotation(bone) {
- const mat = bone.matrix;
- let cos = MathUtils.cosDeg(this.rotation), sin = MathUtils.sinDeg(this.rotation);
- let x = cos * mat.a + sin * mat.c;
- let y = cos * mat.b + sin * mat.d;
- return Math.atan2(y, x) * MathUtils.radDeg;
- }
- }
- /**
- * @public
- */
- class RegionAttachment$1 extends Attachment$1 {
- __init() {this.type = exports.AttachmentType.Region;}
- static __initStatic() {this.OX1 = 0;}
- static __initStatic2() {this.OY1 = 1;}
- static __initStatic3() {this.OX2 = 2;}
- static __initStatic4() {this.OY2 = 3;}
- static __initStatic5() {this.OX3 = 4;}
- static __initStatic6() {this.OY3 = 5;}
- static __initStatic7() {this.OX4 = 6;}
- static __initStatic8() {this.OY4 = 7;}
- static __initStatic9() {this.X1 = 0;}
- static __initStatic10() {this.Y1 = 1;}
- static __initStatic11() {this.C1R = 2;}
- static __initStatic12() {this.C1G = 3;}
- static __initStatic13() {this.C1B = 4;}
- static __initStatic14() {this.C1A = 5;}
- static __initStatic15() {this.U1 = 6;}
- static __initStatic16() {this.V1 = 7;}
- static __initStatic17() {this.X2 = 8;}
- static __initStatic18() {this.Y2 = 9;}
- static __initStatic19() {this.C2R = 10;}
- static __initStatic20() {this.C2G = 11;}
- static __initStatic21() {this.C2B = 12;}
- static __initStatic22() {this.C2A = 13;}
- static __initStatic23() {this.U2 = 14;}
- static __initStatic24() {this.V2 = 15;}
- static __initStatic25() {this.X3 = 16;}
- static __initStatic26() {this.Y3 = 17;}
- static __initStatic27() {this.C3R = 18;}
- static __initStatic28() {this.C3G = 19;}
- static __initStatic29() {this.C3B = 20;}
- static __initStatic30() {this.C3A = 21;}
- static __initStatic31() {this.U3 = 22;}
- static __initStatic32() {this.V3 = 23;}
- static __initStatic33() {this.X4 = 24;}
- static __initStatic34() {this.Y4 = 25;}
- static __initStatic35() {this.C4R = 26;}
- static __initStatic36() {this.C4G = 27;}
- static __initStatic37() {this.C4B = 28;}
- static __initStatic38() {this.C4A = 29;}
- static __initStatic39() {this.U4 = 30;}
- static __initStatic40() {this.V4 = 31;}
- __init2() {this.x = 0;}
- __init3() {this.y = 0;}
- __init4() {this.scaleX = 1;}
- __init5() {this.scaleY = 1;}
- __init6() {this.rotation = 0;}
- __init7() {this.width = 0;}
- __init8() {this.height = 0;}
- __init9() {this.color = new Color(1, 1, 1, 1);}
-
-
-
- __init10() {this.offset = Utils.newFloatArray(8);}
- __init11() {this.uvs = Utils.newFloatArray(8);}
- __init12() {this.tempColor = new Color(1, 1, 1, 1);}
- constructor(name) {
- super(name);RegionAttachment$1.prototype.__init.call(this);RegionAttachment$1.prototype.__init2.call(this);RegionAttachment$1.prototype.__init3.call(this);RegionAttachment$1.prototype.__init4.call(this);RegionAttachment$1.prototype.__init5.call(this);RegionAttachment$1.prototype.__init6.call(this);RegionAttachment$1.prototype.__init7.call(this);RegionAttachment$1.prototype.__init8.call(this);RegionAttachment$1.prototype.__init9.call(this);RegionAttachment$1.prototype.__init10.call(this);RegionAttachment$1.prototype.__init11.call(this);RegionAttachment$1.prototype.__init12.call(this); }
- updateOffset() {
- let regionScaleX = this.width / this.region.originalWidth * this.scaleX;
- let regionScaleY = this.height / this.region.originalHeight * this.scaleY;
- let localX = -this.width / 2 * this.scaleX + this.region.offsetX * regionScaleX;
- let localY = -this.height / 2 * this.scaleY + this.region.offsetY * regionScaleY;
- let localX2 = localX + this.region.width * regionScaleX;
- let localY2 = localY + this.region.height * regionScaleY;
- let radians = this.rotation * Math.PI / 180;
- let cos = Math.cos(radians);
- let sin = Math.sin(radians);
- let localXCos = localX * cos + this.x;
- let localXSin = localX * sin;
- let localYCos = localY * cos + this.y;
- let localYSin = localY * sin;
- let localX2Cos = localX2 * cos + this.x;
- let localX2Sin = localX2 * sin;
- let localY2Cos = localY2 * cos + this.y;
- let localY2Sin = localY2 * sin;
- let offset = this.offset;
- offset[RegionAttachment$1.OX1] = localXCos - localYSin;
- offset[RegionAttachment$1.OY1] = localYCos + localXSin;
- offset[RegionAttachment$1.OX2] = localXCos - localY2Sin;
- offset[RegionAttachment$1.OY2] = localY2Cos + localXSin;
- offset[RegionAttachment$1.OX3] = localX2Cos - localY2Sin;
- offset[RegionAttachment$1.OY3] = localY2Cos + localX2Sin;
- offset[RegionAttachment$1.OX4] = localX2Cos - localYSin;
- offset[RegionAttachment$1.OY4] = localYCos + localX2Sin;
- }
- setRegion(region) {
- this.region = region;
- let uvs = this.uvs;
- if (region.rotate) {
- uvs[2] = region.u;
- uvs[3] = region.v2;
- uvs[4] = region.u;
- uvs[5] = region.v;
- uvs[6] = region.u2;
- uvs[7] = region.v;
- uvs[0] = region.u2;
- uvs[1] = region.v2;
- } else {
- uvs[0] = region.u;
- uvs[1] = region.v2;
- uvs[2] = region.u;
- uvs[3] = region.v;
- uvs[4] = region.u2;
- uvs[5] = region.v;
- uvs[6] = region.u2;
- uvs[7] = region.v2;
- }
- }
- computeWorldVertices(bone, worldVertices, offset, stride) {
- let vertexOffset = this.offset;
- let mat = bone.matrix;
- let x = mat.tx, y = mat.ty;
- let a = mat.a, b = mat.c, c = mat.b, d = mat.d;
- let offsetX = 0, offsetY = 0;
- offsetX = vertexOffset[RegionAttachment$1.OX1];
- offsetY = vertexOffset[RegionAttachment$1.OY1];
- worldVertices[offset] = offsetX * a + offsetY * b + x; // br
- worldVertices[offset + 1] = offsetX * c + offsetY * d + y;
- offset += stride;
- offsetX = vertexOffset[RegionAttachment$1.OX2];
- offsetY = vertexOffset[RegionAttachment$1.OY2];
- worldVertices[offset] = offsetX * a + offsetY * b + x; // bl
- worldVertices[offset + 1] = offsetX * c + offsetY * d + y;
- offset += stride;
- offsetX = vertexOffset[RegionAttachment$1.OX3];
- offsetY = vertexOffset[RegionAttachment$1.OY3];
- worldVertices[offset] = offsetX * a + offsetY * b + x; // ul
- worldVertices[offset + 1] = offsetX * c + offsetY * d + y;
- offset += stride;
- offsetX = vertexOffset[RegionAttachment$1.OX4];
- offsetY = vertexOffset[RegionAttachment$1.OY4];
- worldVertices[offset] = offsetX * a + offsetY * b + x; // ur
- worldVertices[offset + 1] = offsetX * c + offsetY * d + y;
- }
- } RegionAttachment$1.__initStatic(); RegionAttachment$1.__initStatic2(); RegionAttachment$1.__initStatic3(); RegionAttachment$1.__initStatic4(); RegionAttachment$1.__initStatic5(); RegionAttachment$1.__initStatic6(); RegionAttachment$1.__initStatic7(); RegionAttachment$1.__initStatic8(); RegionAttachment$1.__initStatic9(); RegionAttachment$1.__initStatic10(); RegionAttachment$1.__initStatic11(); RegionAttachment$1.__initStatic12(); RegionAttachment$1.__initStatic13(); RegionAttachment$1.__initStatic14(); RegionAttachment$1.__initStatic15(); RegionAttachment$1.__initStatic16(); RegionAttachment$1.__initStatic17(); RegionAttachment$1.__initStatic18(); RegionAttachment$1.__initStatic19(); RegionAttachment$1.__initStatic20(); RegionAttachment$1.__initStatic21(); RegionAttachment$1.__initStatic22(); RegionAttachment$1.__initStatic23(); RegionAttachment$1.__initStatic24(); RegionAttachment$1.__initStatic25(); RegionAttachment$1.__initStatic26(); RegionAttachment$1.__initStatic27(); RegionAttachment$1.__initStatic28(); RegionAttachment$1.__initStatic29(); RegionAttachment$1.__initStatic30(); RegionAttachment$1.__initStatic31(); RegionAttachment$1.__initStatic32(); RegionAttachment$1.__initStatic33(); RegionAttachment$1.__initStatic34(); RegionAttachment$1.__initStatic35(); RegionAttachment$1.__initStatic36(); RegionAttachment$1.__initStatic37(); RegionAttachment$1.__initStatic38(); RegionAttachment$1.__initStatic39(); RegionAttachment$1.__initStatic40();
- /**
- * @public
- */
- class JitterEffect$1 {
- __init() {this.jitterX = 0;}
- __init2() {this.jitterY = 0;}
- constructor (jitterX, jitterY) {JitterEffect$1.prototype.__init.call(this);JitterEffect$1.prototype.__init2.call(this);
- this.jitterX = jitterX;
- this.jitterY = jitterY;
- }
- begin(skeleton) {
- }
- transform(position, uv, light, dark) {
- position.x += MathUtils.randomTriangular(-this.jitterX, this.jitterY);
- position.y += MathUtils.randomTriangular(-this.jitterX, this.jitterY);
- }
- end() {
- }
- }
- /**
- * @public
- */
- class SwirlEffect$1 {
- static __initStatic() {this.interpolation = new PowOut(2);}
- __init() {this.centerX = 0;}
- __init2() {this.centerY = 0;}
- __init3() {this.radius = 0;}
- __init4() {this.angle = 0;}
- __init5() {this.worldX = 0;}
- __init6() {this.worldY = 0;}
- constructor (radius) {SwirlEffect$1.prototype.__init.call(this);SwirlEffect$1.prototype.__init2.call(this);SwirlEffect$1.prototype.__init3.call(this);SwirlEffect$1.prototype.__init4.call(this);SwirlEffect$1.prototype.__init5.call(this);SwirlEffect$1.prototype.__init6.call(this);
- this.radius = radius;
- }
- begin(skeleton) {
- this.worldX = skeleton.x + this.centerX;
- this.worldY = skeleton.y + this.centerY;
- }
- transform(position, uv, light, dark) {
- let radAngle = this.angle * MathUtils.degreesToRadians;
- let x = position.x - this.worldX;
- let y = position.y - this.worldY;
- let dist = Math.sqrt(x * x + y * y);
- if (dist < this.radius) {
- let theta = SwirlEffect$1.interpolation.apply(0, radAngle, (this.radius - dist) / this.radius);
- let cos = Math.cos(theta);
- let sin = Math.sin(theta);
- position.x = cos * x - sin * y + this.worldX;
- position.y = sin * x + cos * y + this.worldY;
- }
- }
- end() {
- }
- } SwirlEffect$1.__initStatic();
- /**
- * @public
- */
- class Animation$1 {
-
-
-
- constructor (name, timelines, duration) {
- if (name == null) throw new Error("name cannot be null.");
- if (timelines == null) throw new Error("timelines cannot be null.");
- this.name = name;
- this.timelines = timelines;
- this.duration = duration;
- }
- apply (skeleton, lastTime, time, loop, events, alpha, blend, direction) {
- if (skeleton == null) throw new Error("skeleton cannot be null.");
- if (loop && this.duration != 0) {
- time %= this.duration;
- if (lastTime > 0) lastTime %= this.duration;
- }
- let timelines = this.timelines;
- for (let i = 0, n = timelines.length; i < n; i++)
- timelines[i].apply(skeleton, lastTime, time, events, alpha, blend, direction);
- }
- static binarySearch (values, target, step = 1) {
- let low = 0;
- let high = values.length / step - 2;
- if (high == 0) return step;
- let current = high >>> 1;
- while (true) {
- if (values[(current + 1) * step] <= target)
- low = current + 1;
- else
- high = current;
- if (low == high) return (low + 1) * step;
- current = (low + high) >>> 1;
- }
- }
- static linearSearch (values, target, step) {
- for (let i = 0, last = values.length - step; i <= last; i += step)
- if (values[i] > target) return i;
- return -1;
- }
- }
- /**
- * @public
- */
- /**
- * @public
- */
- var MixBlend$1; (function (MixBlend) {
- const setup = 0; MixBlend[MixBlend["setup"] = setup] = "setup";
- const first = setup + 1; MixBlend[MixBlend["first"] = first] = "first";
- const replace = first + 1; MixBlend[MixBlend["replace"] = replace] = "replace";
- const add = replace + 1; MixBlend[MixBlend["add"] = add] = "add";
- })(MixBlend$1 || (MixBlend$1 = {}));
- /**
- * @public
- */
- var MixDirection$1; (function (MixDirection) {
- MixDirection[MixDirection["in"] = 0] = "in"; const out = (0) + 1; MixDirection[MixDirection["out"] = out] = "out";
- })(MixDirection$1 || (MixDirection$1 = {}));
- /**
- * @public
- */
- var TimelineType$1; (function (TimelineType) {
- const rotate = 0; TimelineType[TimelineType["rotate"] = rotate] = "rotate"; const translate = rotate + 1; TimelineType[TimelineType["translate"] = translate] = "translate"; const scale = translate + 1; TimelineType[TimelineType["scale"] = scale] = "scale"; const shear = scale + 1; TimelineType[TimelineType["shear"] = shear] = "shear";
- const attachment = shear + 1; TimelineType[TimelineType["attachment"] = attachment] = "attachment"; const color = attachment + 1; TimelineType[TimelineType["color"] = color] = "color"; const deform = color + 1; TimelineType[TimelineType["deform"] = deform] = "deform";
- const event = deform + 1; TimelineType[TimelineType["event"] = event] = "event"; const drawOrder = event + 1; TimelineType[TimelineType["drawOrder"] = drawOrder] = "drawOrder";
- const ikConstraint = drawOrder + 1; TimelineType[TimelineType["ikConstraint"] = ikConstraint] = "ikConstraint"; const transformConstraint = ikConstraint + 1; TimelineType[TimelineType["transformConstraint"] = transformConstraint] = "transformConstraint";
- const pathConstraintPosition = transformConstraint + 1; TimelineType[TimelineType["pathConstraintPosition"] = pathConstraintPosition] = "pathConstraintPosition"; const pathConstraintSpacing = pathConstraintPosition + 1; TimelineType[TimelineType["pathConstraintSpacing"] = pathConstraintSpacing] = "pathConstraintSpacing"; const pathConstraintMix = pathConstraintSpacing + 1; TimelineType[TimelineType["pathConstraintMix"] = pathConstraintMix] = "pathConstraintMix";
- const twoColor = pathConstraintMix + 1; TimelineType[TimelineType["twoColor"] = twoColor] = "twoColor";
- })(TimelineType$1 || (TimelineType$1 = {}));
- /**
- * @public
- */
- class CurveTimeline$1 {
- static __initStatic() {this.LINEAR = 0;} static __initStatic2() {this.STEPPED = 1;} static __initStatic3() {this.BEZIER = 2;}
- static __initStatic4() {this.BEZIER_SIZE = 10 * 2 - 1;}
- // type, x, y, ...
-
- constructor (frameCount) {
- if (frameCount <= 0) throw new Error("frameCount must be > 0: " + frameCount);
- this.curves = Utils.newFloatArray((frameCount - 1) * CurveTimeline$1.BEZIER_SIZE);
- }
- getFrameCount () {
- return this.curves.length / CurveTimeline$1.BEZIER_SIZE + 1;
- }
- setLinear (frameIndex) {
- this.curves[frameIndex * CurveTimeline$1.BEZIER_SIZE] = CurveTimeline$1.LINEAR;
- }
- setStepped (frameIndex) {
- this.curves[frameIndex * CurveTimeline$1.BEZIER_SIZE] = CurveTimeline$1.STEPPED;
- }
- getCurveType (frameIndex) {
- let index = frameIndex * CurveTimeline$1.BEZIER_SIZE;
- if (index == this.curves.length) return CurveTimeline$1.LINEAR;
- let type = this.curves[index];
- if (type == CurveTimeline$1.LINEAR) return CurveTimeline$1.LINEAR;
- if (type == CurveTimeline$1.STEPPED) return CurveTimeline$1.STEPPED;
- return CurveTimeline$1.BEZIER;
- }
- /** Sets the control handle positions for an interpolation bezier curve used to transition from this keyframe to the next.
- * cx1 and cx2 are from 0 to 1, representing the percent of time between the two keyframes. cy1 and cy2 are the percent of
- * the difference between the keyframe's values. */
- setCurve (frameIndex, cx1, cy1, cx2, cy2) {
- let tmpx = (-cx1 * 2 + cx2) * 0.03, tmpy = (-cy1 * 2 + cy2) * 0.03;
- let dddfx = ((cx1 - cx2) * 3 + 1) * 0.006, dddfy = ((cy1 - cy2) * 3 + 1) * 0.006;
- let ddfx = tmpx * 2 + dddfx, ddfy = tmpy * 2 + dddfy;
- let dfx = cx1 * 0.3 + tmpx + dddfx * 0.16666667, dfy = cy1 * 0.3 + tmpy + dddfy * 0.16666667;
- let i = frameIndex * CurveTimeline$1.BEZIER_SIZE;
- let curves = this.curves;
- curves[i++] = CurveTimeline$1.BEZIER;
- let x = dfx, y = dfy;
- for (let n = i + CurveTimeline$1.BEZIER_SIZE - 1; i < n; i += 2) {
- curves[i] = x;
- curves[i + 1] = y;
- dfx += ddfx;
- dfy += ddfy;
- ddfx += dddfx;
- ddfy += dddfy;
- x += dfx;
- y += dfy;
- }
- }
- getCurvePercent (frameIndex, percent) {
- percent = MathUtils.clamp(percent, 0, 1);
- let curves = this.curves;
- let i = frameIndex * CurveTimeline$1.BEZIER_SIZE;
- let type = curves[i];
- if (type == CurveTimeline$1.LINEAR) return percent;
- if (type == CurveTimeline$1.STEPPED) return 0;
- i++;
- let x = 0;
- for (let start = i, n = i + CurveTimeline$1.BEZIER_SIZE - 1; i < n; i += 2) {
- x = curves[i];
- if (x >= percent) {
- let prevX, prevY;
- if (i == start) {
- prevX = 0;
- prevY = 0;
- } else {
- prevX = curves[i - 2];
- prevY = curves[i - 1];
- }
- return prevY + (curves[i + 1] - prevY) * (percent - prevX) / (x - prevX);
- }
- }
- let y = curves[i - 1];
- return y + (1 - y) * (percent - x) / (1 - x); // Last point is 1,1.
- }
-
- } CurveTimeline$1.__initStatic(); CurveTimeline$1.__initStatic2(); CurveTimeline$1.__initStatic3(); CurveTimeline$1.__initStatic4();
- /**
- * @public
- */
- class RotateTimeline$1 extends CurveTimeline$1 {
- static __initStatic5() {this.ENTRIES = 2;}
- static __initStatic6() {this.PREV_TIME = -2;} static __initStatic7() {this.PREV_ROTATION = -1;}
- static __initStatic8() {this.ROTATION = 1;}
-
- // time, degrees, ...
- constructor (frameCount) {
- super(frameCount);
- this.frames = Utils.newFloatArray(frameCount << 1);
- }
- getPropertyId () {
- return (TimelineType$1.rotate << 24) + this.boneIndex;
- }
- /** Sets the time and angle of the specified keyframe. */
- setFrame (frameIndex, time, degrees) {
- frameIndex <<= 1;
- this.frames[frameIndex] = time;
- this.frames[frameIndex + RotateTimeline$1.ROTATION] = degrees;
- }
- apply (skeleton, lastTime, time, events, alpha, blend, direction) {
- let frames = this.frames;
- let bone = skeleton.bones[this.boneIndex];
- if (time < frames[0]) {
- switch (blend) {
- case MixBlend$1.setup:
- bone.rotation = bone.data.rotation;
- return;
- case MixBlend$1.first:
- let r = bone.data.rotation - bone.rotation;
- bone.rotation += (r - (16384 - ((16384.499999999996 - r / 360) | 0)) * 360) * alpha;
- }
- return;
- }
- if (time >= frames[frames.length - RotateTimeline$1.ENTRIES]) { // Time is after last frame.
- let r = frames[frames.length + RotateTimeline$1.PREV_ROTATION];
- switch (blend) {
- case MixBlend$1.setup:
- bone.rotation = bone.data.rotation + r * alpha;
- break;
- case MixBlend$1.first:
- case MixBlend$1.replace:
- r += bone.data.rotation - bone.rotation;
- r -= (16384 - ((16384.499999999996 - r / 360) | 0)) * 360; // Wrap within -180 and 180.
- case MixBlend$1.add:
- bone.rotation += r * alpha;
- }
- return;
- }
- // Interpolate between the previous frame and the current frame.
- let frame = Animation$1.binarySearch(frames, time, RotateTimeline$1.ENTRIES);
- let prevRotation = frames[frame + RotateTimeline$1.PREV_ROTATION];
- let frameTime = frames[frame];
- let percent = this.getCurvePercent((frame >> 1) - 1,
- 1 - (time - frameTime) / (frames[frame + RotateTimeline$1.PREV_TIME] - frameTime));
- let r = frames[frame + RotateTimeline$1.ROTATION] - prevRotation;
- r = prevRotation + (r - (16384 - ((16384.499999999996 - r / 360) | 0)) * 360) * percent;
- switch (blend) {
- case MixBlend$1.setup:
- bone.rotation = bone.data.rotation + (r - (16384 - ((16384.499999999996 - r / 360) | 0)) * 360) * alpha;
- break;
- case MixBlend$1.first:
- case MixBlend$1.replace:
- r += bone.data.rotation - bone.rotation;
- case MixBlend$1.add:
- bone.rotation += (r - (16384 - ((16384.499999999996 - r / 360) | 0)) * 360) * alpha;
- }
- }
- } RotateTimeline$1.__initStatic5(); RotateTimeline$1.__initStatic6(); RotateTimeline$1.__initStatic7(); RotateTimeline$1.__initStatic8();
- /**
- * @public
- */
- class TranslateTimeline$1 extends CurveTimeline$1 {
- static __initStatic9() {this.ENTRIES = 3;}
- static __initStatic10() {this.PREV_TIME = -3;} static __initStatic11() {this.PREV_X = -2;} static __initStatic12() {this.PREV_Y = -1;}
- static __initStatic13() {this.X = 1;} static __initStatic14() {this.Y = 2;}
-
- // time, x, y, ...
- constructor (frameCount) {
- super(frameCount);
- this.frames = Utils.newFloatArray(frameCount * TranslateTimeline$1.ENTRIES);
- }
- getPropertyId () {
- return (TimelineType$1.translate << 24) + this.boneIndex;
- }
- /** Sets the time and value of the specified keyframe. */
- setFrame (frameIndex, time, x, y) {
- frameIndex *= TranslateTimeline$1.ENTRIES;
- this.frames[frameIndex] = time;
- this.frames[frameIndex + TranslateTimeline$1.X] = x;
- this.frames[frameIndex + TranslateTimeline$1.Y] = y;
- }
- apply (skeleton, lastTime, time, events, alpha, blend, direction) {
- let frames = this.frames;
- let bone = skeleton.bones[this.boneIndex];
- if (time < frames[0]) {
- switch (blend) {
- case MixBlend$1.setup:
- bone.x = bone.data.x;
- bone.y = bone.data.y;
- return;
- case MixBlend$1.first:
- bone.x += (bone.data.x - bone.x) * alpha;
- bone.y += (bone.data.y - bone.y) * alpha;
- }
- return;
- }
- let x = 0, y = 0;
- if (time >= frames[frames.length - TranslateTimeline$1.ENTRIES]) { // Time is after last frame.
- x = frames[frames.length + TranslateTimeline$1.PREV_X];
- y = frames[frames.length + TranslateTimeline$1.PREV_Y];
- } else {
- // Interpolate between the previous frame and the current frame.
- let frame = Animation$1.binarySearch(frames, time, TranslateTimeline$1.ENTRIES);
- x = frames[frame + TranslateTimeline$1.PREV_X];
- y = frames[frame + TranslateTimeline$1.PREV_Y];
- let frameTime = frames[frame];
- let percent = this.getCurvePercent(frame / TranslateTimeline$1.ENTRIES - 1,
- 1 - (time - frameTime) / (frames[frame + TranslateTimeline$1.PREV_TIME] - frameTime));
- x += (frames[frame + TranslateTimeline$1.X] - x) * percent;
- y += (frames[frame + TranslateTimeline$1.Y] - y) * percent;
- }
- switch (blend) {
- case MixBlend$1.setup:
- bone.x = bone.data.x + x * alpha;
- bone.y = bone.data.y + y * alpha;
- break;
- case MixBlend$1.first:
- case MixBlend$1.replace:
- bone.x += (bone.data.x + x - bone.x) * alpha;
- bone.y += (bone.data.y + y - bone.y) * alpha;
- break;
- case MixBlend$1.add:
- bone.x += x * alpha;
- bone.y += y * alpha;
- }
- }
- } TranslateTimeline$1.__initStatic9(); TranslateTimeline$1.__initStatic10(); TranslateTimeline$1.__initStatic11(); TranslateTimeline$1.__initStatic12(); TranslateTimeline$1.__initStatic13(); TranslateTimeline$1.__initStatic14();
- /**
- * @public
- */
- class ScaleTimeline$1 extends TranslateTimeline$1 {
- constructor (frameCount) {
- super(frameCount);
- }
- getPropertyId () {
- return (TimelineType$1.scale << 24) + this.boneIndex;
- }
- apply (skeleton, lastTime, time, events, alpha, blend, direction) {
- let frames = this.frames;
- let bone = skeleton.bones[this.boneIndex];
- if (time < frames[0]) {
- switch (blend) {
- case MixBlend$1.setup:
- bone.scaleX = bone.data.scaleX;
- bone.scaleY = bone.data.scaleY;
- return;
- case MixBlend$1.first:
- bone.scaleX += (bone.data.scaleX - bone.scaleX) * alpha;
- bone.scaleY += (bone.data.scaleY - bone.scaleY) * alpha;
- }
- return;
- }
- let x = 0, y = 0;
- if (time >= frames[frames.length - ScaleTimeline$1.ENTRIES]) { // Time is after last frame.
- x = frames[frames.length + ScaleTimeline$1.PREV_X] * bone.data.scaleX;
- y = frames[frames.length + ScaleTimeline$1.PREV_Y] * bone.data.scaleY;
- } else {
- // Interpolate between the previous frame and the current frame.
- let frame = Animation$1.binarySearch(frames, time, ScaleTimeline$1.ENTRIES);
- x = frames[frame + ScaleTimeline$1.PREV_X];
- y = frames[frame + ScaleTimeline$1.PREV_Y];
- let frameTime = frames[frame];
- let percent = this.getCurvePercent(frame / ScaleTimeline$1.ENTRIES - 1,
- 1 - (time - frameTime) / (frames[frame + ScaleTimeline$1.PREV_TIME] - frameTime));
- x = (x + (frames[frame + ScaleTimeline$1.X] - x) * percent) * bone.data.scaleX;
- y = (y + (frames[frame + ScaleTimeline$1.Y] - y) * percent) * bone.data.scaleY;
- }
- if (alpha == 1) {
- if (blend == MixBlend$1.add) {
- bone.scaleX += x - bone.data.scaleX;
- bone.scaleY += y - bone.data.scaleY;
- } else {
- bone.scaleX = x;
- bone.scaleY = y;
- }
- } else {
- let bx = 0, by = 0;
- if (direction == MixDirection$1.out) {
- switch (blend) {
- case MixBlend$1.setup:
- bx = bone.data.scaleX;
- by = bone.data.scaleY;
- bone.scaleX = bx + (Math.abs(x) * MathUtils.signum(bx) - bx) * alpha;
- bone.scaleY = by + (Math.abs(y) * MathUtils.signum(by) - by) * alpha;
- break;
- case MixBlend$1.first:
- case MixBlend$1.replace:
- bx = bone.scaleX;
- by = bone.scaleY;
- bone.scaleX = bx + (Math.abs(x) * MathUtils.signum(bx) - bx) * alpha;
- bone.scaleY = by + (Math.abs(y) * MathUtils.signum(by) - by) * alpha;
- break;
- case MixBlend$1.add:
- bx = bone.scaleX;
- by = bone.scaleY;
- bone.scaleX = bx + (Math.abs(x) * MathUtils.signum(bx) - bone.data.scaleX) * alpha;
- bone.scaleY = by + (Math.abs(y) * MathUtils.signum(by) - bone.data.scaleY) * alpha;
- }
- } else {
- switch (blend) {
- case MixBlend$1.setup:
- bx = Math.abs(bone.data.scaleX) * MathUtils.signum(x);
- by = Math.abs(bone.data.scaleY) * MathUtils.signum(y);
- bone.scaleX = bx + (x - bx) * alpha;
- bone.scaleY = by + (y - by) * alpha;
- break;
- case MixBlend$1.first:
- case MixBlend$1.replace:
- bx = Math.abs(bone.scaleX) * MathUtils.signum(x);
- by = Math.abs(bone.scaleY) * MathUtils.signum(y);
- bone.scaleX = bx + (x - bx) * alpha;
- bone.scaleY = by + (y - by) * alpha;
- break;
- case MixBlend$1.add:
- bx = MathUtils.signum(x);
- by = MathUtils.signum(y);
- bone.scaleX = Math.abs(bone.scaleX) * bx + (x - Math.abs(bone.data.scaleX) * bx) * alpha;
- bone.scaleY = Math.abs(bone.scaleY) * by + (y - Math.abs(bone.data.scaleY) * by) * alpha;
- }
- }
- }
- }
- }
- /**
- * @public
- */
- class ShearTimeline$1 extends TranslateTimeline$1 {
- constructor (frameCount) {
- super(frameCount);
- }
- getPropertyId () {
- return (TimelineType$1.shear << 24) + this.boneIndex;
- }
- apply (skeleton, lastTime, time, events, alpha, blend, direction) {
- let frames = this.frames;
- let bone = skeleton.bones[this.boneIndex];
- if (time < frames[0]) {
- switch (blend) {
- case MixBlend$1.setup:
- bone.shearX = bone.data.shearX;
- bone.shearY = bone.data.shearY;
- return;
- case MixBlend$1.first:
- bone.shearX += (bone.data.shearX - bone.shearX) * alpha;
- bone.shearY += (bone.data.shearY - bone.shearY) * alpha;
- }
- return;
- }
- let x = 0, y = 0;
- if (time >= frames[frames.length - ShearTimeline$1.ENTRIES]) { // Time is after last frame.
- x = frames[frames.length + ShearTimeline$1.PREV_X];
- y = frames[frames.length + ShearTimeline$1.PREV_Y];
- } else {
- // Interpolate between the previous frame and the current frame.
- let frame = Animation$1.binarySearch(frames, time, ShearTimeline$1.ENTRIES);
- x = frames[frame + ShearTimeline$1.PREV_X];
- y = frames[frame + ShearTimeline$1.PREV_Y];
- let frameTime = frames[frame];
- let percent = this.getCurvePercent(frame / ShearTimeline$1.ENTRIES - 1,
- 1 - (time - frameTime) / (frames[frame + ShearTimeline$1.PREV_TIME] - frameTime));
- x = x + (frames[frame + ShearTimeline$1.X] - x) * percent;
- y = y + (frames[frame + ShearTimeline$1.Y] - y) * percent;
- }
- switch (blend) {
- case MixBlend$1.setup:
- bone.shearX = bone.data.shearX + x * alpha;
- bone.shearY = bone.data.shearY + y * alpha;
- break;
- case MixBlend$1.first:
- case MixBlend$1.replace:
- bone.shearX += (bone.data.shearX + x - bone.shearX) * alpha;
- bone.shearY += (bone.data.shearY + y - bone.shearY) * alpha;
- break;
- case MixBlend$1.add:
- bone.shearX += x * alpha;
- bone.shearY += y * alpha;
- }
- }
- }
- /**
- * @public
- */
- class ColorTimeline$1 extends CurveTimeline$1 {
- static __initStatic15() {this.ENTRIES = 5;}
- static __initStatic16() {this.PREV_TIME = -5;} static __initStatic17() {this.PREV_R = -4;} static __initStatic18() {this.PREV_G = -3;} static __initStatic19() {this.PREV_B = -2;} static __initStatic20() {this.PREV_A = -1;}
- static __initStatic21() {this.R = 1;} static __initStatic22() {this.G = 2;} static __initStatic23() {this.B = 3;} static __initStatic24() {this.A = 4;}
-
- // time, r, g, b, a, ...
- constructor (frameCount) {
- super(frameCount);
- this.frames = Utils.newFloatArray(frameCount * ColorTimeline$1.ENTRIES);
- }
- getPropertyId () {
- return (TimelineType$1.color << 24) + this.slotIndex;
- }
- /** Sets the time and value of the specified keyframe. */
- setFrame (frameIndex, time, r, g, b, a) {
- frameIndex *= ColorTimeline$1.ENTRIES;
- this.frames[frameIndex] = time;
- this.frames[frameIndex + ColorTimeline$1.R] = r;
- this.frames[frameIndex + ColorTimeline$1.G] = g;
- this.frames[frameIndex + ColorTimeline$1.B] = b;
- this.frames[frameIndex + ColorTimeline$1.A] = a;
- }
- apply (skeleton, lastTime, time, events, alpha, blend, direction) {
- let slot = skeleton.slots[this.slotIndex];
- let frames = this.frames;
- if (time < frames[0]) {
- switch (blend) {
- case MixBlend$1.setup:
- slot.color.setFromColor(slot.data.color);
- return;
- case MixBlend$1.first:
- let color = slot.color, setup = slot.data.color;
- color.add((setup.r - color.r) * alpha, (setup.g - color.g) * alpha, (setup.b - color.b) * alpha,
- (setup.a - color.a) * alpha);
- }
- return;
- }
- let r = 0, g = 0, b = 0, a = 0;
- if (time >= frames[frames.length - ColorTimeline$1.ENTRIES]) { // Time is after last frame.
- let i = frames.length;
- r = frames[i + ColorTimeline$1.PREV_R];
- g = frames[i + ColorTimeline$1.PREV_G];
- b = frames[i + ColorTimeline$1.PREV_B];
- a = frames[i + ColorTimeline$1.PREV_A];
- } else {
- // Interpolate between the previous frame and the current frame.
- let frame = Animation$1.binarySearch(frames, time, ColorTimeline$1.ENTRIES);
- r = frames[frame + ColorTimeline$1.PREV_R];
- g = frames[frame + ColorTimeline$1.PREV_G];
- b = frames[frame + ColorTimeline$1.PREV_B];
- a = frames[frame + ColorTimeline$1.PREV_A];
- let frameTime = frames[frame];
- let percent = this.getCurvePercent(frame / ColorTimeline$1.ENTRIES - 1,
- 1 - (time - frameTime) / (frames[frame + ColorTimeline$1.PREV_TIME] - frameTime));
- r += (frames[frame + ColorTimeline$1.R] - r) * percent;
- g += (frames[frame + ColorTimeline$1.G] - g) * percent;
- b += (frames[frame + ColorTimeline$1.B] - b) * percent;
- a += (frames[frame + ColorTimeline$1.A] - a) * percent;
- }
- if (alpha == 1)
- slot.color.set(r, g, b, a);
- else {
- let color = slot.color;
- if (blend == MixBlend$1.setup) color.setFromColor(slot.data.color);
- color.add((r - color.r) * alpha, (g - color.g) * alpha, (b - color.b) * alpha, (a - color.a) * alpha);
- }
- }
- } ColorTimeline$1.__initStatic15(); ColorTimeline$1.__initStatic16(); ColorTimeline$1.__initStatic17(); ColorTimeline$1.__initStatic18(); ColorTimeline$1.__initStatic19(); ColorTimeline$1.__initStatic20(); ColorTimeline$1.__initStatic21(); ColorTimeline$1.__initStatic22(); ColorTimeline$1.__initStatic23(); ColorTimeline$1.__initStatic24();
- /**
- * @public
- */
- class TwoColorTimeline$1 extends CurveTimeline$1 {
- static __initStatic25() {this.ENTRIES = 8;}
- static __initStatic26() {this.PREV_TIME = -8;} static __initStatic27() {this.PREV_R = -7;} static __initStatic28() {this.PREV_G = -6;} static __initStatic29() {this.PREV_B = -5;} static __initStatic30() {this.PREV_A = -4;}
- static __initStatic31() {this.PREV_R2 = -3;} static __initStatic32() {this.PREV_G2 = -2;} static __initStatic33() {this.PREV_B2 = -1;}
- static __initStatic34() {this.R = 1;} static __initStatic35() {this.G = 2;} static __initStatic36() {this.B = 3;} static __initStatic37() {this.A = 4;} static __initStatic38() {this.R2 = 5;} static __initStatic39() {this.G2 = 6;} static __initStatic40() {this.B2 = 7;}
-
- // time, r, g, b, a, r2, g2, b2, ...
- constructor (frameCount) {
- super(frameCount);
- this.frames = Utils.newFloatArray(frameCount * TwoColorTimeline$1.ENTRIES);
- }
- getPropertyId () {
- return (TimelineType$1.twoColor << 24) + this.slotIndex;
- }
- /** Sets the time and value of the specified keyframe. */
- setFrame (frameIndex, time, r, g, b, a, r2, g2, b2) {
- frameIndex *= TwoColorTimeline$1.ENTRIES;
- this.frames[frameIndex] = time;
- this.frames[frameIndex + TwoColorTimeline$1.R] = r;
- this.frames[frameIndex + TwoColorTimeline$1.G] = g;
- this.frames[frameIndex + TwoColorTimeline$1.B] = b;
- this.frames[frameIndex + TwoColorTimeline$1.A] = a;
- this.frames[frameIndex + TwoColorTimeline$1.R2] = r2;
- this.frames[frameIndex + TwoColorTimeline$1.G2] = g2;
- this.frames[frameIndex + TwoColorTimeline$1.B2] = b2;
- }
- apply (skeleton, lastTime, time, events, alpha, blend, direction) {
- let slot = skeleton.slots[this.slotIndex];
- let frames = this.frames;
- if (time < frames[0]) {
- switch (blend) {
- case MixBlend$1.setup:
- slot.color.setFromColor(slot.data.color);
- slot.darkColor.setFromColor(slot.data.darkColor);
- return;
- case MixBlend$1.first:
- let light = slot.color, dark = slot.darkColor, setupLight = slot.data.color, setupDark = slot.data.darkColor;
- light.add((setupLight.r - light.r) * alpha, (setupLight.g - light.g) * alpha, (setupLight.b - light.b) * alpha,
- (setupLight.a - light.a) * alpha);
- dark.add((setupDark.r - dark.r) * alpha, (setupDark.g - dark.g) * alpha, (setupDark.b - dark.b) * alpha, 0);
- }
- return;
- }
- let r = 0, g = 0, b = 0, a = 0, r2 = 0, g2 = 0, b2 = 0;
- if (time >= frames[frames.length - TwoColorTimeline$1.ENTRIES]) { // Time is after last frame.
- let i = frames.length;
- r = frames[i + TwoColorTimeline$1.PREV_R];
- g = frames[i + TwoColorTimeline$1.PREV_G];
- b = frames[i + TwoColorTimeline$1.PREV_B];
- a = frames[i + TwoColorTimeline$1.PREV_A];
- r2 = frames[i + TwoColorTimeline$1.PREV_R2];
- g2 = frames[i + TwoColorTimeline$1.PREV_G2];
- b2 = frames[i + TwoColorTimeline$1.PREV_B2];
- } else {
- // Interpolate between the previous frame and the current frame.
- let frame = Animation$1.binarySearch(frames, time, TwoColorTimeline$1.ENTRIES);
- r = frames[frame + TwoColorTimeline$1.PREV_R];
- g = frames[frame + TwoColorTimeline$1.PREV_G];
- b = frames[frame + TwoColorTimeline$1.PREV_B];
- a = frames[frame + TwoColorTimeline$1.PREV_A];
- r2 = frames[frame + TwoColorTimeline$1.PREV_R2];
- g2 = frames[frame + TwoColorTimeline$1.PREV_G2];
- b2 = frames[frame + TwoColorTimeline$1.PREV_B2];
- let frameTime = frames[frame];
- let percent = this.getCurvePercent(frame / TwoColorTimeline$1.ENTRIES - 1,
- 1 - (time - frameTime) / (frames[frame + TwoColorTimeline$1.PREV_TIME] - frameTime));
- r += (frames[frame + TwoColorTimeline$1.R] - r) * percent;
- g += (frames[frame + TwoColorTimeline$1.G] - g) * percent;
- b += (frames[frame + TwoColorTimeline$1.B] - b) * percent;
- a += (frames[frame + TwoColorTimeline$1.A] - a) * percent;
- r2 += (frames[frame + TwoColorTimeline$1.R2] - r2) * percent;
- g2 += (frames[frame + TwoColorTimeline$1.G2] - g2) * percent;
- b2 += (frames[frame + TwoColorTimeline$1.B2] - b2) * percent;
- }
- if (alpha == 1) {
- slot.color.set(r, g, b, a);
- slot.darkColor.set(r2, g2, b2, 1);
- } else {
- let light = slot.color, dark = slot.darkColor;
- if (blend == MixBlend$1.setup) {
- light.setFromColor(slot.data.color);
- dark.setFromColor(slot.data.darkColor);
- }
- light.add((r - light.r) * alpha, (g - light.g) * alpha, (b - light.b) * alpha, (a - light.a) * alpha);
- dark.add((r2 - dark.r) * alpha, (g2 - dark.g) * alpha, (b2 - dark.b) * alpha, 0);
- }
- }
- } TwoColorTimeline$1.__initStatic25(); TwoColorTimeline$1.__initStatic26(); TwoColorTimeline$1.__initStatic27(); TwoColorTimeline$1.__initStatic28(); TwoColorTimeline$1.__initStatic29(); TwoColorTimeline$1.__initStatic30(); TwoColorTimeline$1.__initStatic31(); TwoColorTimeline$1.__initStatic32(); TwoColorTimeline$1.__initStatic33(); TwoColorTimeline$1.__initStatic34(); TwoColorTimeline$1.__initStatic35(); TwoColorTimeline$1.__initStatic36(); TwoColorTimeline$1.__initStatic37(); TwoColorTimeline$1.__initStatic38(); TwoColorTimeline$1.__initStatic39(); TwoColorTimeline$1.__initStatic40();
- /**
- * @public
- */
- class AttachmentTimeline$1 {
-
- // time, ...
-
- constructor (frameCount) {
- this.frames = Utils.newFloatArray(frameCount);
- this.attachmentNames = new Array(frameCount);
- }
- getPropertyId () {
- return (TimelineType$1.attachment << 24) + this.slotIndex;
- }
- getFrameCount () {
- return this.frames.length;
- }
- /** Sets the time and value of the specified keyframe. */
- setFrame (frameIndex, time, attachmentName) {
- this.frames[frameIndex] = time;
- this.attachmentNames[frameIndex] = attachmentName;
- }
- apply (skeleton, lastTime, time, events, alpha, blend, direction) {
- let slot = skeleton.slots[this.slotIndex];
- if (direction == MixDirection$1.out && blend == MixBlend$1.setup) {
- let attachmentName = slot.data.attachmentName;
- slot.setAttachment(attachmentName == null ? null : skeleton.getAttachment(this.slotIndex, attachmentName));
- return;
- }
- let frames = this.frames;
- if (time < frames[0]) {
- if (blend == MixBlend$1.setup || blend == MixBlend$1.first) {
- let attachmentName = slot.data.attachmentName;
- slot.setAttachment(attachmentName == null ? null : skeleton.getAttachment(this.slotIndex, attachmentName));
- }
- return;
- }
- let frameIndex = 0;
- if (time >= frames[frames.length - 1]) // Time is after last frame.
- frameIndex = frames.length - 1;
- else
- frameIndex = Animation$1.binarySearch(frames, time, 1) - 1;
- let attachmentName = this.attachmentNames[frameIndex];
- skeleton.slots[this.slotIndex]
- .setAttachment(attachmentName == null ? null : skeleton.getAttachment(this.slotIndex, attachmentName));
- }
- }
- let zeros$1 = null;
- /**
- * @public
- */
- class DeformTimeline$1 extends CurveTimeline$1 {
-
-
- // time, ...
-
- constructor (frameCount) {
- super(frameCount);
- this.frames = Utils.newFloatArray(frameCount);
- this.frameVertices = new Array(frameCount);
- if (zeros$1 == null) zeros$1 = Utils.newFloatArray(64);
- }
- getPropertyId () {
- return (TimelineType$1.deform << 27) + + this.attachment.id + this.slotIndex;
- }
- /** Sets the time of the specified keyframe. */
- setFrame (frameIndex, time, vertices) {
- this.frames[frameIndex] = time;
- this.frameVertices[frameIndex] = vertices;
- }
- apply (skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
- let slot = skeleton.slots[this.slotIndex];
- let slotAttachment = slot.getAttachment();
- if (!(slotAttachment instanceof VertexAttachment$1) || !(slotAttachment).applyDeform(this.attachment)) return;
- let verticesArray = slot.attachmentVertices;
- if (verticesArray.length == 0) blend = MixBlend$1.setup;
- let frameVertices = this.frameVertices;
- let vertexCount = frameVertices[0].length;
- let frames = this.frames;
- if (time < frames[0]) {
- let vertexAttachment = slotAttachment;
- switch (blend) {
- case MixBlend$1.setup:
- verticesArray.length = 0;
- return;
- case MixBlend$1.first:
- if (alpha == 1) {
- verticesArray.length = 0;
- break;
- }
- let vertices = Utils.setArraySize(verticesArray, vertexCount);
- if (vertexAttachment.bones == null) {
- // Unweighted vertex positions.
- let setupVertices = vertexAttachment.vertices;
- for (let i = 0; i < vertexCount; i++)
- vertices[i] += (setupVertices[i] - vertices[i]) * alpha;
- } else {
- // Weighted deform offsets.
- alpha = 1 - alpha;
- for (let i = 0; i < vertexCount; i++)
- vertices[i] *= alpha;
- }
- }
- return;
- }
- let vertices = Utils.setArraySize(verticesArray, vertexCount);
- if (time >= frames[frames.length - 1]) { // Time is after last frame.
- let lastVertices = frameVertices[frames.length - 1];
- if (alpha == 1) {
- if (blend == MixBlend$1.add) {
- let vertexAttachment = slotAttachment ;
- if (vertexAttachment.bones == null) {
- // Unweighted vertex positions, with alpha.
- let setupVertices = vertexAttachment.vertices;
- for (let i = 0; i < vertexCount; i++) {
- vertices[i] += lastVertices[i] - setupVertices[i];
- }
- } else {
- // Weighted deform offsets, with alpha.
- for (let i = 0; i < vertexCount; i++)
- vertices[i] += lastVertices[i];
- }
- } else {
- Utils.arrayCopy(lastVertices, 0, vertices, 0, vertexCount);
- }
- } else {
- switch (blend) {
- case MixBlend$1.setup: {
- let vertexAttachment = slotAttachment ;
- if (vertexAttachment.bones == null) {
- // Unweighted vertex positions, with alpha.
- let setupVertices = vertexAttachment.vertices;
- for (let i = 0; i < vertexCount; i++) {
- let setup = setupVertices[i];
- vertices[i] = setup + (lastVertices[i] - setup) * alpha;
- }
- } else {
- // Weighted deform offsets, with alpha.
- for (let i = 0; i < vertexCount; i++)
- vertices[i] = lastVertices[i] * alpha;
- }
- break;
- }
- case MixBlend$1.first:
- case MixBlend$1.replace:
- for (let i = 0; i < vertexCount; i++)
- vertices[i] += (lastVertices[i] - vertices[i]) * alpha;
- case MixBlend$1.add:
- let vertexAttachment = slotAttachment ;
- if (vertexAttachment.bones == null) {
- // Unweighted vertex positions, with alpha.
- let setupVertices = vertexAttachment.vertices;
- for (let i = 0; i < vertexCount; i++) {
- vertices[i] += (lastVertices[i] - setupVertices[i]) * alpha;
- }
- } else {
- // Weighted deform offsets, with alpha.
- for (let i = 0; i < vertexCount; i++)
- vertices[i] += lastVertices[i] * alpha;
- }
- }
- }
- return;
- }
- // Interpolate between the previous frame and the current frame.
- let frame = Animation$1.binarySearch(frames, time);
- let prevVertices = frameVertices[frame - 1];
- let nextVertices = frameVertices[frame];
- let frameTime = frames[frame];
- let percent = this.getCurvePercent(frame - 1, 1 - (time - frameTime) / (frames[frame - 1] - frameTime));
- if (alpha == 1) {
- if (blend == MixBlend$1.add) {
- let vertexAttachment = slotAttachment ;
- if (vertexAttachment.bones == null) {
- // Unweighted vertex positions, with alpha.
- let setupVertices = vertexAttachment.vertices;
- for (let i = 0; i < vertexCount; i++) {
- let prev = prevVertices[i];
- vertices[i] += prev + (nextVertices[i] - prev) * percent - setupVertices[i];
- }
- } else {
- // Weighted deform offsets, with alpha.
- for (let i = 0; i < vertexCount; i++) {
- let prev = prevVertices[i];
- vertices[i] += prev + (nextVertices[i] - prev) * percent;
- }
- }
- } else {
- for (let i = 0; i < vertexCount; i++) {
- let prev = prevVertices[i];
- vertices[i] = prev + (nextVertices[i] - prev) * percent;
- }
- }
- } else {
- switch (blend) {
- case MixBlend$1.setup: {
- let vertexAttachment = slotAttachment ;
- if (vertexAttachment.bones == null) {
- // Unweighted vertex positions, with alpha.
- let setupVertices = vertexAttachment.vertices;
- for (let i = 0; i < vertexCount; i++) {
- let prev = prevVertices[i], setup = setupVertices[i];
- vertices[i] = setup + (prev + (nextVertices[i] - prev) * percent - setup) * alpha;
- }
- } else {
- // Weighted deform offsets, with alpha.
- for (let i = 0; i < vertexCount; i++) {
- let prev = prevVertices[i];
- vertices[i] = (prev + (nextVertices[i] - prev) * percent) * alpha;
- }
- }
- break;
- }
- case MixBlend$1.first:
- case MixBlend$1.replace:
- for (let i = 0; i < vertexCount; i++) {
- let prev = prevVertices[i];
- vertices[i] += (prev + (nextVertices[i] - prev) * percent - vertices[i]) * alpha;
- }
- break;
- case MixBlend$1.add:
- let vertexAttachment = slotAttachment ;
- if (vertexAttachment.bones == null) {
- // Unweighted vertex positions, with alpha.
- let setupVertices = vertexAttachment.vertices;
- for (let i = 0; i < vertexCount; i++) {
- let prev = prevVertices[i];
- vertices[i] += (prev + (nextVertices[i] - prev) * percent - setupVertices[i]) * alpha;
- }
- } else {
- // Weighted deform offsets, with alpha.
- for (let i = 0; i < vertexCount; i++) {
- let prev = prevVertices[i];
- vertices[i] += (prev + (nextVertices[i] - prev) * percent) * alpha;
- }
- }
- }
- }
- }
- }
- /**
- * @public
- */
- class EventTimeline$1 {
- // time, ...
-
- constructor (frameCount) {
- this.frames = Utils.newFloatArray(frameCount);
- this.events = new Array(frameCount);
- }
- getPropertyId () {
- return TimelineType$1.event << 24;
- }
- getFrameCount () {
- return this.frames.length;
- }
- /** Sets the time of the specified keyframe. */
- setFrame (frameIndex, event) {
- this.frames[frameIndex] = event.time;
- this.events[frameIndex] = event;
- }
- /** Fires events for frames > lastTime and <= time. */
- apply (skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
- if (firedEvents == null) return;
- let frames = this.frames;
- let frameCount = this.frames.length;
- if (lastTime > time) { // Fire events after last time for looped animations.
- this.apply(skeleton, lastTime, Number.MAX_VALUE, firedEvents, alpha, blend, direction);
- lastTime = -1;
- } else if (lastTime >= frames[frameCount - 1]) // Last time is after last frame.
- return;
- if (time < frames[0]) return; // Time is before first frame.
- let frame = 0;
- if (lastTime < frames[0])
- frame = 0;
- else {
- frame = Animation$1.binarySearch(frames, lastTime);
- let frameTime = frames[frame];
- while (frame > 0) { // Fire multiple events with the same frame.
- if (frames[frame - 1] != frameTime) break;
- frame--;
- }
- }
- for (; frame < frameCount && time >= frames[frame]; frame++)
- firedEvents.push(this.events[frame]);
- }
- }
- /**
- * @public
- */
- class DrawOrderTimeline$1 {
- // time, ...
-
- constructor (frameCount) {
- this.frames = Utils.newFloatArray(frameCount);
- this.drawOrders = new Array(frameCount);
- }
- getPropertyId () {
- return TimelineType$1.drawOrder << 24;
- }
- getFrameCount () {
- return this.frames.length;
- }
- /** Sets the time of the specified keyframe.
- * @param drawOrder May be null to use bind pose draw order. */
- setFrame (frameIndex, time, drawOrder) {
- this.frames[frameIndex] = time;
- this.drawOrders[frameIndex] = drawOrder;
- }
- apply (skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
- let drawOrder = skeleton.drawOrder;
- let slots = skeleton.slots;
- if (direction == MixDirection$1.out && blend == MixBlend$1.setup) {
- Utils.arrayCopy(skeleton.slots, 0, skeleton.drawOrder, 0, skeleton.slots.length);
- return;
- }
- let frames = this.frames;
- if (time < frames[0]) {
- if (blend == MixBlend$1.setup || blend == MixBlend$1.first) Utils.arrayCopy(skeleton.slots, 0, skeleton.drawOrder, 0, skeleton.slots.length);
- return;
- }
- let frame = 0;
- if (time >= frames[frames.length - 1]) // Time is after last frame.
- frame = frames.length - 1;
- else
- frame = Animation$1.binarySearch(frames, time) - 1;
- let drawOrderToSetupIndex = this.drawOrders[frame];
- if (drawOrderToSetupIndex == null)
- Utils.arrayCopy(slots, 0, drawOrder, 0, slots.length);
- else {
- for (let i = 0, n = drawOrderToSetupIndex.length; i < n; i++)
- drawOrder[i] = slots[drawOrderToSetupIndex[i]];
- }
- }
- }
- /**
- * @public
- */
- class IkConstraintTimeline$1 extends CurveTimeline$1 {
- static __initStatic41() {this.ENTRIES = 5;}
- static __initStatic42() {this.PREV_TIME = -5;} static __initStatic43() {this.PREV_MIX = -4;} static __initStatic44() {this.PREV_BEND_DIRECTION = -3;} static __initStatic45() {this.PREV_COMPRESS = -2;} static __initStatic46() {this.PREV_STRETCH = -1;}
- static __initStatic47() {this.MIX = 1;} static __initStatic48() {this.BEND_DIRECTION = 2;} static __initStatic49() {this.COMPRESS = 3;} static __initStatic50() {this.STRETCH = 4;}
-
- // time, mix, bendDirection, compress, stretch, ...
- constructor (frameCount) {
- super(frameCount);
- this.frames = Utils.newFloatArray(frameCount * IkConstraintTimeline$1.ENTRIES);
- }
- getPropertyId () {
- return (TimelineType$1.ikConstraint << 24) + this.ikConstraintIndex;
- }
- /** Sets the time, mix and bend direction of the specified keyframe. */
- setFrame (frameIndex, time, mix, bendDirection, compress, stretch) {
- frameIndex *= IkConstraintTimeline$1.ENTRIES;
- this.frames[frameIndex] = time;
- this.frames[frameIndex + IkConstraintTimeline$1.MIX] = mix;
- this.frames[frameIndex + IkConstraintTimeline$1.BEND_DIRECTION] = bendDirection;
- this.frames[frameIndex + IkConstraintTimeline$1.COMPRESS] = compress ? 1 : 0;
- this.frames[frameIndex + IkConstraintTimeline$1.STRETCH] = stretch ? 1 : 0;
- }
- apply (skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
- let frames = this.frames;
- let constraint = skeleton.ikConstraints[this.ikConstraintIndex];
- if (time < frames[0]) {
- switch (blend) {
- case MixBlend$1.setup:
- constraint.mix = constraint.data.mix;
- constraint.bendDirection = constraint.data.bendDirection;
- constraint.compress = constraint.data.compress;
- constraint.stretch = constraint.data.stretch;
- return;
- case MixBlend$1.first:
- constraint.mix += (constraint.data.mix - constraint.mix) * alpha;
- constraint.bendDirection = constraint.data.bendDirection;
- constraint.compress = constraint.data.compress;
- constraint.stretch = constraint.data.stretch;
- }
- return;
- }
- if (time >= frames[frames.length - IkConstraintTimeline$1.ENTRIES]) { // Time is after last frame.
- if (blend == MixBlend$1.setup) {
- constraint.mix = constraint.data.mix + (frames[frames.length + IkConstraintTimeline$1.PREV_MIX] - constraint.data.mix) * alpha;
- if (direction == MixDirection$1.out) {
- constraint.bendDirection = constraint.data.bendDirection;
- constraint.compress = constraint.data.compress;
- constraint.stretch = constraint.data.stretch;
- } else {
- constraint.bendDirection = frames[frames.length + IkConstraintTimeline$1.PREV_BEND_DIRECTION];
- constraint.compress = frames[frames.length + IkConstraintTimeline$1.PREV_COMPRESS] != 0;
- constraint.stretch = frames[frames.length + IkConstraintTimeline$1.PREV_STRETCH] != 0;
- }
- } else {
- constraint.mix += (frames[frames.length + IkConstraintTimeline$1.PREV_MIX] - constraint.mix) * alpha;
- if (direction == MixDirection$1.in) {
- constraint.bendDirection = frames[frames.length + IkConstraintTimeline$1.PREV_BEND_DIRECTION];
- constraint.compress = frames[frames.length + IkConstraintTimeline$1.PREV_COMPRESS] != 0;
- constraint.stretch = frames[frames.length + IkConstraintTimeline$1.PREV_STRETCH] != 0;
- }
- }
- return;
- }
- // Interpolate between the previous frame and the current frame.
- let frame = Animation$1.binarySearch(frames, time, IkConstraintTimeline$1.ENTRIES);
- let mix = frames[frame + IkConstraintTimeline$1.PREV_MIX];
- let frameTime = frames[frame];
- let percent = this.getCurvePercent(frame / IkConstraintTimeline$1.ENTRIES - 1,
- 1 - (time - frameTime) / (frames[frame + IkConstraintTimeline$1.PREV_TIME] - frameTime));
- if (blend == MixBlend$1.setup) {
- constraint.mix = constraint.data.mix + (mix + (frames[frame + IkConstraintTimeline$1.MIX] - mix) * percent - constraint.data.mix) * alpha;
- if (direction == MixDirection$1.out) {
- constraint.bendDirection = constraint.data.bendDirection;
- constraint.compress = constraint.data.compress;
- constraint.stretch = constraint.data.stretch;
- } else {
- constraint.bendDirection = frames[frame + IkConstraintTimeline$1.PREV_BEND_DIRECTION];
- constraint.compress = frames[frame + IkConstraintTimeline$1.PREV_COMPRESS] != 0;
- constraint.stretch = frames[frame + IkConstraintTimeline$1.PREV_STRETCH] != 0;
- }
- } else {
- constraint.mix += (mix + (frames[frame + IkConstraintTimeline$1.MIX] - mix) * percent - constraint.mix) * alpha;
- if (direction == MixDirection$1.in) {
- constraint.bendDirection = frames[frame + IkConstraintTimeline$1.PREV_BEND_DIRECTION];
- constraint.compress = frames[frame + IkConstraintTimeline$1.PREV_COMPRESS] != 0;
- constraint.stretch = frames[frame + IkConstraintTimeline$1.PREV_STRETCH] != 0;
- }
- }
- }
- } IkConstraintTimeline$1.__initStatic41(); IkConstraintTimeline$1.__initStatic42(); IkConstraintTimeline$1.__initStatic43(); IkConstraintTimeline$1.__initStatic44(); IkConstraintTimeline$1.__initStatic45(); IkConstraintTimeline$1.__initStatic46(); IkConstraintTimeline$1.__initStatic47(); IkConstraintTimeline$1.__initStatic48(); IkConstraintTimeline$1.__initStatic49(); IkConstraintTimeline$1.__initStatic50();
- /**
- * @public
- */
- class TransformConstraintTimeline$1 extends CurveTimeline$1 {
- static __initStatic51() {this.ENTRIES = 5;}
- static __initStatic52() {this.PREV_TIME = -5;} static __initStatic53() {this.PREV_ROTATE = -4;} static __initStatic54() {this.PREV_TRANSLATE = -3;} static __initStatic55() {this.PREV_SCALE = -2;} static __initStatic56() {this.PREV_SHEAR = -1;}
- static __initStatic57() {this.ROTATE = 1;} static __initStatic58() {this.TRANSLATE = 2;} static __initStatic59() {this.SCALE = 3;} static __initStatic60() {this.SHEAR = 4;}
-
- // time, rotate mix, translate mix, scale mix, shear mix, ...
- constructor (frameCount) {
- super(frameCount);
- this.frames = Utils.newFloatArray(frameCount * TransformConstraintTimeline$1.ENTRIES);
- }
- getPropertyId () {
- return (TimelineType$1.transformConstraint << 24) + this.transformConstraintIndex;
- }
- /** Sets the time and mixes of the specified keyframe. */
- setFrame (frameIndex, time, rotateMix, translateMix, scaleMix, shearMix) {
- frameIndex *= TransformConstraintTimeline$1.ENTRIES;
- this.frames[frameIndex] = time;
- this.frames[frameIndex + TransformConstraintTimeline$1.ROTATE] = rotateMix;
- this.frames[frameIndex + TransformConstraintTimeline$1.TRANSLATE] = translateMix;
- this.frames[frameIndex + TransformConstraintTimeline$1.SCALE] = scaleMix;
- this.frames[frameIndex + TransformConstraintTimeline$1.SHEAR] = shearMix;
- }
- apply (skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
- let frames = this.frames;
- let constraint = skeleton.transformConstraints[this.transformConstraintIndex];
- if (time < frames[0]) {
- let data = constraint.data;
- switch (blend) {
- case MixBlend$1.setup:
- constraint.rotateMix = data.rotateMix;
- constraint.translateMix = data.translateMix;
- constraint.scaleMix = data.scaleMix;
- constraint.shearMix = data.shearMix;
- return;
- case MixBlend$1.first:
- constraint.rotateMix += (data.rotateMix - constraint.rotateMix) * alpha;
- constraint.translateMix += (data.translateMix - constraint.translateMix) * alpha;
- constraint.scaleMix += (data.scaleMix - constraint.scaleMix) * alpha;
- constraint.shearMix += (data.shearMix - constraint.shearMix) * alpha;
- }
- return;
- }
- let rotate = 0, translate = 0, scale = 0, shear = 0;
- if (time >= frames[frames.length - TransformConstraintTimeline$1.ENTRIES]) { // Time is after last frame.
- let i = frames.length;
- rotate = frames[i + TransformConstraintTimeline$1.PREV_ROTATE];
- translate = frames[i + TransformConstraintTimeline$1.PREV_TRANSLATE];
- scale = frames[i + TransformConstraintTimeline$1.PREV_SCALE];
- shear = frames[i + TransformConstraintTimeline$1.PREV_SHEAR];
- } else {
- // Interpolate between the previous frame and the current frame.
- let frame = Animation$1.binarySearch(frames, time, TransformConstraintTimeline$1.ENTRIES);
- rotate = frames[frame + TransformConstraintTimeline$1.PREV_ROTATE];
- translate = frames[frame + TransformConstraintTimeline$1.PREV_TRANSLATE];
- scale = frames[frame + TransformConstraintTimeline$1.PREV_SCALE];
- shear = frames[frame + TransformConstraintTimeline$1.PREV_SHEAR];
- let frameTime = frames[frame];
- let percent = this.getCurvePercent(frame / TransformConstraintTimeline$1.ENTRIES - 1,
- 1 - (time - frameTime) / (frames[frame + TransformConstraintTimeline$1.PREV_TIME] - frameTime));
- rotate += (frames[frame + TransformConstraintTimeline$1.ROTATE] - rotate) * percent;
- translate += (frames[frame + TransformConstraintTimeline$1.TRANSLATE] - translate) * percent;
- scale += (frames[frame + TransformConstraintTimeline$1.SCALE] - scale) * percent;
- shear += (frames[frame + TransformConstraintTimeline$1.SHEAR] - shear) * percent;
- }
- if (blend == MixBlend$1.setup) {
- let data = constraint.data;
- constraint.rotateMix = data.rotateMix + (rotate - data.rotateMix) * alpha;
- constraint.translateMix = data.translateMix + (translate - data.translateMix) * alpha;
- constraint.scaleMix = data.scaleMix + (scale - data.scaleMix) * alpha;
- constraint.shearMix = data.shearMix + (shear - data.shearMix) * alpha;
- } else {
- constraint.rotateMix += (rotate - constraint.rotateMix) * alpha;
- constraint.translateMix += (translate - constraint.translateMix) * alpha;
- constraint.scaleMix += (scale - constraint.scaleMix) * alpha;
- constraint.shearMix += (shear - constraint.shearMix) * alpha;
- }
- }
- } TransformConstraintTimeline$1.__initStatic51(); TransformConstraintTimeline$1.__initStatic52(); TransformConstraintTimeline$1.__initStatic53(); TransformConstraintTimeline$1.__initStatic54(); TransformConstraintTimeline$1.__initStatic55(); TransformConstraintTimeline$1.__initStatic56(); TransformConstraintTimeline$1.__initStatic57(); TransformConstraintTimeline$1.__initStatic58(); TransformConstraintTimeline$1.__initStatic59(); TransformConstraintTimeline$1.__initStatic60();
- /**
- * @public
- */
- class PathConstraintPositionTimeline$1 extends CurveTimeline$1 {
- static __initStatic61() {this.ENTRIES = 2;}
- static __initStatic62() {this.PREV_TIME = -2;} static __initStatic63() {this.PREV_VALUE = -1;}
- static __initStatic64() {this.VALUE = 1;}
-
- // time, position, ...
- constructor (frameCount) {
- super(frameCount);
- this.frames = Utils.newFloatArray(frameCount * PathConstraintPositionTimeline$1.ENTRIES);
- }
- getPropertyId () {
- return (TimelineType$1.pathConstraintPosition << 24) + this.pathConstraintIndex;
- }
- /** Sets the time and value of the specified keyframe. */
- setFrame (frameIndex, time, value) {
- frameIndex *= PathConstraintPositionTimeline$1.ENTRIES;
- this.frames[frameIndex] = time;
- this.frames[frameIndex + PathConstraintPositionTimeline$1.VALUE] = value;
- }
- apply (skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
- let frames = this.frames;
- let constraint = skeleton.pathConstraints[this.pathConstraintIndex];
- if (time < frames[0]) {
- switch (blend) {
- case MixBlend$1.setup:
- constraint.position = constraint.data.position;
- return;
- case MixBlend$1.first:
- constraint.position += (constraint.data.position - constraint.position) * alpha;
- }
- return;
- }
- let position = 0;
- if (time >= frames[frames.length - PathConstraintPositionTimeline$1.ENTRIES]) // Time is after last frame.
- position = frames[frames.length + PathConstraintPositionTimeline$1.PREV_VALUE];
- else {
- // Interpolate between the previous frame and the current frame.
- let frame = Animation$1.binarySearch(frames, time, PathConstraintPositionTimeline$1.ENTRIES);
- position = frames[frame + PathConstraintPositionTimeline$1.PREV_VALUE];
- let frameTime = frames[frame];
- let percent = this.getCurvePercent(frame / PathConstraintPositionTimeline$1.ENTRIES - 1,
- 1 - (time - frameTime) / (frames[frame + PathConstraintPositionTimeline$1.PREV_TIME] - frameTime));
- position += (frames[frame + PathConstraintPositionTimeline$1.VALUE] - position) * percent;
- }
- if (blend == MixBlend$1.setup)
- constraint.position = constraint.data.position + (position - constraint.data.position) * alpha;
- else
- constraint.position += (position - constraint.position) * alpha;
- }
- } PathConstraintPositionTimeline$1.__initStatic61(); PathConstraintPositionTimeline$1.__initStatic62(); PathConstraintPositionTimeline$1.__initStatic63(); PathConstraintPositionTimeline$1.__initStatic64();
- /**
- * @public
- */
- class PathConstraintSpacingTimeline$1 extends PathConstraintPositionTimeline$1 {
- constructor (frameCount) {
- super(frameCount);
- }
- getPropertyId () {
- return (TimelineType$1.pathConstraintSpacing << 24) + this.pathConstraintIndex;
- }
- apply (skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
- let frames = this.frames;
- let constraint = skeleton.pathConstraints[this.pathConstraintIndex];
- if (time < frames[0]) {
- switch (blend) {
- case MixBlend$1.setup:
- constraint.spacing = constraint.data.spacing;
- return;
- case MixBlend$1.first:
- constraint.spacing += (constraint.data.spacing - constraint.spacing) * alpha;
- }
- return;
- }
- let spacing = 0;
- if (time >= frames[frames.length - PathConstraintSpacingTimeline$1.ENTRIES]) // Time is after last frame.
- spacing = frames[frames.length + PathConstraintSpacingTimeline$1.PREV_VALUE];
- else {
- // Interpolate between the previous frame and the current frame.
- let frame = Animation$1.binarySearch(frames, time, PathConstraintSpacingTimeline$1.ENTRIES);
- spacing = frames[frame + PathConstraintSpacingTimeline$1.PREV_VALUE];
- let frameTime = frames[frame];
- let percent = this.getCurvePercent(frame / PathConstraintSpacingTimeline$1.ENTRIES - 1,
- 1 - (time - frameTime) / (frames[frame + PathConstraintSpacingTimeline$1.PREV_TIME] - frameTime));
- spacing += (frames[frame + PathConstraintSpacingTimeline$1.VALUE] - spacing) * percent;
- }
- if (blend == MixBlend$1.setup)
- constraint.spacing = constraint.data.spacing + (spacing - constraint.data.spacing) * alpha;
- else
- constraint.spacing += (spacing - constraint.spacing) * alpha;
- }
- }
- /**
- * @public
- */
- class PathConstraintMixTimeline$1 extends CurveTimeline$1 {
- static __initStatic65() {this.ENTRIES = 3;}
- static __initStatic66() {this.PREV_TIME = -3;} static __initStatic67() {this.PREV_ROTATE = -2;} static __initStatic68() {this.PREV_TRANSLATE = -1;}
- static __initStatic69() {this.ROTATE = 1;} static __initStatic70() {this.TRANSLATE = 2;}
-
- // time, rotate mix, translate mix, ...
- constructor (frameCount) {
- super(frameCount);
- this.frames = Utils.newFloatArray(frameCount * PathConstraintMixTimeline$1.ENTRIES);
- }
- getPropertyId () {
- return (TimelineType$1.pathConstraintMix << 24) + this.pathConstraintIndex;
- }
- /** Sets the time and mixes of the specified keyframe. */
- setFrame (frameIndex, time, rotateMix, translateMix) {
- frameIndex *= PathConstraintMixTimeline$1.ENTRIES;
- this.frames[frameIndex] = time;
- this.frames[frameIndex + PathConstraintMixTimeline$1.ROTATE] = rotateMix;
- this.frames[frameIndex + PathConstraintMixTimeline$1.TRANSLATE] = translateMix;
- }
- apply (skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
- let frames = this.frames;
- let constraint = skeleton.pathConstraints[this.pathConstraintIndex];
- if (time < frames[0]) {
- switch (blend) {
- case MixBlend$1.setup:
- constraint.rotateMix = constraint.data.rotateMix;
- constraint.translateMix = constraint.data.translateMix;
- return;
- case MixBlend$1.first:
- constraint.rotateMix += (constraint.data.rotateMix - constraint.rotateMix) * alpha;
- constraint.translateMix += (constraint.data.translateMix - constraint.translateMix) * alpha;
- }
- return;
- }
- let rotate = 0, translate = 0;
- if (time >= frames[frames.length - PathConstraintMixTimeline$1.ENTRIES]) { // Time is after last frame.
- rotate = frames[frames.length + PathConstraintMixTimeline$1.PREV_ROTATE];
- translate = frames[frames.length + PathConstraintMixTimeline$1.PREV_TRANSLATE];
- } else {
- // Interpolate between the previous frame and the current frame.
- let frame = Animation$1.binarySearch(frames, time, PathConstraintMixTimeline$1.ENTRIES);
- rotate = frames[frame + PathConstraintMixTimeline$1.PREV_ROTATE];
- translate = frames[frame + PathConstraintMixTimeline$1.PREV_TRANSLATE];
- let frameTime = frames[frame];
- let percent = this.getCurvePercent(frame / PathConstraintMixTimeline$1.ENTRIES - 1,
- 1 - (time - frameTime) / (frames[frame + PathConstraintMixTimeline$1.PREV_TIME] - frameTime));
- rotate += (frames[frame + PathConstraintMixTimeline$1.ROTATE] - rotate) * percent;
- translate += (frames[frame + PathConstraintMixTimeline$1.TRANSLATE] - translate) * percent;
- }
- if (blend == MixBlend$1.setup) {
- constraint.rotateMix = constraint.data.rotateMix + (rotate - constraint.data.rotateMix) * alpha;
- constraint.translateMix = constraint.data.translateMix + (translate - constraint.data.translateMix) * alpha;
- } else {
- constraint.rotateMix += (rotate - constraint.rotateMix) * alpha;
- constraint.translateMix += (translate - constraint.translateMix) * alpha;
- }
- }
- } PathConstraintMixTimeline$1.__initStatic65(); PathConstraintMixTimeline$1.__initStatic66(); PathConstraintMixTimeline$1.__initStatic67(); PathConstraintMixTimeline$1.__initStatic68(); PathConstraintMixTimeline$1.__initStatic69(); PathConstraintMixTimeline$1.__initStatic70();
- /**
- * @public
- */
- class AnimationState$1 {
- static __initStatic() {this.emptyAnimation = new Animation$1("<empty>", [], 0);}
- static __initStatic2() {this.SUBSEQUENT = 0;}
- static __initStatic3() {this.FIRST = 1;}
- static __initStatic4() {this.HOLD = 2;}
- static __initStatic5() {this.HOLD_MIX = 3;}
-
- __init() {this.tracks = new Array();}
- __init2() {this.events = new Array();}
- __init3() {this.listeners = new Array();}
- __init4() {this.queue = new EventQueue$1(this);}
- __init5() {this.propertyIDs = new IntSet();}
- __init6() {this.animationsChanged = false;}
- __init7() {this.timeScale = 1;}
- __init8() {this.trackEntryPool = new Pool(() => new TrackEntry$1());}
- constructor (data) {AnimationState$1.prototype.__init.call(this);AnimationState$1.prototype.__init2.call(this);AnimationState$1.prototype.__init3.call(this);AnimationState$1.prototype.__init4.call(this);AnimationState$1.prototype.__init5.call(this);AnimationState$1.prototype.__init6.call(this);AnimationState$1.prototype.__init7.call(this);AnimationState$1.prototype.__init8.call(this);
- this.data = data;
- }
- update (delta) {
- delta *= this.timeScale;
- let tracks = this.tracks;
- for (let i = 0, n = tracks.length; i < n; i++) {
- let current = tracks[i];
- if (current == null) continue;
- current.animationLast = current.nextAnimationLast;
- current.trackLast = current.nextTrackLast;
- let currentDelta = delta * current.timeScale;
- if (current.delay > 0) {
- current.delay -= currentDelta;
- if (current.delay > 0) continue;
- currentDelta = -current.delay;
- current.delay = 0;
- }
- let next = current.next;
- if (next != null) {
- // When the next entry's delay is passed, change to the next entry, preserving leftover time.
- let nextTime = current.trackLast - next.delay;
- if (nextTime >= 0) {
- next.delay = 0;
- next.trackTime = current.timeScale == 0 ? 0 : (nextTime / current.timeScale + delta) * next.timeScale;
- current.trackTime += currentDelta;
- this.setCurrent(i, next, true);
- while (next.mixingFrom != null) {
- next.mixTime += delta;
- next = next.mixingFrom;
- }
- continue;
- }
- } else if (current.trackLast >= current.trackEnd && current.mixingFrom == null) {
- tracks[i] = null;
- this.queue.end(current);
- this.disposeNext(current);
- continue;
- }
- if (current.mixingFrom != null && this.updateMixingFrom(current, delta)) {
- // End mixing from entries once all have completed.
- let from = current.mixingFrom;
- current.mixingFrom = null;
- if (from != null) from.mixingTo = null;
- while (from != null) {
- this.queue.end(from);
- from = from.mixingFrom;
- }
- }
- current.trackTime += currentDelta;
- }
- this.queue.drain();
- }
- updateMixingFrom (to, delta) {
- let from = to.mixingFrom;
- if (from == null) return true;
- let finished = this.updateMixingFrom(from, delta);
- from.animationLast = from.nextAnimationLast;
- from.trackLast = from.nextTrackLast;
- // Require mixTime > 0 to ensure the mixing from entry was applied at least once.
- if (to.mixTime > 0 && to.mixTime >= to.mixDuration) {
- // Require totalAlpha == 0 to ensure mixing is complete, unless mixDuration == 0 (the transition is a single frame).
- if (from.totalAlpha == 0 || to.mixDuration == 0) {
- to.mixingFrom = from.mixingFrom;
- if (from.mixingFrom != null) from.mixingFrom.mixingTo = to;
- to.interruptAlpha = from.interruptAlpha;
- this.queue.end(from);
- }
- return finished;
- }
- from.trackTime += delta * from.timeScale;
- to.mixTime += delta;
- return false;
- }
- apply (skeleton) {
- if (skeleton == null) throw new Error("skeleton cannot be null.");
- if (this.animationsChanged) this._animationsChanged();
- let events = this.events;
- let tracks = this.tracks;
- let applied = false;
- for (let i = 0, n = tracks.length; i < n; i++) {
- let current = tracks[i];
- if (current == null || current.delay > 0) continue;
- applied = true;
- let blend = i == 0 ? MixBlend$1.first : current.mixBlend;
- // Apply mixing from entries first.
- let mix = current.alpha;
- if (current.mixingFrom != null)
- mix *= this.applyMixingFrom(current, skeleton, blend);
- else if (current.trackTime >= current.trackEnd && current.next == null)
- mix = 0;
- // Apply current entry.
- let animationLast = current.animationLast, animationTime = current.getAnimationTime();
- let timelineCount = current.animation.timelines.length;
- let timelines = current.animation.timelines;
- if ((i == 0 && mix == 1) || blend == MixBlend$1.add) {
- for (let ii = 0; ii < timelineCount; ii++) {
- // Fixes issue #302 on IOS9 where mix, blend sometimes became undefined and caused assets
- // to sometimes stop rendering when using color correction, as their RGBA values become NaN.
- // (https://github.com/pixijs/pixi-spine/issues/302)
- Utils.webkit602BugfixHelper(mix, blend);
- timelines[ii].apply(skeleton, animationLast, animationTime, events, mix, blend, MixDirection$1.in);
- }
- } else {
- let timelineMode = current.timelineMode;
- let firstFrame = current.timelinesRotation.length == 0;
- if (firstFrame) Utils.setArraySize(current.timelinesRotation, timelineCount << 1, null);
- let timelinesRotation = current.timelinesRotation;
- for (let ii = 0; ii < timelineCount; ii++) {
- let timeline = timelines[ii];
- let timelineBlend = timelineMode[ii] == AnimationState$1.SUBSEQUENT ? blend : MixBlend$1.setup;
- if (timeline instanceof RotateTimeline$1) {
- this.applyRotateTimeline(timeline, skeleton, animationTime, mix, timelineBlend, timelinesRotation, ii << 1, firstFrame);
- } else {
- // This fixes the WebKit 602 specific issue described at http://esotericsoftware.com/forum/iOS-10-disappearing-graphics-10109
- Utils.webkit602BugfixHelper(mix, blend);
- timeline.apply(skeleton, animationLast, animationTime, events, mix, timelineBlend, MixDirection$1.in);
- }
- }
- }
- this.queueEvents(current, animationTime);
- events.length = 0;
- current.nextAnimationLast = animationTime;
- current.nextTrackLast = current.trackTime;
- }
- this.queue.drain();
- return applied;
- }
- applyMixingFrom (to, skeleton, blend) {
- let from = to.mixingFrom;
- if (from.mixingFrom != null) this.applyMixingFrom(from, skeleton, blend);
- let mix = 0;
- if (to.mixDuration == 0) { // Single frame mix to undo mixingFrom changes.
- mix = 1;
- if (blend == MixBlend$1.first) blend = MixBlend$1.setup;
- } else {
- mix = to.mixTime / to.mixDuration;
- if (mix > 1) mix = 1;
- if (blend != MixBlend$1.first) blend = from.mixBlend;
- }
- let events = mix < from.eventThreshold ? this.events : null;
- let attachments = mix < from.attachmentThreshold, drawOrder = mix < from.drawOrderThreshold;
- let animationLast = from.animationLast, animationTime = from.getAnimationTime();
- let timelineCount = from.animation.timelines.length;
- let timelines = from.animation.timelines;
- let alphaHold = from.alpha * to.interruptAlpha, alphaMix = alphaHold * (1 - mix);
- if (blend == MixBlend$1.add) {
- for (let i = 0; i < timelineCount; i++)
- timelines[i].apply(skeleton, animationLast, animationTime, events, alphaMix, blend, MixDirection$1.out);
- } else {
- let timelineMode = from.timelineMode;
- let timelineHoldMix = from.timelineHoldMix;
- let firstFrame = from.timelinesRotation.length == 0;
- if (firstFrame) Utils.setArraySize(from.timelinesRotation, timelineCount << 1, null);
- let timelinesRotation = from.timelinesRotation;
- from.totalAlpha = 0;
- for (let i = 0; i < timelineCount; i++) {
- let timeline = timelines[i];
- let direction = MixDirection$1.out;
- let timelineBlend;
- let alpha = 0;
- switch (timelineMode[i]) {
- case AnimationState$1.SUBSEQUENT:
- if (!attachments && timeline instanceof AttachmentTimeline$1) continue;
- if (!drawOrder && timeline instanceof DrawOrderTimeline$1) continue;
- timelineBlend = blend;
- alpha = alphaMix;
- break;
- case AnimationState$1.FIRST:
- timelineBlend = MixBlend$1.setup;
- alpha = alphaMix;
- break;
- case AnimationState$1.HOLD:
- timelineBlend = MixBlend$1.setup;
- alpha = alphaHold;
- break;
- default:
- timelineBlend = MixBlend$1.setup;
- let holdMix = timelineHoldMix[i];
- alpha = alphaHold * Math.max(0, 1 - holdMix.mixTime / holdMix.mixDuration);
- break;
- }
- from.totalAlpha += alpha;
- if (timeline instanceof RotateTimeline$1)
- this.applyRotateTimeline(timeline, skeleton, animationTime, alpha, timelineBlend, timelinesRotation, i << 1, firstFrame);
- else {
- // This fixes the WebKit 602 specific issue described at http://esotericsoftware.com/forum/iOS-10-disappearing-graphics-10109
- Utils.webkit602BugfixHelper(alpha, blend);
- if (timelineBlend == MixBlend$1.setup) {
- if (timeline instanceof AttachmentTimeline$1) {
- if (attachments) direction = MixDirection$1.out;
- } else if (timeline instanceof DrawOrderTimeline$1) {
- if (drawOrder) direction = MixDirection$1.out;
- }
- }
- timeline.apply(skeleton, animationLast, animationTime, events, alpha, timelineBlend, direction);
- }
- }
- }
- if (to.mixDuration > 0) this.queueEvents(from, animationTime);
- this.events.length = 0;
- from.nextAnimationLast = animationTime;
- from.nextTrackLast = from.trackTime;
- return mix;
- }
- applyRotateTimeline (timeline, skeleton, time, alpha, blend,
- timelinesRotation, i, firstFrame) {
- if (firstFrame) timelinesRotation[i] = 0;
- if (alpha == 1) {
- timeline.apply(skeleton, 0, time, null, 1, blend, MixDirection$1.in);
- return;
- }
- let rotateTimeline = timeline ;
- let frames = rotateTimeline.frames;
- let bone = skeleton.bones[rotateTimeline.boneIndex];
- let r1 = 0, r2 = 0;
- if (time < frames[0]) {
- switch (blend) {
- case MixBlend$1.setup:
- bone.rotation = bone.data.rotation;
- default:
- return;
- case MixBlend$1.first:
- r1 = bone.rotation;
- r2 = bone.data.rotation;
- }
- } else {
- r1 = blend == MixBlend$1.setup ? bone.data.rotation : bone.rotation;
- if (time >= frames[frames.length - RotateTimeline$1.ENTRIES]) // Time is after last frame.
- r2 = bone.data.rotation + frames[frames.length + RotateTimeline$1.PREV_ROTATION];
- else {
- // Interpolate between the previous frame and the current frame.
- let frame = Animation$1.binarySearch(frames, time, RotateTimeline$1.ENTRIES);
- let prevRotation = frames[frame + RotateTimeline$1.PREV_ROTATION];
- let frameTime = frames[frame];
- let percent = rotateTimeline.getCurvePercent((frame >> 1) - 1,
- 1 - (time - frameTime) / (frames[frame + RotateTimeline$1.PREV_TIME] - frameTime));
- r2 = frames[frame + RotateTimeline$1.ROTATION] - prevRotation;
- r2 -= (16384 - ((16384.499999999996 - r2 / 360) | 0)) * 360;
- r2 = prevRotation + r2 * percent + bone.data.rotation;
- r2 -= (16384 - ((16384.499999999996 - r2 / 360) | 0)) * 360;
- }
- }
- // Mix between rotations using the direction of the shortest route on the first frame while detecting crosses.
- let total = 0, diff = r2 - r1;
- diff -= (16384 - ((16384.499999999996 - diff / 360) | 0)) * 360;
- if (diff == 0) {
- total = timelinesRotation[i];
- } else {
- let lastTotal = 0, lastDiff = 0;
- if (firstFrame) {
- lastTotal = 0;
- lastDiff = diff;
- } else {
- lastTotal = timelinesRotation[i]; // Angle and direction of mix, including loops.
- lastDiff = timelinesRotation[i + 1]; // Difference between bones.
- }
- let current = diff > 0, dir = lastTotal >= 0;
- // Detect cross at 0 (not 180).
- if (MathUtils.signum(lastDiff) != MathUtils.signum(diff) && Math.abs(lastDiff) <= 90) {
- // A cross after a 360 rotation is a loop.
- if (Math.abs(lastTotal) > 180) lastTotal += 360 * MathUtils.signum(lastTotal);
- dir = current;
- }
- total = diff + lastTotal - lastTotal % 360; // Store loops as part of lastTotal.
- if (dir != current) total += 360 * MathUtils.signum(lastTotal);
- timelinesRotation[i] = total;
- }
- timelinesRotation[i + 1] = diff;
- r1 += total * alpha;
- bone.rotation = r1 - (16384 - ((16384.499999999996 - r1 / 360) | 0)) * 360;
- }
- queueEvents (entry, animationTime) {
- let animationStart = entry.animationStart, animationEnd = entry.animationEnd;
- let duration = animationEnd - animationStart;
- let trackLastWrapped = entry.trackLast % duration;
- // Queue events before complete.
- let events = this.events;
- let i = 0, n = events.length;
- for (; i < n; i++) {
- let event = events[i];
- if (event.time < trackLastWrapped) break;
- if (event.time > animationEnd) continue; // Discard events outside animation start/end.
- this.queue.event(entry, event);
- }
- // Queue complete if completed a loop iteration or the animation.
- let complete = false;
- if (entry.loop)
- complete = duration == 0 || trackLastWrapped > entry.trackTime % duration;
- else
- complete = animationTime >= animationEnd && entry.animationLast < animationEnd;
- if (complete) this.queue.complete(entry);
- // Queue events after complete.
- for (; i < n; i++) {
- let event = events[i];
- if (event.time < animationStart) continue; // Discard events outside animation start/end.
- this.queue.event(entry, events[i]);
- }
- }
- clearTracks () {
- let oldDrainDisabled = this.queue.drainDisabled;
- this.queue.drainDisabled = true;
- for (let i = 0, n = this.tracks.length; i < n; i++)
- this.clearTrack(i);
- this.tracks.length = 0;
- this.queue.drainDisabled = oldDrainDisabled;
- this.queue.drain();
- }
- clearTrack (trackIndex) {
- if (trackIndex >= this.tracks.length) return;
- let current = this.tracks[trackIndex];
- if (current == null) return;
- this.queue.end(current);
- this.disposeNext(current);
- let entry = current;
- while (true) {
- let from = entry.mixingFrom;
- if (from == null) break;
- this.queue.end(from);
- entry.mixingFrom = null;
- entry.mixingTo = null;
- entry = from;
- }
- this.tracks[current.trackIndex] = null;
- this.queue.drain();
- }
- setCurrent (index, current, interrupt) {
- let from = this.expandToIndex(index);
- this.tracks[index] = current;
- if (from != null) {
- if (interrupt) this.queue.interrupt(from);
- current.mixingFrom = from;
- from.mixingTo = current;
- current.mixTime = 0;
- // Store the interrupted mix percentage.
- if (from.mixingFrom != null && from.mixDuration > 0)
- current.interruptAlpha *= Math.min(1, from.mixTime / from.mixDuration);
- from.timelinesRotation.length = 0; // Reset rotation for mixing out, in case entry was mixed in.
- }
- this.queue.start(current);
- }
- setAnimation (trackIndex, animationName, loop) {
- let animation = this.data.skeletonData.findAnimation(animationName);
- if (animation == null) throw new Error("Animation not found: " + animationName);
- return this.setAnimationWith(trackIndex, animation, loop);
- }
- setAnimationWith (trackIndex, animation, loop) {
- if (animation == null) throw new Error("animation cannot be null.");
- let interrupt = true;
- let current = this.expandToIndex(trackIndex);
- if (current != null) {
- if (current.nextTrackLast == -1) {
- // Don't mix from an entry that was never applied.
- this.tracks[trackIndex] = current.mixingFrom;
- this.queue.interrupt(current);
- this.queue.end(current);
- this.disposeNext(current);
- current = current.mixingFrom;
- interrupt = false;
- } else
- this.disposeNext(current);
- }
- let entry = this.trackEntry(trackIndex, animation, loop, current);
- this.setCurrent(trackIndex, entry, interrupt);
- this.queue.drain();
- return entry;
- }
- addAnimation (trackIndex, animationName, loop, delay) {
- let animation = this.data.skeletonData.findAnimation(animationName);
- if (animation == null) throw new Error("Animation not found: " + animationName);
- return this.addAnimationWith(trackIndex, animation, loop, delay);
- }
- addAnimationWith (trackIndex, animation, loop, delay) {
- if (animation == null) throw new Error("animation cannot be null.");
- let last = this.expandToIndex(trackIndex);
- if (last != null) {
- while (last.next != null)
- last = last.next;
- }
- let entry = this.trackEntry(trackIndex, animation, loop, last);
- if (last == null) {
- this.setCurrent(trackIndex, entry, true);
- this.queue.drain();
- } else {
- last.next = entry;
- if (delay <= 0) {
- let duration = last.animationEnd - last.animationStart;
- if (duration != 0) {
- if (last.loop)
- delay += duration * (1 + ((last.trackTime / duration) | 0));
- else
- delay += Math.max(duration, last.trackTime);
- delay -= this.data.getMix(last.animation, animation);
- } else
- delay = last.trackTime;
- }
- }
- entry.delay = delay;
- return entry;
- }
- setEmptyAnimation (trackIndex, mixDuration) {
- let entry = this.setAnimationWith(trackIndex, AnimationState$1.emptyAnimation, false);
- entry.mixDuration = mixDuration;
- entry.trackEnd = mixDuration;
- return entry;
- }
- addEmptyAnimation (trackIndex, mixDuration, delay) {
- if (delay <= 0) delay -= mixDuration;
- let entry = this.addAnimationWith(trackIndex, AnimationState$1.emptyAnimation, false, delay);
- entry.mixDuration = mixDuration;
- entry.trackEnd = mixDuration;
- return entry;
- }
- setEmptyAnimations (mixDuration) {
- let oldDrainDisabled = this.queue.drainDisabled;
- this.queue.drainDisabled = true;
- for (let i = 0, n = this.tracks.length; i < n; i++) {
- let current = this.tracks[i];
- if (current != null) this.setEmptyAnimation(current.trackIndex, mixDuration);
- }
- this.queue.drainDisabled = oldDrainDisabled;
- this.queue.drain();
- }
- expandToIndex (index) {
- if (index < this.tracks.length) return this.tracks[index];
- Utils.ensureArrayCapacity(this.tracks, index - this.tracks.length + 1, null);
- this.tracks.length = index + 1;
- return null;
- }
- trackEntry (trackIndex, animation, loop, last) {
- let entry = this.trackEntryPool.obtain();
- entry.trackIndex = trackIndex;
- entry.animation = animation;
- entry.loop = loop;
- entry.holdPrevious = false;
- entry.eventThreshold = 0;
- entry.attachmentThreshold = 0;
- entry.drawOrderThreshold = 0;
- entry.animationStart = 0;
- entry.animationEnd = animation.duration;
- entry.animationLast = -1;
- entry.nextAnimationLast = -1;
- entry.delay = 0;
- entry.trackTime = 0;
- entry.trackLast = -1;
- entry.nextTrackLast = -1;
- entry.trackEnd = Number.MAX_VALUE;
- entry.timeScale = 1;
- entry.alpha = 1;
- entry.interruptAlpha = 1;
- entry.mixTime = 0;
- entry.mixDuration = last == null ? 0 : this.data.getMix(last.animation, animation);
- return entry;
- }
- disposeNext (entry) {
- let next = entry.next;
- while (next != null) {
- this.queue.dispose(next);
- next = next.next;
- }
- entry.next = null;
- }
- _animationsChanged () {
- this.animationsChanged = false;
- this.propertyIDs.clear();
- for (let i = 0, n = this.tracks.length; i < n; i++) {
- let entry = this.tracks[i];
- if (entry == null) continue;
- while (entry.mixingFrom != null)
- entry = entry.mixingFrom;
- do {
- if (entry.mixingFrom == null || entry.mixBlend != MixBlend$1.add) this.setTimelineModes(entry);
- entry = entry.mixingTo;
- } while (entry != null)
- }
- }
- setTimelineModes (entry) {
- let to = entry.mixingTo;
- let timelines = entry.animation.timelines;
- let timelinesCount = entry.animation.timelines.length;
- let timelineMode = Utils.setArraySize(entry.timelineMode, timelinesCount);
- entry.timelineHoldMix.length = 0;
- let timelineDipMix = Utils.setArraySize(entry.timelineHoldMix, timelinesCount);
- let propertyIDs = this.propertyIDs;
- if (to != null && to.holdPrevious) {
- for (let i = 0; i < timelinesCount; i++) {
- propertyIDs.add(timelines[i].getPropertyId());
- timelineMode[i] = AnimationState$1.HOLD;
- }
- return;
- }
- outer:
- for (let i = 0; i < timelinesCount; i++) {
- let id = timelines[i].getPropertyId();
- if (!propertyIDs.add(id))
- timelineMode[i] = AnimationState$1.SUBSEQUENT;
- else if (to == null || !this.hasTimeline(to, id))
- timelineMode[i] = AnimationState$1.FIRST;
- else {
- for (let next = to.mixingTo; next != null; next = next.mixingTo) {
- if (this.hasTimeline(next, id)) continue;
- if (entry.mixDuration > 0) {
- timelineMode[i] = AnimationState$1.HOLD_MIX;
- timelineDipMix[i] = next;
- continue outer;
- }
- break;
- }
- timelineMode[i] = AnimationState$1.HOLD;
- }
- }
- }
- hasTimeline (entry, id) {
- let timelines = entry.animation.timelines;
- for (let i = 0, n = timelines.length; i < n; i++)
- if (timelines[i].getPropertyId() == id) return true;
- return false;
- }
- getCurrent (trackIndex) {
- if (trackIndex >= this.tracks.length) return null;
- return this.tracks[trackIndex];
- }
- addListener (listener) {
- if (listener == null) throw new Error("listener cannot be null.");
- this.listeners.push(listener);
- }
- /** Removes the listener added with {@link #addListener(AnimationStateListener)}. */
- removeListener (listener) {
- let index = this.listeners.indexOf(listener);
- if (index >= 0) this.listeners.splice(index, 1);
- }
- clearListeners () {
- this.listeners.length = 0;
- }
- clearListenerNotifications () {
- this.queue.clear();
- }
- //deprecated stuff
-
-
-
-
- static __initStatic6() {this.deprecatedWarning1 = false;}
- setAnimationByName(trackIndex, animationName, loop) {
- if (!AnimationState$1.deprecatedWarning1) {
- AnimationState$1.deprecatedWarning1 = true;
- console.warn("Spine Deprecation Warning: AnimationState.setAnimationByName is deprecated, please use setAnimation from now on.");
- }
- this.setAnimation(trackIndex, animationName, loop);
- }
- static __initStatic7() {this.deprecatedWarning2 = false;}
- addAnimationByName(trackIndex, animationName, loop, delay) {
- if (!AnimationState$1.deprecatedWarning2) {
- AnimationState$1.deprecatedWarning2 = true;
- console.warn("Spine Deprecation Warning: AnimationState.addAnimationByName is deprecated, please use addAnimation from now on.");
- }
- this.addAnimation(trackIndex, animationName, loop, delay);
- }
- static __initStatic8() {this.deprecatedWarning3 = false;}
- hasAnimation(animationName) {
- let animation = this.data.skeletonData.findAnimation(animationName);
- return animation !== null;
- }
- hasAnimationByName(animationName) {
- if (!AnimationState$1.deprecatedWarning3) {
- AnimationState$1.deprecatedWarning3 = true;
- console.warn("Spine Deprecation Warning: AnimationState.hasAnimationByName is deprecated, please use hasAnimation from now on.");
- }
- return this.hasAnimation(animationName);
- }
- } AnimationState$1.__initStatic(); AnimationState$1.__initStatic2(); AnimationState$1.__initStatic3(); AnimationState$1.__initStatic4(); AnimationState$1.__initStatic5(); AnimationState$1.__initStatic6(); AnimationState$1.__initStatic7(); AnimationState$1.__initStatic8();
- /**
- * @public
- */
- class TrackEntry$1 {constructor() { TrackEntry$1.prototype.__init9.call(this);TrackEntry$1.prototype.__init10.call(this);TrackEntry$1.prototype.__init11.call(this);TrackEntry$1.prototype.__init12.call(this); }
-
-
-
-
-
-
-
-
-
-
- __init9() {this.mixBlend = MixBlend$1.replace;}
- __init10() {this.timelineMode = new Array();}
- __init11() {this.timelineHoldMix = new Array();}
- __init12() {this.timelinesRotation = new Array();}
- reset () {
- this.next = null;
- this.mixingFrom = null;
- this.mixingTo = null;
- this.animation = null;
- this.listener = null;
- this.timelineMode.length = 0;
- this.timelineHoldMix.length = 0;
- this.timelinesRotation.length = 0;
- }
- getAnimationTime () {
- if (this.loop) {
- let duration = this.animationEnd - this.animationStart;
- if (duration == 0) return this.animationStart;
- return (this.trackTime % duration) + this.animationStart;
- }
- return Math.min(this.trackTime + this.animationStart, this.animationEnd);
- }
- setAnimationLast(animationLast) {
- this.animationLast = animationLast;
- this.nextAnimationLast = animationLast;
- }
- isComplete () {
- return this.trackTime >= this.animationEnd - this.animationStart;
- }
- resetRotationDirections () {
- this.timelinesRotation.length = 0;
- }
- //deprecated stuff
-
-
-
-
- static __initStatic9() {this.deprecatedWarning1 = false;}
- static __initStatic10() {this.deprecatedWarning2 = false;}
- get time() {
- if (!TrackEntry$1.deprecatedWarning1) {
- TrackEntry$1.deprecatedWarning1 = true;
- console.warn("Spine Deprecation Warning: TrackEntry.time is deprecated, please use trackTime from now on.");
- }
- return this.trackTime;
- }
- set time(value) {
- if (!TrackEntry$1.deprecatedWarning1) {
- TrackEntry$1.deprecatedWarning1 = true;
- console.warn("Spine Deprecation Warning: TrackEntry.time is deprecated, please use trackTime from now on.");
- }
- this.trackTime = value;
- }
- get endTime() {
- if (!TrackEntry$1.deprecatedWarning2) {
- TrackEntry$1.deprecatedWarning2 = true;
- console.warn("Spine Deprecation Warning: TrackEntry.endTime is deprecated, please use trackEnd from now on.");
- }
- return this.trackTime;
- }
- set endTime(value) {
- if (!TrackEntry$1.deprecatedWarning2) {
- TrackEntry$1.deprecatedWarning2 = true;
- console.warn("Spine Deprecation Warning: TrackEntry.endTime is deprecated, please use trackEnd from now on.");
- }
- this.trackTime = value;
- }
- loopsCount() {
- return Math.floor(this.trackTime / this.trackEnd);
- }
- } TrackEntry$1.__initStatic9(); TrackEntry$1.__initStatic10();
- /**
- * @public
- */
- class EventQueue$1 {
- __init13() {this.objects = [];}
- __init14() {this.drainDisabled = false;}
-
- constructor(animState) {EventQueue$1.prototype.__init13.call(this);EventQueue$1.prototype.__init14.call(this);
- this.animState = animState;
- }
- start (entry) {
- this.objects.push(EventType$1.start);
- this.objects.push(entry);
- this.animState.animationsChanged = true;
- }
- interrupt (entry) {
- this.objects.push(EventType$1.interrupt);
- this.objects.push(entry);
- }
- end (entry) {
- this.objects.push(EventType$1.end);
- this.objects.push(entry);
- this.animState.animationsChanged = true;
- }
- dispose (entry) {
- this.objects.push(EventType$1.dispose);
- this.objects.push(entry);
- }
- complete (entry) {
- this.objects.push(EventType$1.complete);
- this.objects.push(entry);
- }
- event (entry, event) {
- this.objects.push(EventType$1.event);
- this.objects.push(entry);
- this.objects.push(event);
- }
- static __initStatic11() {this.deprecatedWarning1 = false;}
- deprecateStuff() {
- if (!EventQueue$1.deprecatedWarning1) {
- EventQueue$1.deprecatedWarning1 = true;
- console.warn("Spine Deprecation Warning: onComplete, onStart, onEnd, onEvent art deprecated, please use listeners from now on. 'state.addListener({ complete: function(track, event) { } })'");
- }
- return true;
- }
- drain () {
- if (this.drainDisabled) return;
- this.drainDisabled = true;
- let objects = this.objects;
- let listeners = this.animState.listeners;
- for (let i = 0; i < objects.length; i += 2) {
- let type = objects[i] ;
- let entry = objects[i + 1] ;
- switch (type) {
- case EventType$1.start:
- if (entry.listener != null && entry.listener.start) entry.listener.start(entry);
- for (let ii = 0; ii < listeners.length; ii++)
- if (listeners[ii].start) listeners[ii].start(entry);
- //deprecation
- entry.onStart && this.deprecateStuff() && entry.onStart(entry.trackIndex);
- this.animState.onStart && this.deprecateStuff() && this.deprecateStuff && this.animState.onStart(entry.trackIndex);
- break;
- case EventType$1.interrupt:
- if (entry.listener != null && entry.listener.interrupt) entry.listener.interrupt(entry);
- for (let ii = 0; ii < listeners.length; ii++)
- if (listeners[ii].interrupt) listeners[ii].interrupt(entry);
- break;
- case EventType$1.end:
- if (entry.listener != null && entry.listener.end) entry.listener.end(entry);
- for (let ii = 0; ii < listeners.length; ii++)
- if (listeners[ii].end) listeners[ii].end(entry);
- //deprecation
- entry.onEnd && this.deprecateStuff() && entry.onEnd(entry.trackIndex);
- this.animState.onEnd && this.deprecateStuff() && this.animState.onEnd(entry.trackIndex);
- // Fall through.
- case EventType$1.dispose:
- if (entry.listener != null && entry.listener.dispose) entry.listener.dispose(entry);
- for (let ii = 0; ii < listeners.length; ii++)
- if (listeners[ii].dispose) listeners[ii].dispose(entry);
- this.animState.trackEntryPool.free(entry);
- break;
- case EventType$1.complete:
- if (entry.listener != null && entry.listener.complete) entry.listener.complete(entry);
- for (let ii = 0; ii < listeners.length; ii++)
- if (listeners[ii].complete) listeners[ii].complete(entry);
- //deprecation
- let count = MathUtils.toInt(entry.loopsCount()) ;
- entry.onComplete && this.deprecateStuff() && entry.onComplete(entry.trackIndex, count);
- this.animState.onComplete && this.deprecateStuff() && this.animState.onComplete(entry.trackIndex, count);
- break;
- case EventType$1.event:
- let event = objects[i++ + 2] ;
- if (entry.listener != null && entry.listener.event) entry.listener.event(entry, event);
- for (let ii = 0; ii < listeners.length; ii++)
- if (listeners[ii].event) listeners[ii].event(entry, event);
- //deprecation
- entry.onEvent && this.deprecateStuff() && entry.onEvent(entry.trackIndex, event);
- this.animState.onEvent && this.deprecateStuff() && this.animState.onEvent(entry.trackIndex, event);
- break;
- }
- }
- this.clear();
- this.drainDisabled = false;
- }
- clear () {
- this.objects.length = 0;
- }
- } EventQueue$1.__initStatic11();
- /**
- * @public
- */
- var EventType$1; (function (EventType) {
- const start = 0; EventType[EventType["start"] = start] = "start"; const interrupt = start + 1; EventType[EventType["interrupt"] = interrupt] = "interrupt"; const end = interrupt + 1; EventType[EventType["end"] = end] = "end"; const dispose = end + 1; EventType[EventType["dispose"] = dispose] = "dispose"; const complete = dispose + 1; EventType[EventType["complete"] = complete] = "complete"; const event = complete + 1; EventType[EventType["event"] = event] = "event";
- })(EventType$1 || (EventType$1 = {}));
- /**
- * @public
- */
- /**
- * @public
- */
- class AnimationStateAdapter2 {
- start (entry) {
- }
- interrupt (entry) {
- }
- end (entry) {
- }
- dispose (entry) {
- }
- complete (entry) {
- }
- event (entry, event) {
- }
- }
- /**
- * @public
- */
- class AnimationStateData$1 {
-
- __init() {this.animationToMixTime = {};}
- __init2() {this.defaultMix = 0;}
- constructor(skeletonData) {AnimationStateData$1.prototype.__init.call(this);AnimationStateData$1.prototype.__init2.call(this);
- if (skeletonData == null) throw new Error("skeletonData cannot be null.");
- this.skeletonData = skeletonData;
- }
- setMix(fromName, toName, duration) {
- let from = this.skeletonData.findAnimation(fromName);
- if (from == null) throw new Error("Animation not found: " + fromName);
- let to = this.skeletonData.findAnimation(toName);
- if (to == null) throw new Error("Animation not found: " + toName);
- this.setMixWith(from, to, duration);
- }
- static __initStatic() {this.deprecatedWarning1 = false;}
- setMixByName(fromName, toName, duration) {
- if (!AnimationStateData$1.deprecatedWarning1) {
- AnimationStateData$1.deprecatedWarning1 = true;
- console.warn("Deprecation Warning: AnimationStateData.setMixByName is deprecated, please use setMix from now on.");
- }
- this.setMix(fromName, toName, duration);
- }
- setMixWith(from, to, duration) {
- if (from == null) throw new Error("from cannot be null.");
- if (to == null) throw new Error("to cannot be null.");
- let key = from.name + "." + to.name;
- this.animationToMixTime[key] = duration;
- }
- getMix(from, to) {
- let key = from.name + "." + to.name;
- let value = this.animationToMixTime[key];
- return value === undefined ? this.defaultMix : value;
- }
- } AnimationStateData$1.__initStatic();
- /**
- * @public
- */
- class AtlasAttachmentLoader$1 {
-
- constructor(atlas) {
- this.atlas = atlas;
- }
- /** @return May be null to not load an attachment. */
- newRegionAttachment(skin, name, path) {
- let region = this.atlas.findRegion(path);
- if (region == null) throw new Error("Region not found in atlas: " + path + " (region attachment: " + name + ")");
- let attachment = new RegionAttachment$1(name);
- attachment.region = region;
- return attachment;
- }
- /** @return May be null to not load an attachment. */
- newMeshAttachment(skin, name, path) {
- let region = this.atlas.findRegion(path);
- if (region == null) throw new Error("Region not found in atlas: " + path + " (mesh attachment: " + name + ")");
- let attachment = new MeshAttachment$1(name);
- attachment.region = region;
- return attachment;
- }
- /** @return May be null to not load an attachment. */
- newBoundingBoxAttachment(skin, name) {
- return new BoundingBoxAttachment$1(name);
- }
- /** @return May be null to not load an attachment */
- newPathAttachment(skin, name) {
- return new PathAttachment$1(name);
- }
- newPointAttachment(skin, name) {
- return new PointAttachment$1(name);
- }
- newClippingAttachment(skin, name) {
- return new ClippingAttachment$1(name);
- }
- }
- /**
- * @public
- */
- class BoneData$1 {
-
-
-
-
- __init() {this.x = 0;}
- __init2() {this.y = 0;}
- __init3() {this.rotation = 0;}
- __init4() {this.scaleX = 1;}
- __init5() {this.scaleY = 1;}
- __init6() {this.shearX = 0;}
- __init7() {this.shearY = 0;}
- __init8() {this.transformMode = TransformMode$1.Normal;}
- constructor(index, name, parent) {BoneData$1.prototype.__init.call(this);BoneData$1.prototype.__init2.call(this);BoneData$1.prototype.__init3.call(this);BoneData$1.prototype.__init4.call(this);BoneData$1.prototype.__init5.call(this);BoneData$1.prototype.__init6.call(this);BoneData$1.prototype.__init7.call(this);BoneData$1.prototype.__init8.call(this);
- if (index < 0) throw new Error("index must be >= 0.");
- if (name == null) throw new Error("name cannot be null.");
- this.index = index;
- this.name = name;
- this.parent = parent;
- }
- }
- /**
- * @public
- */
- var TransformMode$1; (function (TransformMode) {
- const Normal = 0; TransformMode[TransformMode["Normal"] = Normal] = "Normal"; const OnlyTranslation = Normal + 1; TransformMode[TransformMode["OnlyTranslation"] = OnlyTranslation] = "OnlyTranslation"; const NoRotationOrReflection = OnlyTranslation + 1; TransformMode[TransformMode["NoRotationOrReflection"] = NoRotationOrReflection] = "NoRotationOrReflection"; const NoScale = NoRotationOrReflection + 1; TransformMode[TransformMode["NoScale"] = NoScale] = "NoScale"; const NoScaleOrReflection = NoScale + 1; TransformMode[TransformMode["NoScaleOrReflection"] = NoScaleOrReflection] = "NoScaleOrReflection";
- })(TransformMode$1 || (TransformMode$1 = {}));
- /**
- * @public
- */
- class Bone$1 {
- //be careful! Spine b,c is c,b in pixi matrix
- __init() {this.matrix = new math.Matrix();}
- get worldX() {
- return this.matrix.tx;
- }
- get worldY() {
- return this.matrix.ty;
- }
-
-
-
- __init2() {this.children = new Array();}
- __init3() {this.x = 0;}
- __init4() {this.y = 0;}
- __init5() {this.rotation = 0;}
- __init6() {this.scaleX = 0;}
- __init7() {this.scaleY = 0;}
- __init8() {this.shearX = 0;}
- __init9() {this.shearY = 0;}
- __init10() {this.ax = 0;}
- __init11() {this.ay = 0;}
- __init12() {this.arotation = 0;}
- __init13() {this.ascaleX = 0;}
- __init14() {this.ascaleY = 0;}
- __init15() {this.ashearX = 0;}
- __init16() {this.ashearY = 0;}
- __init17() {this.appliedValid = false;}
- __init18() {this.sorted = false;}
- /** @param parent May be null. */
- constructor(data, skeleton, parent) {Bone$1.prototype.__init.call(this);Bone$1.prototype.__init2.call(this);Bone$1.prototype.__init3.call(this);Bone$1.prototype.__init4.call(this);Bone$1.prototype.__init5.call(this);Bone$1.prototype.__init6.call(this);Bone$1.prototype.__init7.call(this);Bone$1.prototype.__init8.call(this);Bone$1.prototype.__init9.call(this);Bone$1.prototype.__init10.call(this);Bone$1.prototype.__init11.call(this);Bone$1.prototype.__init12.call(this);Bone$1.prototype.__init13.call(this);Bone$1.prototype.__init14.call(this);Bone$1.prototype.__init15.call(this);Bone$1.prototype.__init16.call(this);Bone$1.prototype.__init17.call(this);Bone$1.prototype.__init18.call(this);
- if (data == null) throw new Error("data cannot be null.");
- if (skeleton == null) throw new Error("skeleton cannot be null.");
- this.data = data;
- this.skeleton = skeleton;
- this.parent = parent;
- this.setToSetupPose();
- }
- /** Same as {@link #updateWorldTransform()}. This method exists for Bone to implement {@link Updatable}. */
- update() {
- this.updateWorldTransformWith(this.x, this.y, this.rotation, this.scaleX, this.scaleY, this.shearX, this.shearY);
- }
- /** Computes the world transform using the parent bone and this bone's local transform. */
- updateWorldTransform() {
- this.updateWorldTransformWith(this.x, this.y, this.rotation, this.scaleX, this.scaleY, this.shearX, this.shearY);
- }
- /** Computes the world transform using the parent bone and the specified local transform. */
- updateWorldTransformWith(x, y, rotation, scaleX, scaleY, shearX, shearY) {
- this.ax = x;
- this.ay = y;
- this.arotation = rotation;
- this.ascaleX = scaleX;
- this.ascaleY = scaleY;
- this.ashearX = shearX;
- this.ashearY = shearY;
- this.appliedValid = true;
- let parent = this.parent;
- let m = this.matrix;
- let sx = this.skeleton.scaleX;
- let sy = settings.yDown? -this.skeleton.scaleY : this.skeleton.scaleY;
- if (parent == null) { // Root bone.
- let skeleton = this.skeleton;
- let rotationY = rotation + 90 + shearY;
- m.a = MathUtils.cosDeg(rotation + shearX) * scaleX * sx;
- m.c = MathUtils.cosDeg(rotationY) * scaleY * sx;
- m.b = MathUtils.sinDeg(rotation + shearX) * scaleX * sy;
- m.d = MathUtils.sinDeg(rotationY) * scaleY * sy;
- m.tx = x * sx + skeleton.x;
- m.ty = y * sy + skeleton.y;
- return;
- }
- let pa = parent.matrix.a, pb = parent.matrix.c, pc = parent.matrix.b, pd = parent.matrix.d;
- m.tx = pa * x + pb * y + parent.matrix.tx;
- m.ty = pc * x + pd * y + parent.matrix.ty;
- switch (this.data.transformMode) {
- case TransformMode$1.Normal: {
- let rotationY = rotation + 90 + shearY;
- let la = MathUtils.cosDeg(rotation + shearX) * scaleX;
- let lb = MathUtils.cosDeg(rotationY) * scaleY;
- let lc = MathUtils.sinDeg(rotation + shearX) * scaleX;
- let ld = MathUtils.sinDeg(rotationY) * scaleY;
- m.a = pa * la + pb * lc;
- m.c = pa * lb + pb * ld;
- m.b = pc * la + pd * lc;
- m.d = pc * lb + pd * ld;
- return;
- }
- case TransformMode$1.OnlyTranslation: {
- let rotationY = rotation + 90 + shearY;
- m.a = MathUtils.cosDeg(rotation + shearX) * scaleX;
- m.c = MathUtils.cosDeg(rotationY) * scaleY;
- m.b = MathUtils.sinDeg(rotation + shearX) * scaleX;
- m.d = MathUtils.sinDeg(rotationY) * scaleY;
- break;
- }
- case TransformMode$1.NoRotationOrReflection: {
- let s = pa * pa + pc * pc;
- let prx = 0;
- if (s > 0.0001) {
- s = Math.abs(pa * pd - pb * pc) / s;
- pb = pc * s;
- pd = pa * s;
- prx = Math.atan2(pc, pa) * MathUtils.radDeg;
- } else {
- pa = 0;
- pc = 0;
- prx = 90 - Math.atan2(pd, pb) * MathUtils.radDeg;
- }
- let rx = rotation + shearX - prx;
- let ry = rotation + shearY - prx + 90;
- let la = MathUtils.cosDeg(rx) * scaleX;
- let lb = MathUtils.cosDeg(ry) * scaleY;
- let lc = MathUtils.sinDeg(rx) * scaleX;
- let ld = MathUtils.sinDeg(ry) * scaleY;
- m.a = pa * la - pb * lc;
- m.c = pa * lb - pb * ld;
- m.b = pc * la + pd * lc;
- m.d = pc * lb + pd * ld;
- break;
- }
- case TransformMode$1.NoScale:
- case TransformMode$1.NoScaleOrReflection: {
- let cos = MathUtils.cosDeg(rotation);
- let sin = MathUtils.sinDeg(rotation);
- let za = (pa * cos + pb * sin) / sx;
- let zc = (pc * cos + pd * sin) / sy;
- let s = Math.sqrt(za * za + zc * zc);
- if (s > 0.00001) s = 1 / s;
- za *= s;
- zc *= s;
- s = Math.sqrt(za * za + zc * zc);
- if (
- this.data.transformMode == TransformMode$1.NoScale
- && (pa * pd - pb * pc < 0) != (settings.yDown?
- (this.skeleton.scaleX < 0 != this.skeleton.scaleY > 0) :
- (this.skeleton.scaleX < 0 != this.skeleton.scaleY < 0))
- ) s = -s;
- let r = Math.PI / 2 + Math.atan2(zc, za);
- let zb = Math.cos(r) * s;
- let zd = Math.sin(r) * s;
- let la = MathUtils.cosDeg(shearX) * scaleX;
- let lb = MathUtils.cosDeg(90 + shearY) * scaleY;
- let lc = MathUtils.sinDeg(shearX) * scaleX;
- let ld = MathUtils.sinDeg(90 + shearY) * scaleY;
- m.a = za * la + zb * lc;
- m.c = za * lb + zb * ld;
- m.b = zc * la + zd * lc;
- m.d = zc * lb + zd * ld;
- break;
- }
- }
- m.a *= sx;
- m.c *= sx;
- m.b *= sy;
- m.d *= sy;
- }
- setToSetupPose() {
- let data = this.data;
- this.x = data.x;
- this.y = data.y;
- this.rotation = data.rotation;
- this.scaleX = data.scaleX;
- this.scaleY = data.scaleY;
- this.shearX = data.shearX;
- this.shearY = data.shearY;
- }
- getWorldRotationX() {
- return Math.atan2(this.matrix.b, this.matrix.a) * MathUtils.radDeg;
- }
- getWorldRotationY() {
- return Math.atan2(this.matrix.d, this.matrix.c) * MathUtils.radDeg;
- }
- getWorldScaleX() {
- let m = this.matrix;
- return Math.sqrt(m.a * m.a + m.c * m.c);
- }
- getWorldScaleY() {
- let m = this.matrix;
- return Math.sqrt(m.b * m.b + m.d * m.d);
- }
- /** Computes the individual applied transform values from the world transform. This can be useful to perform processing using
- * the applied transform after the world transform has been modified directly (eg, by a constraint).
- * <p>
- * Some information is ambiguous in the world transform, such as -1,-1 scale versus 180 rotation. */
- updateAppliedTransform() {
- this.appliedValid = true;
- let parent = this.parent;
- let m = this.matrix;
- if (parent == null) {
- this.ax = m.tx;
- this.ay = m.ty;
- this.arotation = Math.atan2(m.b, m.a) * MathUtils.radDeg;
- this.ascaleX = Math.sqrt(m.a * m.a + m.b * m.b);
- this.ascaleY = Math.sqrt(m.c * m.c + m.d * m.d);
- this.ashearX = 0;
- this.ashearY = Math.atan2(m.a * m.c + m.b * m.d, m.a * m.d - m.b * m.c) * MathUtils.radDeg;
- return;
- }
- let pm = parent.matrix;
- let pid = 1 / (pm.a * pm.d - pm.b * pm.c);
- let dx = m.tx - pm.tx, dy = m.ty - pm.ty;
- this.ax = (dx * pm.d * pid - dy * pm.c * pid);
- this.ay = (dy * pm.a * pid - dx * pm.b * pid);
- let ia = pid * pm.d;
- let id = pid * pm.a;
- let ib = pid * pm.c;
- let ic = pid * pm.b;
- let ra = ia * m.a - ib * m.b;
- let rb = ia * m.c - ib * m.d;
- let rc = id * m.b - ic * m.a;
- let rd = id * m.d - ic * m.c;
- this.ashearX = 0;
- this.ascaleX = Math.sqrt(ra * ra + rc * rc);
- if (this.ascaleX > 0.0001) {
- let det = ra * rd - rb * rc;
- this.ascaleY = det / this.ascaleX;
- this.ashearY = Math.atan2(ra * rb + rc * rd, det) * MathUtils.radDeg;
- this.arotation = Math.atan2(rc, ra) * MathUtils.radDeg;
- } else {
- this.ascaleX = 0;
- this.ascaleY = Math.sqrt(rb * rb + rd * rd);
- this.ashearY = 0;
- this.arotation = 90 - Math.atan2(rd, rb) * MathUtils.radDeg;
- }
- }
- worldToLocal(world) {
- let m = this.matrix;
- let a = m.a, b = m.c, c = m.b, d = m.d;
- let invDet = 1 / (a * d - b * c);
- let x = world.x - m.tx, y = world.y - m.ty;
- world.x = (x * d * invDet - y * b * invDet);
- world.y = (y * a * invDet - x * c * invDet);
- return world;
- }
- localToWorld(local) {
- let m = this.matrix;
- let x = local.x, y = local.y;
- local.x = x * m.a + y * m.c + m.tx;
- local.y = x * m.b + y * m.d + m.ty;
- return local;
- }
- worldToLocalRotation (worldRotation) {
- let sin = MathUtils.sinDeg(worldRotation), cos = MathUtils.cosDeg(worldRotation);
- let mat = this.matrix;
- return Math.atan2(mat.a * sin - mat.b * cos, mat.d * cos - mat.c * sin) * MathUtils.radDeg;
- }
- localToWorldRotation (localRotation) {
- let sin = MathUtils.sinDeg(localRotation), cos = MathUtils.cosDeg(localRotation);
- let mat = this.matrix;
- return Math.atan2(cos * mat.b + sin * mat.d, cos * mat.a + sin * mat.c) * MathUtils.radDeg;
- }
- rotateWorld (degrees) {
- let mat = this.matrix;
- let a = mat.a, b = mat.c, c = mat.b, d = mat.d;
- let cos = MathUtils.cosDeg(degrees), sin = MathUtils.sinDeg(degrees);
- mat.a = cos * a - sin * c;
- mat.c = cos * b - sin * d;
- mat.b = sin * a + cos * c;
- mat.d = sin * b + cos * d;
- this.appliedValid = false;
- }
- }
- /**
- * @public
- */
- class Event$1 {
-
-
-
-
-
-
-
- constructor(time, data) {
- if (data == null) throw new Error("data cannot be null.");
- this.time = time;
- this.data = data;
- }
- }
- /**
- * @public
- */
- class EventData$1 {
-
-
-
-
-
-
-
- constructor (name) {
- this.name = name;
- }
- }
- /**
- * @public
- */
- class IkConstraint$1 {
-
-
-
- __init() {this.bendDirection = 0;}
- __init2() {this.compress = false;}
- __init3() {this.stretch = false;}
- __init4() {this.mix = 1;}
- constructor (data, skeleton) {IkConstraint$1.prototype.__init.call(this);IkConstraint$1.prototype.__init2.call(this);IkConstraint$1.prototype.__init3.call(this);IkConstraint$1.prototype.__init4.call(this);
- if (data == null) throw new Error("data cannot be null.");
- if (skeleton == null) throw new Error("skeleton cannot be null.");
- this.data = data;
- this.mix = data.mix;
- this.bendDirection = data.bendDirection;
- this.compress = data.compress;
- this.stretch = data.stretch;
- this.bones = new Array();
- for (let i = 0; i < data.bones.length; i++)
- this.bones.push(skeleton.findBone(data.bones[i].name));
- this.target = skeleton.findBone(data.target.name);
- }
- getOrder () {
- return this.data.order;
- }
- apply () {
- this.update();
- }
- update () {
- let target = this.target;
- let bones = this.bones;
- switch (bones.length) {
- case 1:
- this.apply1(bones[0], target.worldX, target.worldY, this.compress, this.stretch, this.data.uniform, this.mix);
- break;
- case 2:
- this.apply2(bones[0], bones[1], target.worldX, target.worldY, this.bendDirection, this.stretch, this.mix);
- break;
- }
- }
- /** Adjusts the bone rotation so the tip is as close to the target position as possible. The target is specified in the world
- * coordinate system. */
- apply1 (bone, targetX, targetY, compress, stretch, uniform, alpha) {
- if (!bone.appliedValid) bone.updateAppliedTransform();
- let p = bone.parent.matrix;
- let id = 1 / (p.a * p.d - p.b * p.c);
- let x = targetX - p.tx, y = targetY - p.ty;
- let tx = (x * p.d - y * p.c) * id - bone.ax, ty = (y * p.a - x * p.b) * id - bone.ay;
- let rotationIK = Math.atan2(ty, tx) * MathUtils.radDeg - bone.ashearX - bone.arotation;
- if (bone.ascaleX < 0) rotationIK += 180;
- if (rotationIK > 180)
- rotationIK -= 360;
- else if (rotationIK < -180) rotationIK += 360;
- let sx = bone.ascaleX, sy = bone.ascaleY;
- if (compress || stretch) {
- let b = bone.data.length * sx, dd = Math.sqrt(tx * tx + ty * ty);
- if ((compress && dd < b) || (stretch && dd > b) && b > 0.0001) {
- let s = (dd / b - 1) * alpha + 1;
- sx *= s;
- if (uniform) sy *= s;
- }
- }
- bone.updateWorldTransformWith(bone.ax, bone.ay, bone.arotation + rotationIK * alpha, sx, sy, bone.ashearX,
- bone.ashearY);
- }
- /** Adjusts the parent and child bone rotations so the tip of the child is as close to the target position as possible. The
- * target is specified in the world coordinate system.
- * @param child A direct descendant of the parent bone. */
- apply2 (parent, child, targetX, targetY, bendDir, stretch, alpha) {
- if (alpha == 0) {
- child.updateWorldTransform();
- return;
- }
- if (!parent.appliedValid) parent.updateAppliedTransform();
- if (!child.appliedValid) child.updateAppliedTransform();
- let px = parent.ax, py = parent.ay, psx = parent.ascaleX, sx = psx, psy = parent.ascaleY, csx = child.ascaleX;
- let pmat = parent.matrix;
- let os1 = 0, os2 = 0, s2 = 0;
- if (psx < 0) {
- psx = -psx;
- os1 = 180;
- s2 = -1;
- } else {
- os1 = 0;
- s2 = 1;
- }
- if (psy < 0) {
- psy = -psy;
- s2 = -s2;
- }
- if (csx < 0) {
- csx = -csx;
- os2 = 180;
- } else
- os2 = 0;
- let cx = child.ax, cy = 0, cwx = 0, cwy = 0, a = pmat.a, b = pmat.c, c = pmat.b, d = pmat.d;
- let u = Math.abs(psx - psy) <= 0.0001;
- if (!u) {
- cy = 0;
- cwx = a * cx + pmat.tx;
- cwy = c * cx + pmat.ty;
- } else {
- cy = child.ay;
- cwx = a * cx + b * cy + pmat.tx;
- cwy = c * cx + d * cy + pmat.ty;
- }
- let pp = parent.parent.matrix;
- a = pp.a;
- b = pp.c;
- c = pp.b;
- d = pp.d;
- let id = 1 / (a * d - b * c), x = targetX - pp.tx, y = targetY - pp.ty;
- let tx = (x * d - y * b) * id - px, ty = (y * a - x * c) * id - py, dd = tx * tx + ty * ty;
- x = cwx - pp.tx;
- y = cwy - pp.ty;
- let dx = (x * d - y * b) * id - px, dy = (y * a - x * c) * id - py;
- let l1 = Math.sqrt(dx * dx + dy * dy), l2 = child.data.length * csx, a1 = 0, a2 = 0;
- outer:
- if (u) {
- l2 *= psx;
- let cos = (dd - l1 * l1 - l2 * l2) / (2 * l1 * l2);
- if (cos < -1)
- cos = -1;
- else if (cos > 1) {
- cos = 1;
- if (stretch && l1 + l2 > 0.0001) sx *= (Math.sqrt(dd) / (l1 + l2) - 1) * alpha + 1;
- }
- a2 = Math.acos(cos) * bendDir;
- a = l1 + l2 * cos;
- b = l2 * Math.sin(a2);
- a1 = Math.atan2(ty * a - tx * b, tx * a + ty * b);
- } else {
- a = psx * l2;
- b = psy * l2;
- let aa = a * a, bb = b * b, ta = Math.atan2(ty, tx);
- c = bb * l1 * l1 + aa * dd - aa * bb;
- let c1 = -2 * bb * l1, c2 = bb - aa;
- d = c1 * c1 - 4 * c2 * c;
- if (d >= 0) {
- let q = Math.sqrt(d);
- if (c1 < 0) q = -q;
- q = -(c1 + q) / 2;
- let r0 = q / c2, r1 = c / q;
- let r = Math.abs(r0) < Math.abs(r1) ? r0 : r1;
- if (r * r <= dd) {
- y = Math.sqrt(dd - r * r) * bendDir;
- a1 = ta - Math.atan2(y, r);
- a2 = Math.atan2(y / psy, (r - l1) / psx);
- break outer;
- }
- }
- let minAngle = MathUtils.PI, minX = l1 - a, minDist = minX * minX, minY = 0;
- let maxAngle = 0, maxX = l1 + a, maxDist = maxX * maxX, maxY = 0;
- c = -a * l1 / (aa - bb);
- if (c >= -1 && c <= 1) {
- c = Math.acos(c);
- x = a * Math.cos(c) + l1;
- y = b * Math.sin(c);
- d = x * x + y * y;
- if (d < minDist) {
- minAngle = c;
- minDist = d;
- minX = x;
- minY = y;
- }
- if (d > maxDist) {
- maxAngle = c;
- maxDist = d;
- maxX = x;
- maxY = y;
- }
- }
- if (dd <= (minDist + maxDist) / 2) {
- a1 = ta - Math.atan2(minY * bendDir, minX);
- a2 = minAngle * bendDir;
- } else {
- a1 = ta - Math.atan2(maxY * bendDir, maxX);
- a2 = maxAngle * bendDir;
- }
- }
- let os = Math.atan2(cy, cx) * s2;
- let rotation = parent.arotation;
- a1 = (a1 - os) * MathUtils.radDeg + os1 - rotation;
- if (a1 > 180)
- a1 -= 360;
- else if (a1 < -180) a1 += 360;
- parent.updateWorldTransformWith(px, py, rotation + a1 * alpha, sx, parent.ascaleY, 0, 0);
- rotation = child.arotation;
- a2 = ((a2 + os) * MathUtils.radDeg - child.ashearX) * s2 + os2 - rotation;
- if (a2 > 180)
- a2 -= 360;
- else if (a2 < -180) a2 += 360;
- child.updateWorldTransformWith(cx, cy, rotation + a2 * alpha, child.ascaleX, child.ascaleY, child.ashearX, child.ashearY);
- }
- }
- /**
- * @public
- */
- class IkConstraintData$1 {
-
- __init() {this.order = 0;}
- __init2() {this.bones = new Array();}
-
- __init3() {this.bendDirection = 1;}
- __init4() {this.compress = false;}
- __init5() {this.stretch = false;}
- __init6() {this.uniform = false;}
- __init7() {this.mix = 1;}
- constructor (name) {IkConstraintData$1.prototype.__init.call(this);IkConstraintData$1.prototype.__init2.call(this);IkConstraintData$1.prototype.__init3.call(this);IkConstraintData$1.prototype.__init4.call(this);IkConstraintData$1.prototype.__init5.call(this);IkConstraintData$1.prototype.__init6.call(this);IkConstraintData$1.prototype.__init7.call(this);
- this.name = name;
- }
- }
- /**
- * @public
- */
- class PathConstraintData$1 {
-
- __init() {this.order = 0;}
- __init2() {this.bones = new Array();}
-
-
-
-
-
-
-
-
-
- constructor(name) {PathConstraintData$1.prototype.__init.call(this);PathConstraintData$1.prototype.__init2.call(this);
- this.name = name;
- }
- }
- /**
- * @public
- */
- var PositionMode$1; (function (PositionMode) {
- const Fixed = 0; PositionMode[PositionMode["Fixed"] = Fixed] = "Fixed"; const Percent = Fixed + 1; PositionMode[PositionMode["Percent"] = Percent] = "Percent";
- })(PositionMode$1 || (PositionMode$1 = {}));
- /**
- * @public
- */
- var SpacingMode$1; (function (SpacingMode) {
- const Length = 0; SpacingMode[SpacingMode["Length"] = Length] = "Length"; const Fixed = Length + 1; SpacingMode[SpacingMode["Fixed"] = Fixed] = "Fixed"; const Percent = Fixed + 1; SpacingMode[SpacingMode["Percent"] = Percent] = "Percent";
- })(SpacingMode$1 || (SpacingMode$1 = {}));
- /**
- * @public
- */
- var RotateMode$1; (function (RotateMode) {
- const Tangent = 0; RotateMode[RotateMode["Tangent"] = Tangent] = "Tangent"; const Chain = Tangent + 1; RotateMode[RotateMode["Chain"] = Chain] = "Chain"; const ChainScale = Chain + 1; RotateMode[RotateMode["ChainScale"] = ChainScale] = "ChainScale";
- })(RotateMode$1 || (RotateMode$1 = {}));
- /**
- * @public
- */
- class PathConstraint$1 {
- static __initStatic() {this.NONE = -1;} static __initStatic2() {this.BEFORE = -2;} static __initStatic3() {this.AFTER = -3;}
- static __initStatic4() {this.epsilon = 0.00001;}
-
-
-
- __init() {this.position = 0;} __init2() {this.spacing = 0;} __init3() {this.rotateMix = 0;} __init4() {this.translateMix = 0;}
- __init5() {this.spaces = new Array();} __init6() {this.positions = new Array();}
- __init7() {this.world = new Array();} __init8() {this.curves = new Array();} __init9() {this.lengths = new Array();}
- __init10() {this.segments = new Array();}
- constructor (data, skeleton) {PathConstraint$1.prototype.__init.call(this);PathConstraint$1.prototype.__init2.call(this);PathConstraint$1.prototype.__init3.call(this);PathConstraint$1.prototype.__init4.call(this);PathConstraint$1.prototype.__init5.call(this);PathConstraint$1.prototype.__init6.call(this);PathConstraint$1.prototype.__init7.call(this);PathConstraint$1.prototype.__init8.call(this);PathConstraint$1.prototype.__init9.call(this);PathConstraint$1.prototype.__init10.call(this);
- if (data == null) throw new Error("data cannot be null.");
- if (skeleton == null) throw new Error("skeleton cannot be null.");
- this.data = data;
- this.bones = new Array();
- for (let i = 0, n = data.bones.length; i < n; i++)
- this.bones.push(skeleton.findBone(data.bones[i].name));
- this.target = skeleton.findSlot(data.target.name);
- this.position = data.position;
- this.spacing = data.spacing;
- this.rotateMix = data.rotateMix;
- this.translateMix = data.translateMix;
- }
- apply () {
- this.update();
- }
- update () {
- let attachment = this.target.getAttachment();
- if (!(attachment instanceof PathAttachment$1)) return;
- let rotateMix = this.rotateMix, translateMix = this.translateMix;
- let translate = translateMix > 0, rotate = rotateMix > 0;
- if (!translate && !rotate) return;
- let data = this.data;
- let spacingMode = data.spacingMode;
- let lengthSpacing = spacingMode == SpacingMode$1.Length;
- let rotateMode = data.rotateMode;
- let tangents = rotateMode == RotateMode$1.Tangent, scale = rotateMode == RotateMode$1.ChainScale;
- let boneCount = this.bones.length, spacesCount = tangents ? boneCount : boneCount + 1;
- let bones = this.bones;
- let spaces = Utils.setArraySize(this.spaces, spacesCount), lengths = null;
- let spacing = this.spacing;
- if (scale || lengthSpacing) {
- if (scale) lengths = Utils.setArraySize(this.lengths, boneCount);
- for (let i = 0, n = spacesCount - 1; i < n;) {
- let bone = bones[i];
- let setupLength = bone.data.length;
- if (setupLength < PathConstraint$1.epsilon) {
- if (scale) lengths[i] = 0;
- spaces[++i] = 0;
- } else {
- let x = setupLength * bone.matrix.a, y = setupLength * bone.matrix.b;
- let length = Math.sqrt(x * x + y * y);
- if (scale) lengths[i] = length;
- spaces[++i] = (lengthSpacing ? setupLength + spacing : spacing) * length / setupLength;
- }
- }
- } else {
- for (let i = 1; i < spacesCount; i++)
- spaces[i] = spacing;
- }
- let positions = this.computeWorldPositions(attachment, spacesCount, tangents,
- data.positionMode == PositionMode$1.Percent, spacingMode == SpacingMode$1.Percent);
- let boneX = positions[0], boneY = positions[1], offsetRotation = data.offsetRotation;
- let tip = false;
- if (offsetRotation == 0)
- tip = rotateMode == RotateMode$1.Chain;
- else {
- tip = false;
- let p = this.target.bone.matrix;
- offsetRotation *= p.a * p.d - p.b * p.c > 0 ? MathUtils.degRad : -MathUtils.degRad;
- }
- for (let i = 0, p = 3; i < boneCount; i++, p += 3) {
- let bone = bones[i];
- let mat = bone.matrix;
- mat.tx += (boneX - mat.tx) * translateMix;
- mat.ty += (boneY - mat.ty) * translateMix;
- let x = positions[p], y = positions[p + 1], dx = x - boneX, dy = y - boneY;
- if (scale) {
- let length = lengths[i];
- if (length != 0) {
- let s = (Math.sqrt(dx * dx + dy * dy) / length - 1) * rotateMix + 1;
- mat.a *= s;
- mat.b *= s;
- }
- }
- boneX = x;
- boneY = y;
- if (rotate) {
- let a = mat.a, b = mat.c, c = mat.b, d = mat.d, r = 0, cos = 0, sin = 0;
- if (tangents)
- r = positions[p - 1];
- else if (spaces[i + 1] == 0)
- r = positions[p + 2];
- else
- r = Math.atan2(dy, dx);
- r -= Math.atan2(c, a);
- if (tip) {
- cos = Math.cos(r);
- sin = Math.sin(r);
- let length = bone.data.length;
- boneX += (length * (cos * a - sin * c) - dx) * rotateMix;
- boneY += (length * (sin * a + cos * c) - dy) * rotateMix;
- } else {
- r += offsetRotation;
- }
- if (r > MathUtils.PI)
- r -= MathUtils.PI2;
- else if (r < -MathUtils.PI) //
- r += MathUtils.PI2;
- r *= rotateMix;
- cos = Math.cos(r);
- sin = Math.sin(r);
- mat.a = cos * a - sin * c;
- mat.c = cos * b - sin * d;
- mat.b = sin * a + cos * c;
- mat.d = sin * b + cos * d;
- }
- bone.appliedValid = false;
- }
- }
- computeWorldPositions (path, spacesCount, tangents, percentPosition,
- percentSpacing) {
- let target = this.target;
- let position = this.position;
- let spaces = this.spaces, out = Utils.setArraySize(this.positions, spacesCount * 3 + 2), world = null;
- let closed = path.closed;
- let verticesLength = path.worldVerticesLength, curveCount = verticesLength / 6, prevCurve = PathConstraint$1.NONE;
- if (!path.constantSpeed) {
- let lengths = path.lengths;
- curveCount -= closed ? 1 : 2;
- let pathLength = lengths[curveCount];
- if (percentPosition) position *= pathLength;
- if (percentSpacing) {
- for (let i = 0; i < spacesCount; i++)
- spaces[i] *= pathLength;
- }
- world = Utils.setArraySize(this.world, 8);
- for (let i = 0, o = 0, curve = 0; i < spacesCount; i++, o += 3) {
- let space = spaces[i];
- position += space;
- let p = position;
- if (closed) {
- p %= pathLength;
- if (p < 0) p += pathLength;
- curve = 0;
- } else if (p < 0) {
- if (prevCurve != PathConstraint$1.BEFORE) {
- prevCurve = PathConstraint$1.BEFORE;
- path.computeWorldVertices(target, 2, 4, world, 0, 2);
- }
- this.addBeforePosition(p, world, 0, out, o);
- continue;
- } else if (p > pathLength) {
- if (prevCurve != PathConstraint$1.AFTER) {
- prevCurve = PathConstraint$1.AFTER;
- path.computeWorldVertices(target, verticesLength - 6, 4, world, 0, 2);
- }
- this.addAfterPosition(p - pathLength, world, 0, out, o);
- continue;
- }
- // Determine curve containing position.
- for (;; curve++) {
- let length = lengths[curve];
- if (p > length) continue;
- if (curve == 0)
- p /= length;
- else {
- let prev = lengths[curve - 1];
- p = (p - prev) / (length - prev);
- }
- break;
- }
- if (curve != prevCurve) {
- prevCurve = curve;
- if (closed && curve == curveCount) {
- path.computeWorldVertices(target, verticesLength - 4, 4, world, 0, 2);
- path.computeWorldVertices(target, 0, 4, world, 4, 2);
- } else
- path.computeWorldVertices(target, curve * 6 + 2, 8, world, 0, 2);
- }
- this.addCurvePosition(p, world[0], world[1], world[2], world[3], world[4], world[5], world[6], world[7], out, o,
- tangents || (i > 0 && space == 0));
- }
- return out;
- }
- // World vertices.
- if (closed) {
- verticesLength += 2;
- world = Utils.setArraySize(this.world, verticesLength);
- path.computeWorldVertices(target, 2, verticesLength - 4, world, 0, 2);
- path.computeWorldVertices(target, 0, 2, world, verticesLength - 4, 2);
- world[verticesLength - 2] = world[0];
- world[verticesLength - 1] = world[1];
- } else {
- curveCount--;
- verticesLength -= 4;
- world = Utils.setArraySize(this.world, verticesLength);
- path.computeWorldVertices(target, 2, verticesLength, world, 0, 2);
- }
- // Curve lengths.
- let curves = Utils.setArraySize(this.curves, curveCount);
- let pathLength = 0;
- let x1 = world[0], y1 = world[1], cx1 = 0, cy1 = 0, cx2 = 0, cy2 = 0, x2 = 0, y2 = 0;
- let tmpx = 0, tmpy = 0, dddfx = 0, dddfy = 0, ddfx = 0, ddfy = 0, dfx = 0, dfy = 0;
- for (let i = 0, w = 2; i < curveCount; i++, w += 6) {
- cx1 = world[w];
- cy1 = world[w + 1];
- cx2 = world[w + 2];
- cy2 = world[w + 3];
- x2 = world[w + 4];
- y2 = world[w + 5];
- tmpx = (x1 - cx1 * 2 + cx2) * 0.1875;
- tmpy = (y1 - cy1 * 2 + cy2) * 0.1875;
- dddfx = ((cx1 - cx2) * 3 - x1 + x2) * 0.09375;
- dddfy = ((cy1 - cy2) * 3 - y1 + y2) * 0.09375;
- ddfx = tmpx * 2 + dddfx;
- ddfy = tmpy * 2 + dddfy;
- dfx = (cx1 - x1) * 0.75 + tmpx + dddfx * 0.16666667;
- dfy = (cy1 - y1) * 0.75 + tmpy + dddfy * 0.16666667;
- pathLength += Math.sqrt(dfx * dfx + dfy * dfy);
- dfx += ddfx;
- dfy += ddfy;
- ddfx += dddfx;
- ddfy += dddfy;
- pathLength += Math.sqrt(dfx * dfx + dfy * dfy);
- dfx += ddfx;
- dfy += ddfy;
- pathLength += Math.sqrt(dfx * dfx + dfy * dfy);
- dfx += ddfx + dddfx;
- dfy += ddfy + dddfy;
- pathLength += Math.sqrt(dfx * dfx + dfy * dfy);
- curves[i] = pathLength;
- x1 = x2;
- y1 = y2;
- }
- if (percentPosition) position *= pathLength;
- if (percentSpacing) {
- for (let i = 0; i < spacesCount; i++)
- spaces[i] *= pathLength;
- }
- let segments = this.segments;
- let curveLength = 0;
- for (let i = 0, o = 0, curve = 0, segment = 0; i < spacesCount; i++, o += 3) {
- let space = spaces[i];
- position += space;
- let p = position;
- if (closed) {
- p %= pathLength;
- if (p < 0) p += pathLength;
- curve = 0;
- } else if (p < 0) {
- this.addBeforePosition(p, world, 0, out, o);
- continue;
- } else if (p > pathLength) {
- this.addAfterPosition(p - pathLength, world, verticesLength - 4, out, o);
- continue;
- }
- // Determine curve containing position.
- for (;; curve++) {
- let length = curves[curve];
- if (p > length) continue;
- if (curve == 0)
- p /= length;
- else {
- let prev = curves[curve - 1];
- p = (p - prev) / (length - prev);
- }
- break;
- }
- // Curve segment lengths.
- if (curve != prevCurve) {
- prevCurve = curve;
- let ii = curve * 6;
- x1 = world[ii];
- y1 = world[ii + 1];
- cx1 = world[ii + 2];
- cy1 = world[ii + 3];
- cx2 = world[ii + 4];
- cy2 = world[ii + 5];
- x2 = world[ii + 6];
- y2 = world[ii + 7];
- tmpx = (x1 - cx1 * 2 + cx2) * 0.03;
- tmpy = (y1 - cy1 * 2 + cy2) * 0.03;
- dddfx = ((cx1 - cx2) * 3 - x1 + x2) * 0.006;
- dddfy = ((cy1 - cy2) * 3 - y1 + y2) * 0.006;
- ddfx = tmpx * 2 + dddfx;
- ddfy = tmpy * 2 + dddfy;
- dfx = (cx1 - x1) * 0.3 + tmpx + dddfx * 0.16666667;
- dfy = (cy1 - y1) * 0.3 + tmpy + dddfy * 0.16666667;
- curveLength = Math.sqrt(dfx * dfx + dfy * dfy);
- segments[0] = curveLength;
- for (ii = 1; ii < 8; ii++) {
- dfx += ddfx;
- dfy += ddfy;
- ddfx += dddfx;
- ddfy += dddfy;
- curveLength += Math.sqrt(dfx * dfx + dfy * dfy);
- segments[ii] = curveLength;
- }
- dfx += ddfx;
- dfy += ddfy;
- curveLength += Math.sqrt(dfx * dfx + dfy * dfy);
- segments[8] = curveLength;
- dfx += ddfx + dddfx;
- dfy += ddfy + dddfy;
- curveLength += Math.sqrt(dfx * dfx + dfy * dfy);
- segments[9] = curveLength;
- segment = 0;
- }
- // Weight by segment length.
- p *= curveLength;
- for (;; segment++) {
- let length = segments[segment];
- if (p > length) continue;
- if (segment == 0)
- p /= length;
- else {
- let prev = segments[segment - 1];
- p = segment + (p - prev) / (length - prev);
- }
- break;
- }
- this.addCurvePosition(p * 0.1, x1, y1, cx1, cy1, cx2, cy2, x2, y2, out, o, tangents || (i > 0 && space == 0));
- }
- return out;
- }
- addBeforePosition (p, temp, i, out, o) {
- let x1 = temp[i], y1 = temp[i + 1], dx = temp[i + 2] - x1, dy = temp[i + 3] - y1, r = Math.atan2(dy, dx);
- out[o] = x1 + p * Math.cos(r);
- out[o + 1] = y1 + p * Math.sin(r);
- out[o + 2] = r;
- }
- addAfterPosition (p, temp, i, out, o) {
- let x1 = temp[i + 2], y1 = temp[i + 3], dx = x1 - temp[i], dy = y1 - temp[i + 1], r = Math.atan2(dy, dx);
- out[o] = x1 + p * Math.cos(r);
- out[o + 1] = y1 + p * Math.sin(r);
- out[o + 2] = r;
- }
- addCurvePosition (p, x1, y1, cx1, cy1, cx2, cy2, x2, y2,
- out, o, tangents) {
- if (p == 0 || isNaN(p)) p = 0.0001;
- let tt = p * p, ttt = tt * p, u = 1 - p, uu = u * u, uuu = uu * u;
- let ut = u * p, ut3 = ut * 3, uut3 = u * ut3, utt3 = ut3 * p;
- let x = x1 * uuu + cx1 * uut3 + cx2 * utt3 + x2 * ttt, y = y1 * uuu + cy1 * uut3 + cy2 * utt3 + y2 * ttt;
- out[o] = x;
- out[o + 1] = y;
- if (tangents) out[o + 2] = Math.atan2(y - (y1 * uu + cy1 * ut * 2 + cy2 * tt), x - (x1 * uu + cx1 * ut * 2 + cx2 * tt));
- }
- getOrder () {
- return this.data.order;
- }
- } PathConstraint$1.__initStatic(); PathConstraint$1.__initStatic2(); PathConstraint$1.__initStatic3(); PathConstraint$1.__initStatic4();
- /**
- * @public
- */
- class Slot$1 {
-
- //this is canon
-
-
-
-
-
-
- __init() {this.attachmentVertices = new Array();}
- constructor (data, bone) {Slot$1.prototype.__init.call(this);
- if (data == null) throw new Error("data cannot be null.");
- if (bone == null) throw new Error("bone cannot be null.");
- this.data = data;
- this.bone = bone;
- this.color = new Color();
- this.darkColor = data.darkColor == null ? null : new Color();
- this.setToSetupPose();
- this.blendMode = this.data.blendMode;
- }
- /** @return May be null. */
- getAttachment () {
- return this.attachment;
- }
- /** Sets the attachment and if it changed, resets {@link #getAttachmentTime()} and clears {@link #getAttachmentVertices()}.
- * @param attachment May be null. */
- setAttachment (attachment) {
- if (this.attachment == attachment) return;
- this.attachment = attachment;
- this.attachmentTime = this.bone.skeleton.time;
- this.attachmentVertices.length = 0;
- }
- setAttachmentTime (time) {
- this.attachmentTime = this.bone.skeleton.time - time;
- }
- /** Returns the time since the attachment was set. */
- getAttachmentTime () {
- return this.bone.skeleton.time - this.attachmentTime;
- }
- setToSetupPose () {
- this.color.setFromColor(this.data.color);
- if (this.darkColor != null) this.darkColor.setFromColor(this.data.darkColor);
- if (this.data.attachmentName == null)
- this.attachment = null;
- else {
- this.attachment = null;
- this.setAttachment(this.bone.skeleton.getAttachment(this.data.index, this.data.attachmentName));
- }
- }
- }
- /**
- * @public
- */
- class TransformConstraint$1 {
-
-
-
- __init() {this.rotateMix = 0;}
- __init2() {this.translateMix = 0;}
- __init3() {this.scaleMix = 0;}
- __init4() {this.shearMix = 0;}
- __init5() {this.temp = new Vector2();}
- constructor(data, skeleton) {TransformConstraint$1.prototype.__init.call(this);TransformConstraint$1.prototype.__init2.call(this);TransformConstraint$1.prototype.__init3.call(this);TransformConstraint$1.prototype.__init4.call(this);TransformConstraint$1.prototype.__init5.call(this);
- if (data == null) throw new Error("data cannot be null.");
- if (skeleton == null) throw new Error("skeleton cannot be null.");
- this.data = data;
- this.rotateMix = data.rotateMix;
- this.translateMix = data.translateMix;
- this.scaleMix = data.scaleMix;
- this.shearMix = data.shearMix;
- this.bones = new Array();
- for (let i = 0; i < data.bones.length; i++)
- this.bones.push(skeleton.findBone(data.bones[i].name));
- this.target = skeleton.findBone(data.target.name);
- }
- apply() {
- this.update();
- }
- update() {
- if (this.data.local) {
- if (this.data.relative)
- this.applyRelativeLocal();
- else
- this.applyAbsoluteLocal();
- } else {
- if (this.data.relative)
- this.applyRelativeWorld();
- else
- this.applyAbsoluteWorld();
- }
- }
- applyAbsoluteWorld() {
- let rotateMix = this.rotateMix, translateMix = this.translateMix, scaleMix = this.scaleMix,
- shearMix = this.shearMix;
- let target = this.target;
- let targetMat = target.matrix;
- let ta = targetMat.a, tb = targetMat.c, tc = targetMat.b, td = targetMat.d;
- let degRadReflect = ta * td - tb * tc > 0 ? MathUtils.degRad : -MathUtils.degRad;
- let offsetRotation = this.data.offsetRotation * degRadReflect;
- let offsetShearY = this.data.offsetShearY * degRadReflect;
- let bones = this.bones;
- for (let i = 0, n = bones.length; i < n; i++) {
- let bone = bones[i];
- let modified = false;
- let mat = bone.matrix;
- if (rotateMix != 0) {
- let a = mat.a, b = mat.c, c = mat.b, d = mat.d;
- let r = Math.atan2(tc, ta) - Math.atan2(c, a) + offsetRotation;
- if (r > MathUtils.PI)
- r -= MathUtils.PI2;
- else if (r < -MathUtils.PI)
- r += MathUtils.PI2;
- r *= rotateMix;
- let cos = Math.cos(r), sin = Math.sin(r);
- mat.a = cos * a - sin * c;
- mat.c = cos * b - sin * d;
- mat.b = sin * a + cos * c;
- mat.d = sin * b + cos * d;
- modified = true;
- }
- if (translateMix != 0) {
- let temp = this.temp;
- target.localToWorld(temp.set(this.data.offsetX, this.data.offsetY));
- mat.tx += (temp.x - mat.tx) * translateMix;
- mat.ty += (temp.y - mat.ty) * translateMix;
- modified = true;
- }
- if (scaleMix > 0) {
- let s = Math.sqrt(mat.a * mat.a + mat.b * mat.b);
- let ts = Math.sqrt(ta * ta + tc * tc);
- if (s > 0.00001) s = (s + (ts - s + this.data.offsetScaleX) * scaleMix) / s;
- mat.a *= s;
- mat.b *= s;
- s = Math.sqrt(mat.c * mat.c + mat.d * mat.d);
- ts = Math.sqrt(tb * tb + td * td);
- if (s > 0.00001) s = (s + (ts - s + this.data.offsetScaleY) * scaleMix) / s;
- mat.c *= s;
- mat.d *= s;
- modified = true;
- }
- if (shearMix > 0) {
- let b = mat.c, d = mat.d;
- let by = Math.atan2(d, b);
- let r = Math.atan2(td, tb) - Math.atan2(tc, ta) - (by - Math.atan2(mat.b, mat.a));
- if (r > MathUtils.PI)
- r -= MathUtils.PI2;
- else if (r < -MathUtils.PI)
- r += MathUtils.PI2;
- r = by + (r + offsetShearY) * shearMix;
- let s = Math.sqrt(b * b + d * d);
- mat.c = Math.cos(r) * s;
- mat.d = Math.sin(r) * s;
- modified = true;
- }
- if (modified) bone.appliedValid = false;
- }
- }
- applyRelativeWorld() {
- let rotateMix = this.rotateMix, translateMix = this.translateMix, scaleMix = this.scaleMix,
- shearMix = this.shearMix;
- let target = this.target;
- let targetMat = target.matrix;
- let ta = targetMat.a, tb = targetMat.c, tc = targetMat.b, td = targetMat.d;
- let degRadReflect = ta * td - tb * tc > 0 ? MathUtils.degRad : -MathUtils.degRad;
- let offsetRotation = this.data.offsetRotation * degRadReflect,
- offsetShearY = this.data.offsetShearY * degRadReflect;
- let bones = this.bones;
- for (let i = 0, n = bones.length; i < n; i++) {
- let bone = bones[i];
- let modified = false;
- let mat = bone.matrix;
- if (rotateMix != 0) {
- let a = mat.a, b = mat.c, c = mat.b, d = mat.d;
- let r = Math.atan2(tc, ta) + offsetRotation;
- if (r > MathUtils.PI)
- r -= MathUtils.PI2;
- else if (r < -MathUtils.PI) r += MathUtils.PI2;
- r *= rotateMix;
- let cos = Math.cos(r), sin = Math.sin(r);
- mat.a = cos * a - sin * c;
- mat.c = cos * b - sin * d;
- mat.b = sin * a + cos * c;
- mat.d = sin * b + cos * d;
- modified = true;
- }
- if (translateMix != 0) {
- let temp = this.temp;
- target.localToWorld(temp.set(this.data.offsetX, this.data.offsetY));
- mat.tx += temp.x * translateMix;
- mat.ty += temp.y * translateMix;
- modified = true;
- }
- if (scaleMix > 0) {
- let s = (Math.sqrt(ta * ta + tc * tc) - 1 + this.data.offsetScaleX) * scaleMix + 1;
- mat.a *= s;
- mat.b *= s;
- s = (Math.sqrt(tb * tb + td * td) - 1 + this.data.offsetScaleY) * scaleMix + 1;
- mat.c *= s;
- mat.d *= s;
- modified = true;
- }
- if (shearMix > 0) {
- let r = Math.atan2(td, tb) - Math.atan2(tc, ta);
- if (r > MathUtils.PI)
- r -= MathUtils.PI2;
- else if (r < -MathUtils.PI) r += MathUtils.PI2;
- let b = mat.c, d = mat.d;
- r = Math.atan2(d, b) + (r - MathUtils.PI / 2 + offsetShearY) * shearMix;
- let s = Math.sqrt(b * b + d * d);
- mat.c = Math.cos(r) * s;
- mat.d = Math.sin(r) * s;
- modified = true;
- }
- if (modified) bone.appliedValid = false;
- }
- }
- applyAbsoluteLocal() {
- let rotateMix = this.rotateMix, translateMix = this.translateMix, scaleMix = this.scaleMix,
- shearMix = this.shearMix;
- let target = this.target;
- if (!target.appliedValid) target.updateAppliedTransform();
- let bones = this.bones;
- for (let i = 0, n = bones.length; i < n; i++) {
- let bone = bones[i];
- if (!bone.appliedValid) bone.updateAppliedTransform();
- let rotation = bone.arotation;
- if (rotateMix != 0) {
- let r = target.arotation - rotation + this.data.offsetRotation;
- r -= (16384 - ((16384.499999999996 - r / 360) | 0)) * 360;
- rotation += r * rotateMix;
- }
- let x = bone.ax, y = bone.ay;
- if (translateMix != 0) {
- x += (target.ax - x + this.data.offsetX) * translateMix;
- y += (target.ay - y + this.data.offsetY) * translateMix;
- }
- let scaleX = bone.ascaleX, scaleY = bone.ascaleY;
- if (scaleMix > 0) {
- if (scaleX > 0.00001) scaleX = (scaleX + (target.ascaleX - scaleX + this.data.offsetScaleX) * scaleMix) / scaleX;
- if (scaleY > 0.00001) scaleY = (scaleY + (target.ascaleY - scaleY + this.data.offsetScaleY) * scaleMix) / scaleY;
- }
- let shearY = bone.ashearY;
- if (shearMix > 0) {
- let r = target.ashearY - shearY + this.data.offsetShearY;
- r -= (16384 - ((16384.499999999996 - r / 360) | 0)) * 360;
- bone.shearY += r * shearMix;
- }
- bone.updateWorldTransformWith(x, y, rotation, scaleX, scaleY, bone.ashearX, shearY);
- }
- }
- applyRelativeLocal() {
- let rotateMix = this.rotateMix, translateMix = this.translateMix, scaleMix = this.scaleMix,
- shearMix = this.shearMix;
- let target = this.target;
- if (!target.appliedValid) target.updateAppliedTransform();
- let bones = this.bones;
- for (let i = 0, n = bones.length; i < n; i++) {
- let bone = bones[i];
- if (!bone.appliedValid) bone.updateAppliedTransform();
- let rotation = bone.arotation;
- if (rotateMix != 0) rotation += (target.arotation + this.data.offsetRotation) * rotateMix;
- let x = bone.ax, y = bone.ay;
- if (translateMix != 0) {
- x += (target.ax + this.data.offsetX) * translateMix;
- y += (target.ay + this.data.offsetY) * translateMix;
- }
- let scaleX = bone.ascaleX, scaleY = bone.ascaleY;
- if (scaleMix > 0) {
- if (scaleX > 0.00001) scaleX *= ((target.ascaleX - 1 + this.data.offsetScaleX) * scaleMix) + 1;
- if (scaleY > 0.00001) scaleY *= ((target.ascaleY - 1 + this.data.offsetScaleY) * scaleMix) + 1;
- }
- let shearY = bone.ashearY;
- if (shearMix > 0) shearY += (target.ashearY + this.data.offsetShearY) * shearMix;
- bone.updateWorldTransformWith(x, y, rotation, scaleX, scaleY, bone.ashearX, shearY);
- }
- }
- getOrder() {
- return this.data.order;
- }
- }
- /**
- * @public
- */
- class Skeleton$1 {
-
-
-
-
-
-
-
- __init() {this._updateCache = new Array();}
- __init2() {this.updateCacheReset = new Array();}
-
-
- __init3() {this.time = 0;}
- __init4() {this.scaleX = 1;} __init5() {this.scaleY = 1;}
- __init6() {this.x = 0;} __init7() {this.y = 0;}
- constructor (data) {Skeleton$1.prototype.__init.call(this);Skeleton$1.prototype.__init2.call(this);Skeleton$1.prototype.__init3.call(this);Skeleton$1.prototype.__init4.call(this);Skeleton$1.prototype.__init5.call(this);Skeleton$1.prototype.__init6.call(this);Skeleton$1.prototype.__init7.call(this);
- if (data == null) throw new Error("data cannot be null.");
- this.data = data;
- this.bones = new Array();
- for (let i = 0; i < data.bones.length; i++) {
- let boneData = data.bones[i];
- let bone;
- if (boneData.parent == null)
- bone = new Bone$1(boneData, this, null);
- else {
- let parent = this.bones[boneData.parent.index];
- bone = new Bone$1(boneData, this, parent);
- parent.children.push(bone);
- }
- this.bones.push(bone);
- }
- this.slots = new Array();
- this.drawOrder = new Array();
- for (let i = 0; i < data.slots.length; i++) {
- let slotData = data.slots[i];
- let bone = this.bones[slotData.boneData.index];
- let slot = new Slot$1(slotData, bone);
- this.slots.push(slot);
- this.drawOrder.push(slot);
- }
- this.ikConstraints = new Array();
- for (let i = 0; i < data.ikConstraints.length; i++) {
- let ikConstraintData = data.ikConstraints[i];
- this.ikConstraints.push(new IkConstraint$1(ikConstraintData, this));
- }
- this.transformConstraints = new Array();
- for (let i = 0; i < data.transformConstraints.length; i++) {
- let transformConstraintData = data.transformConstraints[i];
- this.transformConstraints.push(new TransformConstraint$1(transformConstraintData, this));
- }
- this.pathConstraints = new Array();
- for (let i = 0; i < data.pathConstraints.length; i++) {
- let pathConstraintData = data.pathConstraints[i];
- this.pathConstraints.push(new PathConstraint$1(pathConstraintData, this));
- }
- this.color = new Color(1, 1, 1, 1);
- this.updateCache();
- }
- updateCache () {
- let updateCache = this._updateCache;
- updateCache.length = 0;
- this.updateCacheReset.length = 0;
- let bones = this.bones;
- for (let i = 0, n = bones.length; i < n; i++)
- bones[i].sorted = false;
- // IK first, lowest hierarchy depth first.
- let ikConstraints = this.ikConstraints;
- let transformConstraints = this.transformConstraints;
- let pathConstraints = this.pathConstraints;
- let ikCount = ikConstraints.length, transformCount = transformConstraints.length, pathCount = pathConstraints.length;
- let constraintCount = ikCount + transformCount + pathCount;
- outer:
- for (let i = 0; i < constraintCount; i++) {
- for (let ii = 0; ii < ikCount; ii++) {
- let constraint = ikConstraints[ii];
- if (constraint.data.order == i) {
- this.sortIkConstraint(constraint);
- continue outer;
- }
- }
- for (let ii = 0; ii < transformCount; ii++) {
- let constraint = transformConstraints[ii];
- if (constraint.data.order == i) {
- this.sortTransformConstraint(constraint);
- continue outer;
- }
- }
- for (let ii = 0; ii < pathCount; ii++) {
- let constraint = pathConstraints[ii];
- if (constraint.data.order == i) {
- this.sortPathConstraint(constraint);
- continue outer;
- }
- }
- }
- for (let i = 0, n = bones.length; i < n; i++)
- this.sortBone(bones[i]);
- }
- sortIkConstraint (constraint) {
- let target = constraint.target;
- this.sortBone(target);
- let constrained = constraint.bones;
- let parent = constrained[0];
- this.sortBone(parent);
- if (constrained.length > 1) {
- let child = constrained[constrained.length - 1];
- if (!(this._updateCache.indexOf(child) > -1)) this.updateCacheReset.push(child);
- }
- this._updateCache.push(constraint);
- this.sortReset(parent.children);
- constrained[constrained.length - 1].sorted = true;
- }
- sortPathConstraint (constraint) {
- let slot = constraint.target;
- let slotIndex = slot.data.index;
- let slotBone = slot.bone;
- if (this.skin != null) this.sortPathConstraintAttachment(this.skin, slotIndex, slotBone);
- if (this.data.defaultSkin != null && this.data.defaultSkin != this.skin)
- this.sortPathConstraintAttachment(this.data.defaultSkin, slotIndex, slotBone);
- for (let i = 0, n = this.data.skins.length; i < n; i++)
- this.sortPathConstraintAttachment(this.data.skins[i], slotIndex, slotBone);
- let attachment = slot.getAttachment();
- if (attachment instanceof PathAttachment$1) this.sortPathConstraintAttachmentWith(attachment, slotBone);
- let constrained = constraint.bones;
- let boneCount = constrained.length;
- for (let i = 0; i < boneCount; i++)
- this.sortBone(constrained[i]);
- this._updateCache.push(constraint);
- for (let i = 0; i < boneCount; i++)
- this.sortReset(constrained[i].children);
- for (let i = 0; i < boneCount; i++)
- constrained[i].sorted = true;
- }
- sortTransformConstraint (constraint) {
- this.sortBone(constraint.target);
- let constrained = constraint.bones;
- let boneCount = constrained.length;
- if (constraint.data.local) {
- for (let i = 0; i < boneCount; i++) {
- let child = constrained[i];
- this.sortBone(child.parent);
- if (!(this._updateCache.indexOf(child) > -1)) this.updateCacheReset.push(child);
- }
- } else {
- for (let i = 0; i < boneCount; i++) {
- this.sortBone(constrained[i]);
- }
- }
- this._updateCache.push(constraint);
- for (let ii = 0; ii < boneCount; ii++)
- this.sortReset(constrained[ii].children);
- for (let ii = 0; ii < boneCount; ii++)
- constrained[ii].sorted = true;
- }
- sortPathConstraintAttachment (skin, slotIndex, slotBone) {
- let attachments = skin.attachments[slotIndex];
- if (!attachments) return;
- for (let key in attachments) {
- this.sortPathConstraintAttachmentWith(attachments[key], slotBone);
- }
- }
- sortPathConstraintAttachmentWith (attachment, slotBone) {
- if (!(attachment instanceof PathAttachment$1)) return;
- let pathBones = (attachment).bones;
- if (pathBones == null)
- this.sortBone(slotBone);
- else {
- let bones = this.bones;
- let i = 0;
- while (i < pathBones.length) {
- let boneCount = pathBones[i++];
- for (let n = i + boneCount; i < n; i++) {
- let boneIndex = pathBones[i];
- this.sortBone(bones[boneIndex]);
- }
- }
- }
- }
- sortBone (bone) {
- if (bone.sorted) return;
- let parent = bone.parent;
- if (parent != null) this.sortBone(parent);
- bone.sorted = true;
- this._updateCache.push(bone);
- }
- sortReset (bones) {
- for (let i = 0, n = bones.length; i < n; i++) {
- let bone = bones[i];
- if (bone.sorted) this.sortReset(bone.children);
- bone.sorted = false;
- }
- }
- /** Updates the world transform for each bone and applies constraints. */
- updateWorldTransform () {
- let updateCacheReset = this.updateCacheReset;
- for (let i = 0, n = updateCacheReset.length; i < n; i++) {
- let bone = updateCacheReset[i] ;
- bone.ax = bone.x;
- bone.ay = bone.y;
- bone.arotation = bone.rotation;
- bone.ascaleX = bone.scaleX;
- bone.ascaleY = bone.scaleY;
- bone.ashearX = bone.shearX;
- bone.ashearY = bone.shearY;
- bone.appliedValid = true;
- }
- let updateCache = this._updateCache;
- for (let i = 0, n = updateCache.length; i < n; i++)
- updateCache[i].update();
- }
- /** Sets the bones, constraints, and slots to their setup pose values. */
- setToSetupPose () {
- this.setBonesToSetupPose();
- this.setSlotsToSetupPose();
- }
- /** Sets the bones and constraints to their setup pose values. */
- setBonesToSetupPose () {
- let bones = this.bones;
- for (let i = 0, n = bones.length; i < n; i++)
- bones[i].setToSetupPose();
- let ikConstraints = this.ikConstraints;
- for (let i = 0, n = ikConstraints.length; i < n; i++) {
- let constraint = ikConstraints[i];
- constraint.bendDirection = constraint.data.bendDirection;
- constraint.mix = constraint.data.mix;
- }
- let transformConstraints = this.transformConstraints;
- for (let i = 0, n = transformConstraints.length; i < n; i++) {
- let constraint = transformConstraints[i];
- let data = constraint.data;
- constraint.rotateMix = data.rotateMix;
- constraint.translateMix = data.translateMix;
- constraint.scaleMix = data.scaleMix;
- constraint.shearMix = data.shearMix;
- }
- let pathConstraints = this.pathConstraints;
- for (let i = 0, n = pathConstraints.length; i < n; i++) {
- let constraint = pathConstraints[i];
- let data = constraint.data;
- constraint.position = data.position;
- constraint.spacing = data.spacing;
- constraint.rotateMix = data.rotateMix;
- constraint.translateMix = data.translateMix;
- }
- }
- setSlotsToSetupPose () {
- let slots = this.slots;
- Utils.arrayCopy(slots, 0, this.drawOrder, 0, slots.length);
- for (let i = 0, n = slots.length; i < n; i++)
- slots[i].setToSetupPose();
- }
- /** @return May return null. */
- getRootBone () {
- if (this.bones.length == 0) return null;
- return this.bones[0];
- }
- /** @return May be null. */
- findBone (boneName) {
- if (boneName == null) throw new Error("boneName cannot be null.");
- let bones = this.bones;
- for (let i = 0, n = bones.length; i < n; i++) {
- let bone = bones[i];
- if (bone.data.name == boneName) return bone;
- }
- return null;
- }
- /** @return -1 if the bone was not found. */
- findBoneIndex (boneName) {
- if (boneName == null) throw new Error("boneName cannot be null.");
- let bones = this.bones;
- for (let i = 0, n = bones.length; i < n; i++)
- if (bones[i].data.name == boneName) return i;
- return -1;
- }
- /** @return May be null. */
- findSlot (slotName) {
- if (slotName == null) throw new Error("slotName cannot be null.");
- let slots = this.slots;
- for (let i = 0, n = slots.length; i < n; i++) {
- let slot = slots[i];
- if (slot.data.name == slotName) return slot;
- }
- return null;
- }
- /** @return -1 if the bone was not found. */
- findSlotIndex (slotName) {
- if (slotName == null) throw new Error("slotName cannot be null.");
- let slots = this.slots;
- for (let i = 0, n = slots.length; i < n; i++)
- if (slots[i].data.name == slotName) return i;
- return -1;
- }
- /** Sets a skin by name.
- * @see #setSkin(Skin) */
- setSkinByName (skinName) {
- let skin = this.data.findSkin(skinName);
- if (skin == null) throw new Error("Skin not found: " + skinName);
- this.setSkin(skin);
- }
- /** Sets the skin used to look up attachments before looking in the {@link SkeletonData#getDefaultSkin() default skin}.
- * Attachments from the new skin are attached if the corresponding attachment from the old skin was attached. If there was no
- * old skin, each slot's setup mode attachment is attached from the new skin.
- * @param newSkin May be null. */
- setSkin (newSkin) {
- if (newSkin != null) {
- if (this.skin != null)
- newSkin.attachAll(this, this.skin);
- else {
- let slots = this.slots;
- for (let i = 0, n = slots.length; i < n; i++) {
- let slot = slots[i];
- let name = slot.data.attachmentName;
- if (name != null) {
- let attachment = newSkin.getAttachment(i, name);
- if (attachment != null) slot.setAttachment(attachment);
- }
- }
- }
- }
- this.skin = newSkin;
- }
- /** @return May be null. */
- getAttachmentByName (slotName, attachmentName) {
- return this.getAttachment(this.data.findSlotIndex(slotName), attachmentName);
- }
- /** @return May be null. */
- getAttachment (slotIndex, attachmentName) {
- if (attachmentName == null) throw new Error("attachmentName cannot be null.");
- if (this.skin != null) {
- let attachment = this.skin.getAttachment(slotIndex, attachmentName);
- if (attachment != null) return attachment;
- }
- if (this.data.defaultSkin != null) return this.data.defaultSkin.getAttachment(slotIndex, attachmentName);
- return null;
- }
- /** @param attachmentName May be null. */
- setAttachment (slotName, attachmentName) {
- if (slotName == null) throw new Error("slotName cannot be null.");
- let slots = this.slots;
- for (let i = 0, n = slots.length; i < n; i++) {
- let slot = slots[i];
- if (slot.data.name == slotName) {
- let attachment = null;
- if (attachmentName != null) {
- attachment = this.getAttachment(i, attachmentName);
- if (attachment == null)
- throw new Error("Attachment not found: " + attachmentName + ", for slot: " + slotName);
- }
- slot.setAttachment(attachment);
- return;
- }
- }
- throw new Error("Slot not found: " + slotName);
- }
- /** @return May be null. */
- findIkConstraint (constraintName) {
- if (constraintName == null) throw new Error("constraintName cannot be null.");
- let ikConstraints = this.ikConstraints;
- for (let i = 0, n = ikConstraints.length; i < n; i++) {
- let ikConstraint = ikConstraints[i];
- if (ikConstraint.data.name == constraintName) return ikConstraint;
- }
- return null;
- }
- /** @return May be null. */
- findTransformConstraint (constraintName) {
- if (constraintName == null) throw new Error("constraintName cannot be null.");
- let transformConstraints = this.transformConstraints;
- for (let i = 0, n = transformConstraints.length; i < n; i++) {
- let constraint = transformConstraints[i];
- if (constraint.data.name == constraintName) return constraint;
- }
- return null;
- }
- /** @return May be null. */
- findPathConstraint (constraintName) {
- if (constraintName == null) throw new Error("constraintName cannot be null.");
- let pathConstraints = this.pathConstraints;
- for (let i = 0, n = pathConstraints.length; i < n; i++) {
- let constraint = pathConstraints[i];
- if (constraint.data.name == constraintName) return constraint;
- }
- return null;
- }
- /** Returns the axis aligned bounding box (AABB) of the region and mesh attachments for the current pose.
- * @param offset The distance from the skeleton origin to the bottom left corner of the AABB.
- * @param size The width and height of the AABB.
- * @param temp Working memory */
- getBounds (offset, size, temp) {
- if (offset == null) throw new Error("offset cannot be null.");
- if (size == null) throw new Error("size cannot be null.");
- let drawOrder = this.drawOrder;
- let minX = Number.POSITIVE_INFINITY, minY = Number.POSITIVE_INFINITY, maxX = Number.NEGATIVE_INFINITY, maxY = Number.NEGATIVE_INFINITY;
- for (let i = 0, n = drawOrder.length; i < n; i++) {
- let slot = drawOrder[i];
- let verticesLength = 0;
- let vertices = null;
- let attachment = slot.getAttachment();
- if (attachment instanceof RegionAttachment$1) {
- verticesLength = 8;
- vertices = Utils.setArraySize(temp, verticesLength, 0);
- (attachment).computeWorldVertices(slot.bone, vertices, 0, 2);
- } else if (attachment instanceof MeshAttachment$1) {
- let mesh = (attachment);
- verticesLength = mesh.worldVerticesLength;
- vertices = Utils.setArraySize(temp, verticesLength, 0);
- mesh.computeWorldVertices(slot, 0, verticesLength, vertices, 0, 2);
- }
- if (vertices != null) {
- for (let ii = 0, nn = vertices.length; ii < nn; ii += 2) {
- let x = vertices[ii], y = vertices[ii + 1];
- minX = Math.min(minX, x);
- minY = Math.min(minY, y);
- maxX = Math.max(maxX, x);
- maxY = Math.max(maxY, y);
- }
- }
- }
- offset.set(minX, minY);
- size.set(maxX - minX, maxY - minY);
- }
- update (delta) {
- this.time += delta;
- }
- get flipX() {
- return this.scaleX == -1;
- }
- set flipX(value) {
- if (!Skeleton$1.deprecatedWarning1) {
- Skeleton$1.deprecatedWarning1 = true;
- console.warn("Spine Deprecation Warning: `Skeleton.flipX/flipY` was deprecated, please use scaleX/scaleY");
- }
- this.scaleX = value ? 1.0 : -1.0;
- }
- get flipY() {
- return this.scaleY == -1;
- }
- set flipY(value) {
- if (!Skeleton$1.deprecatedWarning1) {
- Skeleton$1.deprecatedWarning1 = true;
- console.warn("Spine Deprecation Warning: `Skeleton.flipX/flipY` was deprecated, please use scaleX/scaleY");
- }
- this.scaleY = value ? 1.0 : -1.0;
- }
- static __initStatic() {this.deprecatedWarning1 = false;}
- } Skeleton$1.__initStatic();
- /**
- * @public
- */
- class SkeletonBounds$1 {constructor() { SkeletonBounds$1.prototype.__init.call(this);SkeletonBounds$1.prototype.__init2.call(this);SkeletonBounds$1.prototype.__init3.call(this);SkeletonBounds$1.prototype.__init4.call(this);SkeletonBounds$1.prototype.__init5.call(this);SkeletonBounds$1.prototype.__init6.call(this);SkeletonBounds$1.prototype.__init7.call(this); }
- __init() {this.minX = 0;} __init2() {this.minY = 0;} __init3() {this.maxX = 0;} __init4() {this.maxY = 0;}
- __init5() {this.boundingBoxes = new Array();}
- __init6() {this.polygons = new Array();}
- __init7() {this.polygonPool = new Pool(() => {
- return Utils.newFloatArray(16);
- });}
- update (skeleton, updateAabb) {
- if (skeleton == null) throw new Error("skeleton cannot be null.");
- let boundingBoxes = this.boundingBoxes;
- let polygons = this.polygons;
- let polygonPool = this.polygonPool;
- let slots = skeleton.slots;
- let slotCount = slots.length;
- boundingBoxes.length = 0;
- polygonPool.freeAll(polygons);
- polygons.length = 0;
- for (let i = 0; i < slotCount; i++) {
- let slot = slots[i];
- let attachment = slot.getAttachment();
- if (attachment instanceof BoundingBoxAttachment$1) {
- let boundingBox = attachment ;
- boundingBoxes.push(boundingBox);
- let polygon = polygonPool.obtain();
- if (polygon.length != boundingBox.worldVerticesLength) {
- polygon = Utils.newFloatArray(boundingBox.worldVerticesLength);
- }
- polygons.push(polygon);
- boundingBox.computeWorldVertices(slot, 0, boundingBox.worldVerticesLength, polygon, 0, 2);
- }
- }
- if (updateAabb) {
- this.aabbCompute();
- } else {
- this.minX = Number.POSITIVE_INFINITY;
- this.minY = Number.POSITIVE_INFINITY;
- this.maxX = Number.NEGATIVE_INFINITY;
- this.maxY = Number.NEGATIVE_INFINITY;
- }
- }
- aabbCompute () {
- let minX = Number.POSITIVE_INFINITY, minY = Number.POSITIVE_INFINITY, maxX = Number.NEGATIVE_INFINITY, maxY = Number.NEGATIVE_INFINITY;
- let polygons = this.polygons;
- for (let i = 0, n = polygons.length; i < n; i++) {
- let polygon = polygons[i];
- let vertices = polygon;
- for (let ii = 0, nn = polygon.length; ii < nn; ii += 2) {
- let x = vertices[ii];
- let y = vertices[ii + 1];
- minX = Math.min(minX, x);
- minY = Math.min(minY, y);
- maxX = Math.max(maxX, x);
- maxY = Math.max(maxY, y);
- }
- }
- this.minX = minX;
- this.minY = minY;
- this.maxX = maxX;
- this.maxY = maxY;
- }
- /** Returns true if the axis aligned bounding box contains the point. */
- aabbContainsPoint (x, y) {
- return x >= this.minX && x <= this.maxX && y >= this.minY && y <= this.maxY;
- }
- /** Returns true if the axis aligned bounding box intersects the line segment. */
- aabbIntersectsSegment (x1, y1, x2, y2) {
- let minX = this.minX;
- let minY = this.minY;
- let maxX = this.maxX;
- let maxY = this.maxY;
- if ((x1 <= minX && x2 <= minX) || (y1 <= minY && y2 <= minY) || (x1 >= maxX && x2 >= maxX) || (y1 >= maxY && y2 >= maxY))
- return false;
- let m = (y2 - y1) / (x2 - x1);
- let y = m * (minX - x1) + y1;
- if (y > minY && y < maxY) return true;
- y = m * (maxX - x1) + y1;
- if (y > minY && y < maxY) return true;
- let x = (minY - y1) / m + x1;
- if (x > minX && x < maxX) return true;
- x = (maxY - y1) / m + x1;
- if (x > minX && x < maxX) return true;
- return false;
- }
- /** Returns true if the axis aligned bounding box intersects the axis aligned bounding box of the specified bounds. */
- aabbIntersectsSkeleton (bounds) {
- return this.minX < bounds.maxX && this.maxX > bounds.minX && this.minY < bounds.maxY && this.maxY > bounds.minY;
- }
- /** Returns the first bounding box attachment that contains the point, or null. When doing many checks, it is usually more
- * efficient to only call this method if {@link #aabbContainsPoint(float, float)} returns true. */
- containsPoint (x, y) {
- let polygons = this.polygons;
- for (let i = 0, n = polygons.length; i < n; i++)
- if (this.containsPointPolygon(polygons[i], x, y)) return this.boundingBoxes[i];
- return null;
- }
- /** Returns true if the polygon contains the point. */
- containsPointPolygon (polygon, x, y) {
- let vertices = polygon;
- let nn = polygon.length;
- let prevIndex = nn - 2;
- let inside = false;
- for (let ii = 0; ii < nn; ii += 2) {
- let vertexY = vertices[ii + 1];
- let prevY = vertices[prevIndex + 1];
- if ((vertexY < y && prevY >= y) || (prevY < y && vertexY >= y)) {
- let vertexX = vertices[ii];
- if (vertexX + (y - vertexY) / (prevY - vertexY) * (vertices[prevIndex] - vertexX) < x) inside = !inside;
- }
- prevIndex = ii;
- }
- return inside;
- }
- /** Returns the first bounding box attachment that contains any part of the line segment, or null. When doing many checks, it
- * is usually more efficient to only call this method if {@link #aabbIntersectsSegment(float, float, float, float)} returns
- * true. */
- intersectsSegment (x1, y1, x2, y2) {
- let polygons = this.polygons;
- for (let i = 0, n = polygons.length; i < n; i++)
- if (this.intersectsSegmentPolygon(polygons[i], x1, y1, x2, y2)) return this.boundingBoxes[i];
- return null;
- }
- /** Returns true if the polygon contains any part of the line segment. */
- intersectsSegmentPolygon (polygon, x1, y1, x2, y2) {
- let vertices = polygon;
- let nn = polygon.length;
- let width12 = x1 - x2, height12 = y1 - y2;
- let det1 = x1 * y2 - y1 * x2;
- let x3 = vertices[nn - 2], y3 = vertices[nn - 1];
- for (let ii = 0; ii < nn; ii += 2) {
- let x4 = vertices[ii], y4 = vertices[ii + 1];
- let det2 = x3 * y4 - y3 * x4;
- let width34 = x3 - x4, height34 = y3 - y4;
- let det3 = width12 * height34 - height12 * width34;
- let x = (det1 * width34 - width12 * det2) / det3;
- if (((x >= x3 && x <= x4) || (x >= x4 && x <= x3)) && ((x >= x1 && x <= x2) || (x >= x2 && x <= x1))) {
- let y = (det1 * height34 - height12 * det2) / det3;
- if (((y >= y3 && y <= y4) || (y >= y4 && y <= y3)) && ((y >= y1 && y <= y2) || (y >= y2 && y <= y1))) return true;
- }
- x3 = x4;
- y3 = y4;
- }
- return false;
- }
- /** Returns the polygon for the specified bounding box, or null. */
- getPolygon (boundingBox) {
- if (boundingBox == null) throw new Error("boundingBox cannot be null.");
- let index = this.boundingBoxes.indexOf(boundingBox);
- return index == -1 ? null : this.polygons[index];
- }
- getWidth () {
- return this.maxX - this.minX;
- }
- getHeight () {
- return this.maxY - this.minY;
- }
- }
- /**
- * @public
- */
- class SkeletonData$1 {constructor() { SkeletonData$1.prototype.__init.call(this);SkeletonData$1.prototype.__init2.call(this);SkeletonData$1.prototype.__init3.call(this);SkeletonData$1.prototype.__init4.call(this);SkeletonData$1.prototype.__init5.call(this);SkeletonData$1.prototype.__init6.call(this);SkeletonData$1.prototype.__init7.call(this);SkeletonData$1.prototype.__init8.call(this);SkeletonData$1.prototype.__init9.call(this); }
-
- __init() {this.bones = new Array();} // Ordered parents first.
- __init2() {this.slots = new Array();} // Setup pose draw order.
- __init3() {this.skins = new Array();}
-
- __init4() {this.events = new Array();}
- __init5() {this.animations = new Array();}
- __init6() {this.ikConstraints = new Array();}
- __init7() {this.transformConstraints = new Array();}
- __init8() {this.pathConstraints = new Array();}
-
-
-
-
- // Nonessential
- __init9() {this.fps = 0;}
-
- findBone(boneName) {
- if (boneName == null) throw new Error("boneName cannot be null.");
- let bones = this.bones;
- for (let i = 0, n = bones.length; i < n; i++) {
- let bone = bones[i];
- if (bone.name == boneName) return bone;
- }
- return null;
- }
- findBoneIndex(boneName) {
- if (boneName == null) throw new Error("boneName cannot be null.");
- let bones = this.bones;
- for (let i = 0, n = bones.length; i < n; i++)
- if (bones[i].name == boneName) return i;
- return -1;
- }
- findSlot(slotName) {
- if (slotName == null) throw new Error("slotName cannot be null.");
- let slots = this.slots;
- for (let i = 0, n = slots.length; i < n; i++) {
- let slot = slots[i];
- if (slot.name == slotName) return slot;
- }
- return null;
- }
- findSlotIndex(slotName) {
- if (slotName == null) throw new Error("slotName cannot be null.");
- let slots = this.slots;
- for (let i = 0, n = slots.length; i < n; i++)
- if (slots[i].name == slotName) return i;
- return -1;
- }
- findSkin(skinName) {
- if (skinName == null) throw new Error("skinName cannot be null.");
- let skins = this.skins;
- for (let i = 0, n = skins.length; i < n; i++) {
- let skin = skins[i];
- if (skin.name == skinName) return skin;
- }
- return null;
- }
- findEvent(eventDataName) {
- if (eventDataName == null) throw new Error("eventDataName cannot be null.");
- let events = this.events;
- for (let i = 0, n = events.length; i < n; i++) {
- let event = events[i];
- if (event.name == eventDataName) return event;
- }
- return null;
- }
- findAnimation(animationName) {
- if (animationName == null) throw new Error("animationName cannot be null.");
- let animations = this.animations;
- for (let i = 0, n = animations.length; i < n; i++) {
- let animation = animations[i];
- if (animation.name == animationName) return animation;
- }
- return null;
- }
- findIkConstraint(constraintName) {
- if (constraintName == null) throw new Error("constraintName cannot be null.");
- let ikConstraints = this.ikConstraints;
- for (let i = 0, n = ikConstraints.length; i < n; i++) {
- let constraint = ikConstraints[i];
- if (constraint.name == constraintName) return constraint;
- }
- return null;
- }
- findTransformConstraint(constraintName) {
- if (constraintName == null) throw new Error("constraintName cannot be null.");
- let transformConstraints = this.transformConstraints;
- for (let i = 0, n = transformConstraints.length; i < n; i++) {
- let constraint = transformConstraints[i];
- if (constraint.name == constraintName) return constraint;
- }
- return null;
- }
- findPathConstraint(constraintName) {
- if (constraintName == null) throw new Error("constraintName cannot be null.");
- let pathConstraints = this.pathConstraints;
- for (let i = 0, n = pathConstraints.length; i < n; i++) {
- let constraint = pathConstraints[i];
- if (constraint.name == constraintName) return constraint;
- }
- return null;
- }
- findPathConstraintIndex(pathConstraintName) {
- if (pathConstraintName == null) throw new Error("pathConstraintName cannot be null.");
- let pathConstraints = this.pathConstraints;
- for (let i = 0, n = pathConstraints.length; i < n; i++)
- if (pathConstraints[i].name == pathConstraintName) return i;
- return -1;
- }
- }
- /**
- * @public
- */
- class SlotData$1 {
-
-
-
- __init() {this.color = new Color(1, 1, 1, 1);}
-
-
-
- constructor (index, name, boneData) {SlotData$1.prototype.__init.call(this);
- if (index < 0) throw new Error("index must be >= 0.");
- if (name == null) throw new Error("name cannot be null.");
- if (boneData == null) throw new Error("boneData cannot be null.");
- this.index = index;
- this.name = name;
- this.boneData = boneData;
- }
- }
- /**
- * @public
- */
- class TransformConstraintData$1 {
-
- __init() {this.order = 0;}
- __init2() {this.bones = new Array();}
-
- __init3() {this.rotateMix = 0;} __init4() {this.translateMix = 0;} __init5() {this.scaleMix = 0;} __init6() {this.shearMix = 0;}
- __init7() {this.offsetRotation = 0;} __init8() {this.offsetX = 0;} __init9() {this.offsetY = 0;} __init10() {this.offsetScaleX = 0;} __init11() {this.offsetScaleY = 0;} __init12() {this.offsetShearY = 0;}
- __init13() {this.relative = false;}
- __init14() {this.local = false;}
- constructor (name) {TransformConstraintData$1.prototype.__init.call(this);TransformConstraintData$1.prototype.__init2.call(this);TransformConstraintData$1.prototype.__init3.call(this);TransformConstraintData$1.prototype.__init4.call(this);TransformConstraintData$1.prototype.__init5.call(this);TransformConstraintData$1.prototype.__init6.call(this);TransformConstraintData$1.prototype.__init7.call(this);TransformConstraintData$1.prototype.__init8.call(this);TransformConstraintData$1.prototype.__init9.call(this);TransformConstraintData$1.prototype.__init10.call(this);TransformConstraintData$1.prototype.__init11.call(this);TransformConstraintData$1.prototype.__init12.call(this);TransformConstraintData$1.prototype.__init13.call(this);TransformConstraintData$1.prototype.__init14.call(this);
- if (name == null) throw new Error("name cannot be null.");
- this.name = name;
- }
- }
- /**
- * @public
- */
- class Skin$1 {
-
- __init() {this.attachments = new Array();}
- constructor(name) {Skin$1.prototype.__init.call(this);
- if (name == null) throw new Error("name cannot be null.");
- this.name = name;
- }
- addAttachment(slotIndex, name, attachment) {
- if (attachment == null) throw new Error("attachment cannot be null.");
- let attachments = this.attachments;
- if (slotIndex >= attachments.length) attachments.length = slotIndex + 1;
- if (!attachments[slotIndex]) attachments[slotIndex] = {};
- attachments[slotIndex][name] = attachment;
- }
- /** @return May be null. */
- getAttachment(slotIndex, name) {
- let dictionary = this.attachments[slotIndex];
- return dictionary ? dictionary[name] : null;
- }
- /** Attach each attachment in this skin if the corresponding attachment in the old skin is currently attached. */
- attachAll(skeleton, oldSkin) {
- let slotIndex = 0;
- for (let i = 0; i < skeleton.slots.length; i++) {
- let slot = skeleton.slots[i];
- let slotAttachment = slot.getAttachment();
- if (slotAttachment && slotIndex < oldSkin.attachments.length) {
- let dictionary = oldSkin.attachments[slotIndex];
- for (let key in dictionary) {
- let skinAttachment = dictionary[key];
- if (slotAttachment == skinAttachment) {
- let attachment = this.getAttachment(slotIndex, key);
- if (attachment != null) slot.setAttachment(attachment);
- break;
- }
- }
- }
- slotIndex++;
- }
- }
- }
- /**
- * @public
- */
- class SkeletonJson$1 {
-
- __init() {this.scale = 1;}
- __init2() {this.linkedMeshes = new Array();}
- constructor (attachmentLoader) {SkeletonJson$1.prototype.__init.call(this);SkeletonJson$1.prototype.__init2.call(this);
- this.attachmentLoader = attachmentLoader;
- }
- readSkeletonData (json) {
- let scale = this.scale;
- let skeletonData = new SkeletonData$1();
- let root = typeof(json) === "string" ? JSON.parse(json) : json;
- // Skeleton
- let skeletonMap = root.skeleton;
- if (skeletonMap != null) {
- skeletonData.hash = skeletonMap.hash;
- skeletonData.version = skeletonMap.spine;
- skeletonData.width = skeletonMap.width;
- skeletonData.height = skeletonMap.height;
- skeletonData.fps = skeletonMap.fps;
- skeletonData.imagesPath = skeletonMap.images;
- }
- // Bones
- if (root.bones) {
- for (let i = 0; i < root.bones.length; i++) {
- let boneMap = root.bones[i];
- let parent = null;
- let parentName = this.getValue(boneMap, "parent", null);
- if (parentName != null) {
- parent = skeletonData.findBone(parentName);
- if (parent == null) throw new Error("Parent bone not found: " + parentName);
- }
- let data = new BoneData$1(skeletonData.bones.length, boneMap.name, parent);
- data.length = this.getValue(boneMap, "length", 0) * scale;
- data.x = this.getValue(boneMap, "x", 0) * scale;
- data.y = this.getValue(boneMap, "y", 0) * scale;
- data.rotation = this.getValue(boneMap, "rotation", 0);
- data.scaleX = this.getValue(boneMap, "scaleX", 1);
- data.scaleY = this.getValue(boneMap, "scaleY", 1);
- data.shearX = this.getValue(boneMap, "shearX", 0);
- data.shearY = this.getValue(boneMap, "shearY", 0);
- data.transformMode = SkeletonJson$1.transformModeFromString(this.getValue(boneMap, "transform", "normal"));
- skeletonData.bones.push(data);
- }
- }
- // Slots.
- if (root.slots) {
- for (let i = 0; i < root.slots.length; i++) {
- let slotMap = root.slots[i];
- let slotName = slotMap.name;
- let boneName = slotMap.bone;
- let boneData = skeletonData.findBone(boneName);
- if (boneData == null) throw new Error("Slot bone not found: " + boneName);
- let data = new SlotData$1(skeletonData.slots.length, slotName, boneData);
- let color = this.getValue(slotMap, "color", null);
- if (color != null) data.color.setFromString(color);
- let dark = this.getValue(slotMap, "dark", null);
- if (dark != null) {
- data.darkColor = new Color(1, 1, 1, 1);
- data.darkColor.setFromString(dark);
- }
- data.attachmentName = this.getValue(slotMap, "attachment", null);
- data.blendMode = SkeletonJson$1.blendModeFromString(this.getValue(slotMap, "blend", "normal"));
- skeletonData.slots.push(data);
- }
- }
- // IK constraints
- if (root.ik) {
- for (let i = 0; i < root.ik.length; i++) {
- let constraintMap = root.ik[i];
- let data = new IkConstraintData$1(constraintMap.name);
- data.order = this.getValue(constraintMap, "order", 0);
- for (let j = 0; j < constraintMap.bones.length; j++) {
- let boneName = constraintMap.bones[j];
- let bone = skeletonData.findBone(boneName);
- if (bone == null) throw new Error("IK bone not found: " + boneName);
- data.bones.push(bone);
- }
- let targetName = constraintMap.target;
- data.target = skeletonData.findBone(targetName);
- if (data.target == null) throw new Error("IK target bone not found: " + targetName);
- data.bendDirection = this.getValue(constraintMap, "bendPositive", true) ? 1 : -1;
- data.mix = this.getValue(constraintMap, "mix", 1);
- skeletonData.ikConstraints.push(data);
- }
- }
- // Transform constraints.
- if (root.transform) {
- for (let i = 0; i < root.transform.length; i++) {
- let constraintMap = root.transform[i];
- let data = new TransformConstraintData$1(constraintMap.name);
- data.order = this.getValue(constraintMap, "order", 0);
- for (let j = 0; j < constraintMap.bones.length; j++) {
- let boneName = constraintMap.bones[j];
- let bone = skeletonData.findBone(boneName);
- if (bone == null) throw new Error("Transform constraint bone not found: " + boneName);
- data.bones.push(bone);
- }
- let targetName = constraintMap.target;
- data.target = skeletonData.findBone(targetName);
- if (data.target == null) throw new Error("Transform constraint target bone not found: " + targetName);
- data.local = this.getValue(constraintMap, "local", false);
- data.relative = this.getValue(constraintMap, "relative", false);
- data.offsetRotation = this.getValue(constraintMap, "rotation", 0);
- data.offsetX = this.getValue(constraintMap, "x", 0) * scale;
- data.offsetY = this.getValue(constraintMap, "y", 0) * scale;
- data.offsetScaleX = this.getValue(constraintMap, "scaleX", 0);
- data.offsetScaleY = this.getValue(constraintMap, "scaleY", 0);
- data.offsetShearY = this.getValue(constraintMap, "shearY", 0);
- data.rotateMix = this.getValue(constraintMap, "rotateMix", 1);
- data.translateMix = this.getValue(constraintMap, "translateMix", 1);
- data.scaleMix = this.getValue(constraintMap, "scaleMix", 1);
- data.shearMix = this.getValue(constraintMap, "shearMix", 1);
- skeletonData.transformConstraints.push(data);
- }
- }
- // Path constraints.
- if (root.path) {
- for (let i = 0; i < root.path.length; i++) {
- let constraintMap = root.path[i];
- let data = new PathConstraintData$1(constraintMap.name);
- data.order = this.getValue(constraintMap, "order", 0);
- for (let j = 0; j < constraintMap.bones.length; j++) {
- let boneName = constraintMap.bones[j];
- let bone = skeletonData.findBone(boneName);
- if (bone == null) throw new Error("Transform constraint bone not found: " + boneName);
- data.bones.push(bone);
- }
- let targetName = constraintMap.target;
- data.target = skeletonData.findSlot(targetName);
- if (data.target == null) throw new Error("Path target slot not found: " + targetName);
- data.positionMode = SkeletonJson$1.positionModeFromString(this.getValue(constraintMap, "positionMode", "percent"));
- data.spacingMode = SkeletonJson$1.spacingModeFromString(this.getValue(constraintMap, "spacingMode", "length"));
- data.rotateMode = SkeletonJson$1.rotateModeFromString(this.getValue(constraintMap, "rotateMode", "tangent"));
- data.offsetRotation = this.getValue(constraintMap, "rotation", 0);
- data.position = this.getValue(constraintMap, "position", 0);
- if (data.positionMode == PositionMode$1.Fixed) data.position *= scale;
- data.spacing = this.getValue(constraintMap, "spacing", 0);
- if (data.spacingMode == SpacingMode$1.Length || data.spacingMode == SpacingMode$1.Fixed) data.spacing *= scale;
- data.rotateMix = this.getValue(constraintMap, "rotateMix", 1);
- data.translateMix = this.getValue(constraintMap, "translateMix", 1);
- skeletonData.pathConstraints.push(data);
- }
- }
- // Skins.
- if (root.skins) {
- for (let skinName in root.skins) {
- let skinMap = root.skins[skinName];
- let skin = new Skin$1(skinName);
- for (let slotName in skinMap) {
- let slotIndex = skeletonData.findSlotIndex(slotName);
- if (slotIndex == -1) throw new Error("Slot not found: " + slotName);
- let slotMap = skinMap[slotName];
- for (let entryName in slotMap) {
- let attachment = this.readAttachment(slotMap[entryName], skin, slotIndex, entryName, skeletonData);
- if (attachment != null) skin.addAttachment(slotIndex, entryName, attachment);
- }
- }
- skeletonData.skins.push(skin);
- if (skin.name == "default") skeletonData.defaultSkin = skin;
- }
- }
- // Linked meshes.
- for (let i = 0, n = this.linkedMeshes.length; i < n; i++) {
- let linkedMesh = this.linkedMeshes[i];
- let skin = linkedMesh.skin == null ? skeletonData.defaultSkin : skeletonData.findSkin(linkedMesh.skin);
- if (skin == null) throw new Error("Skin not found: " + linkedMesh.skin);
- let parent = skin.getAttachment(linkedMesh.slotIndex, linkedMesh.parent);
- if (parent == null) throw new Error("Parent mesh not found: " + linkedMesh.parent);
- linkedMesh.mesh.setParentMesh( parent);
- //linkedMesh.mesh.updateUVs();
- }
- this.linkedMeshes.length = 0;
- // Events.
- if (root.events) {
- for (let eventName in root.events) {
- let eventMap = root.events[eventName];
- let data = new EventData$1(eventName);
- data.intValue = this.getValue(eventMap, "int", 0);
- data.floatValue = this.getValue(eventMap, "float", 0);
- data.stringValue = this.getValue(eventMap, "string", "");
- data.audioPath = this.getValue(eventMap, "audio", null);
- if (data.audioPath != null) {
- data.volume = this.getValue(eventMap, "volume", 1);
- data.balance = this.getValue(eventMap, "balance", 0);
- }
- skeletonData.events.push(data);
- }
- }
- // Animations.
- if (root.animations) {
- for (let animationName in root.animations) {
- let animationMap = root.animations[animationName];
- this.readAnimation(animationMap, animationName, skeletonData);
- }
- }
- return skeletonData;
- }
- readAttachment (map, skin, slotIndex, name, skeletonData) {
- let scale = this.scale;
- name = this.getValue(map, "name", name);
- let type = this.getValue(map, "type", "region");
- switch (type) {
- case "region": {
- let path = this.getValue(map, "path", name);
- let region = this.attachmentLoader.newRegionAttachment(skin, name, path);
- if (region == null) return null;
- region.path = path;
- region.x = this.getValue(map, "x", 0) * scale;
- region.y = this.getValue(map, "y", 0) * scale;
- region.scaleX = this.getValue(map, "scaleX", 1);
- region.scaleY = this.getValue(map, "scaleY", 1);
- region.rotation = this.getValue(map, "rotation", 0);
- region.width = map.width * scale;
- region.height = map.height * scale;
- let color = this.getValue(map, "color", null);
- if (color != null) region.color.setFromString(color);
- //region.updateOffset();
- return region;
- }
- case "boundingbox": {
- let box = this.attachmentLoader.newBoundingBoxAttachment(skin, name);
- if (box == null) return null;
- this.readVertices(map, box, map.vertexCount << 1);
- let color = this.getValue(map, "color", null);
- if (color != null) box.color.setFromString(color);
- return box;
- }
- case "mesh":
- case "linkedmesh": {
- let path = this.getValue(map, "path", name);
- let mesh = this.attachmentLoader.newMeshAttachment(skin, name, path);
- if (mesh == null) return null;
- mesh.path = path;
- let color = this.getValue(map, "color", null);
- if (color != null) mesh.color.setFromString(color);
- let parent = this.getValue(map, "parent", null);
- if (parent != null) {
- mesh.inheritDeform = this.getValue(map, "deform", true);
- this.linkedMeshes.push(new LinkedMesh$2(mesh, this.getValue(map, "skin", null), slotIndex, parent));
- return mesh;
- }
- let uvs = map.uvs;
- this.readVertices(map, mesh, uvs.length);
- mesh.triangles = map.triangles;
- mesh.regionUVs = new Float32Array(uvs);
- //mesh.updateUVs();
- mesh.hullLength = this.getValue(map, "hull", 0) * 2;
- return mesh;
- }
- case "path": {
- let path = this.attachmentLoader.newPathAttachment(skin, name);
- if (path == null) return null;
- path.closed = this.getValue(map, "closed", false);
- path.constantSpeed = this.getValue(map, "constantSpeed", true);
- let vertexCount = map.vertexCount;
- this.readVertices(map, path, vertexCount << 1);
- let lengths = Utils.newArray(vertexCount / 3, 0);
- for (let i = 0; i < map.lengths.length; i++)
- lengths[i] = map.lengths[i] * scale;
- path.lengths = lengths;
- let color = this.getValue(map, "color", null);
- if (color != null) path.color.setFromString(color);
- return path;
- }
- case "point": {
- let point = this.attachmentLoader.newPointAttachment(skin, name);
- if (point == null) return null;
- point.x = this.getValue(map, "x", 0) * scale;
- point.y = this.getValue(map, "y", 0) * scale;
- point.rotation = this.getValue(map, "rotation", 0);
- let color = this.getValue(map, "color", null);
- if (color != null) point.color.setFromString(color);
- return point;
- }
- case "clipping": {
- let clip = this.attachmentLoader.newClippingAttachment(skin, name);
- if (clip == null) return null;
- let end = this.getValue(map, "end", null);
- if (end != null) {
- let slot = skeletonData.findSlot(end);
- if (slot == null) throw new Error("Clipping end slot not found: " + end);
- clip.endSlot = slot;
- }
- let vertexCount = map.vertexCount;
- this.readVertices(map, clip, vertexCount << 1);
- let color = this.getValue(map, "color", null);
- if (color != null) clip.color.setFromString(color);
- return clip;
- }
- }
- return null;
- }
- readVertices (map, attachment, verticesLength) {
- let scale = this.scale;
- attachment.worldVerticesLength = verticesLength;
- let vertices = map.vertices;
- if (verticesLength == vertices.length) {
- let scaledVertices = Utils.toFloatArray(vertices);
- if (scale != 1) {
- for (let i = 0, n = vertices.length; i < n; i++)
- scaledVertices[i] *= scale;
- }
- attachment.vertices = scaledVertices;
- return;
- }
- let weights = new Array();
- let bones = new Array();
- for (let i = 0, n = vertices.length; i < n;) {
- let boneCount = vertices[i++];
- bones.push(boneCount);
- for (let nn = i + boneCount * 4; i < nn; i += 4) {
- bones.push(vertices[i]);
- weights.push(vertices[i + 1] * scale);
- weights.push(vertices[i + 2] * scale);
- weights.push(vertices[i + 3]);
- }
- }
- attachment.bones = bones;
- attachment.vertices = Utils.toFloatArray(weights);
- }
- readAnimation (map, name, skeletonData) {
- let scale = this.scale;
- let timelines = new Array();
- let duration = 0;
- // Slot timelines.
- if (map.slots) {
- for (let slotName in map.slots) {
- let slotMap = map.slots[slotName];
- let slotIndex = skeletonData.findSlotIndex(slotName);
- if (slotIndex == -1) throw new Error("Slot not found: " + slotName);
- for (let timelineName in slotMap) {
- let timelineMap = slotMap[timelineName];
- if (timelineName == "attachment") {
- let timeline = new AttachmentTimeline$1(timelineMap.length);
- timeline.slotIndex = slotIndex;
- let frameIndex = 0;
- for (let i = 0; i < timelineMap.length; i++) {
- let valueMap = timelineMap[i];
- timeline.setFrame(frameIndex++, valueMap.time, valueMap.name);
- }
- timelines.push(timeline);
- duration = Math.max(duration, timeline.frames[timeline.getFrameCount() - 1]);
- } else if (timelineName == "color") {
- let timeline = new ColorTimeline$1(timelineMap.length);
- timeline.slotIndex = slotIndex;
- let frameIndex = 0;
- for (let i = 0; i < timelineMap.length; i++) {
- let valueMap = timelineMap[i];
- let color = new Color();
- color.setFromString(valueMap.color || "ffffffff");
- timeline.setFrame(frameIndex, valueMap.time, color.r, color.g, color.b, color.a);
- this.readCurve(valueMap, timeline, frameIndex);
- frameIndex++;
- }
- timelines.push(timeline);
- duration = Math.max(duration, timeline.frames[(timeline.getFrameCount() - 1) * ColorTimeline$1.ENTRIES]);
- } else if (timelineName == "twoColor") {
- let timeline = new TwoColorTimeline$1(timelineMap.length);
- timeline.slotIndex = slotIndex;
- let frameIndex = 0;
- for (let i = 0; i < timelineMap.length; i++) {
- let valueMap = timelineMap[i];
- let light = new Color();
- let dark = new Color();
- light.setFromString(valueMap.light);
- dark.setFromString(valueMap.dark);
- timeline.setFrame(frameIndex, valueMap.time, light.r, light.g, light.b, light.a, dark.r, dark.g, dark.b);
- this.readCurve(valueMap, timeline, frameIndex);
- frameIndex++;
- }
- timelines.push(timeline);
- duration = Math.max(duration, timeline.frames[(timeline.getFrameCount() - 1) * TwoColorTimeline$1.ENTRIES]);
- } else
- throw new Error("Invalid timeline type for a slot: " + timelineName + " (" + slotName + ")");
- }
- }
- }
- // Bone timelines.
- if (map.bones) {
- for (let boneName in map.bones) {
- let boneMap = map.bones[boneName];
- let boneIndex = skeletonData.findBoneIndex(boneName);
- if (boneIndex == -1) throw new Error("Bone not found: " + boneName);
- for (let timelineName in boneMap) {
- let timelineMap = boneMap[timelineName];
- if (timelineName === "rotate") {
- let timeline = new RotateTimeline$1(timelineMap.length);
- timeline.boneIndex = boneIndex;
- let frameIndex = 0;
- for (let i = 0; i < timelineMap.length; i++) {
- let valueMap = timelineMap[i];
- timeline.setFrame(frameIndex, valueMap.time, valueMap.angle);
- this.readCurve(valueMap, timeline, frameIndex);
- frameIndex++;
- }
- timelines.push(timeline);
- duration = Math.max(duration, timeline.frames[(timeline.getFrameCount() - 1) * RotateTimeline$1.ENTRIES]);
- } else if (timelineName === "translate" || timelineName === "scale" || timelineName === "shear") {
- let timeline = null;
- let timelineScale = 1;
- if (timelineName === "scale")
- timeline = new ScaleTimeline$1(timelineMap.length);
- else if (timelineName === "shear")
- timeline = new ShearTimeline$1(timelineMap.length);
- else {
- timeline = new TranslateTimeline$1(timelineMap.length);
- timelineScale = scale;
- }
- timeline.boneIndex = boneIndex;
- let frameIndex = 0;
- for (let i = 0; i < timelineMap.length; i++) {
- let valueMap = timelineMap[i];
- let x = this.getValue(valueMap, "x", 0), y = this.getValue(valueMap, "y", 0);
- timeline.setFrame(frameIndex, valueMap.time, x * timelineScale, y * timelineScale);
- this.readCurve(valueMap, timeline, frameIndex);
- frameIndex++;
- }
- timelines.push(timeline);
- duration = Math.max(duration, timeline.frames[(timeline.getFrameCount() - 1) * TranslateTimeline$1.ENTRIES]);
- } else
- throw new Error("Invalid timeline type for a bone: " + timelineName + " (" + boneName + ")");
- }
- }
- }
- // IK constraint timelines.
- if (map.ik) {
- for (let constraintName in map.ik) {
- let constraintMap = map.ik[constraintName];
- let constraint = skeletonData.findIkConstraint(constraintName);
- let timeline = new IkConstraintTimeline$1(constraintMap.length);
- timeline.ikConstraintIndex = skeletonData.ikConstraints.indexOf(constraint);
- let frameIndex = 0;
- for (let i = 0; i < constraintMap.length; i++) {
- let valueMap = constraintMap[i];
- timeline.setFrame(frameIndex, valueMap.time, this.getValue(valueMap, "mix", 1),
- this.getValue(valueMap, "bendPositive", true) ? 1 : -1, this.getValue(valueMap, "compress", false), this.getValue(valueMap, "stretch", false));
- this.readCurve(valueMap, timeline, frameIndex);
- frameIndex++;
- }
- timelines.push(timeline);
- duration = Math.max(duration, timeline.frames[(timeline.getFrameCount() - 1) * IkConstraintTimeline$1.ENTRIES]);
- }
- }
- // Transform constraint timelines.
- if (map.transform) {
- for (let constraintName in map.transform) {
- let constraintMap = map.transform[constraintName];
- let constraint = skeletonData.findTransformConstraint(constraintName);
- let timeline = new TransformConstraintTimeline$1(constraintMap.length);
- timeline.transformConstraintIndex = skeletonData.transformConstraints.indexOf(constraint);
- let frameIndex = 0;
- for (let i = 0; i < constraintMap.length; i++) {
- let valueMap = constraintMap[i];
- timeline.setFrame(frameIndex, valueMap.time, this.getValue(valueMap, "rotateMix", 1),
- this.getValue(valueMap, "translateMix", 1), this.getValue(valueMap, "scaleMix", 1), this.getValue(valueMap, "shearMix", 1));
- this.readCurve(valueMap, timeline, frameIndex);
- frameIndex++;
- }
- timelines.push(timeline);
- duration = Math.max(duration,
- timeline.frames[(timeline.getFrameCount() - 1) * TransformConstraintTimeline$1.ENTRIES]);
- }
- }
- // Path constraint timelines.
- if (map.paths) {
- for (let constraintName in map.paths) {
- let constraintMap = map.paths[constraintName];
- let index = skeletonData.findPathConstraintIndex(constraintName);
- if (index == -1) throw new Error("Path constraint not found: " + constraintName);
- let data = skeletonData.pathConstraints[index];
- for (let timelineName in constraintMap) {
- let timelineMap = constraintMap[timelineName];
- if (timelineName === "position" || timelineName === "spacing") {
- let timeline = null;
- let timelineScale = 1;
- if (timelineName === "spacing") {
- timeline = new PathConstraintSpacingTimeline$1(timelineMap.length);
- if (data.spacingMode == SpacingMode$1.Length || data.spacingMode == SpacingMode$1.Fixed) timelineScale = scale;
- } else {
- timeline = new PathConstraintPositionTimeline$1(timelineMap.length);
- if (data.positionMode == PositionMode$1.Fixed) timelineScale = scale;
- }
- timeline.pathConstraintIndex = index;
- let frameIndex = 0;
- for (let i = 0; i < timelineMap.length; i++) {
- let valueMap = timelineMap[i];
- timeline.setFrame(frameIndex, valueMap.time, this.getValue(valueMap, timelineName, 0) * timelineScale);
- this.readCurve(valueMap, timeline, frameIndex);
- frameIndex++;
- }
- timelines.push(timeline);
- duration = Math.max(duration,
- timeline.frames[(timeline.getFrameCount() - 1) * PathConstraintPositionTimeline$1.ENTRIES]);
- } else if (timelineName === "mix") {
- let timeline = new PathConstraintMixTimeline$1(timelineMap.length);
- timeline.pathConstraintIndex = index;
- let frameIndex = 0;
- for (let i = 0; i < timelineMap.length; i++) {
- let valueMap = timelineMap[i];
- timeline.setFrame(frameIndex, valueMap.time, this.getValue(valueMap, "rotateMix", 1),
- this.getValue(valueMap, "translateMix", 1));
- this.readCurve(valueMap, timeline, frameIndex);
- frameIndex++;
- }
- timelines.push(timeline);
- duration = Math.max(duration,
- timeline.frames[(timeline.getFrameCount() - 1) * PathConstraintMixTimeline$1.ENTRIES]);
- }
- }
- }
- }
- // Deform timelines.
- if (map.deform) {
- for (let deformName in map.deform) {
- let deformMap = map.deform[deformName];
- let skin = skeletonData.findSkin(deformName);
- if (skin == null) {
- if (settings.FAIL_ON_NON_EXISTING_SKIN) {
- throw new Error("Skin not found: " + deformName);
- } else {
- continue;
- }
- } for (let slotName in deformMap) {
- let slotMap = deformMap[slotName];
- let slotIndex = skeletonData.findSlotIndex(slotName);
- if (slotIndex == -1) throw new Error("Slot not found: " + slotMap.name);
- for (let timelineName in slotMap) {
- let timelineMap = slotMap[timelineName];
- let attachment = skin.getAttachment(slotIndex, timelineName);
- if (attachment == null) throw new Error("Deform attachment not found: " + timelineMap.name);
- let weighted = attachment.bones != null;
- let vertices = attachment.vertices;
- let deformLength = weighted ? vertices.length / 3 * 2 : vertices.length;
- let timeline = new DeformTimeline$1(timelineMap.length);
- timeline.slotIndex = slotIndex;
- timeline.attachment = attachment;
- let frameIndex = 0;
- for (let j = 0; j < timelineMap.length; j++) {
- let valueMap = timelineMap[j];
- let deform;
- let verticesValue = this.getValue(valueMap, "vertices", null);
- if (verticesValue == null)
- deform = weighted ? Utils.newFloatArray(deformLength) : vertices;
- else {
- deform = Utils.newFloatArray(deformLength);
- let start = this.getValue(valueMap, "offset", 0);
- Utils.arrayCopy(verticesValue, 0, deform, start, verticesValue.length);
- if (scale != 1) {
- for (let i = start, n = i + verticesValue.length; i < n; i++)
- deform[i] *= scale;
- }
- if (!weighted) {
- for (let i = 0; i < deformLength; i++)
- deform[i] += vertices[i];
- }
- }
- timeline.setFrame(frameIndex, valueMap.time, deform);
- this.readCurve(valueMap, timeline, frameIndex);
- frameIndex++;
- }
- timelines.push(timeline);
- duration = Math.max(duration, timeline.frames[timeline.getFrameCount() - 1]);
- }
- }
- }
- }
- // Draw order timeline.
- let drawOrderNode = map.drawOrder;
- if (drawOrderNode == null) drawOrderNode = map.draworder;
- if (drawOrderNode != null) {
- let timeline = new DrawOrderTimeline$1(drawOrderNode.length);
- let slotCount = skeletonData.slots.length;
- let frameIndex = 0;
- for (let j = 0; j < drawOrderNode.length; j++) {
- let drawOrderMap = drawOrderNode[j];
- let drawOrder = null;
- let offsets = this.getValue(drawOrderMap, "offsets", null);
- if (offsets != null) {
- drawOrder = Utils.newArray(slotCount, -1);
- let unchanged = Utils.newArray(slotCount - offsets.length, 0);
- let originalIndex = 0, unchangedIndex = 0;
- for (let i = 0; i < offsets.length; i++) {
- let offsetMap = offsets[i];
- let slotIndex = skeletonData.findSlotIndex(offsetMap.slot);
- if (slotIndex == -1) throw new Error("Slot not found: " + offsetMap.slot);
- // Collect unchanged items.
- while (originalIndex != slotIndex)
- unchanged[unchangedIndex++] = originalIndex++;
- // Set changed items.
- drawOrder[originalIndex + offsetMap.offset] = originalIndex++;
- }
- // Collect remaining unchanged items.
- while (originalIndex < slotCount)
- unchanged[unchangedIndex++] = originalIndex++;
- // Fill in unchanged items.
- for (let i = slotCount - 1; i >= 0; i--)
- if (drawOrder[i] == -1) drawOrder[i] = unchanged[--unchangedIndex];
- }
- timeline.setFrame(frameIndex++, drawOrderMap.time, drawOrder);
- }
- timelines.push(timeline);
- duration = Math.max(duration, timeline.frames[timeline.getFrameCount() - 1]);
- }
- // Event timeline.
- if (map.events) {
- let timeline = new EventTimeline$1(map.events.length);
- let frameIndex = 0;
- for (let i = 0; i < map.events.length; i++) {
- let eventMap = map.events[i];
- let eventData = skeletonData.findEvent(eventMap.name);
- if (eventData == null) throw new Error("Event not found: " + eventMap.name);
- let event = new Event$1(Utils.toSinglePrecision(eventMap.time), eventData);
- event.intValue = this.getValue(eventMap, "int", eventData.intValue);
- event.floatValue = this.getValue(eventMap, "float", eventData.floatValue);
- event.stringValue = this.getValue(eventMap, "string", eventData.stringValue);
- if (event.data.audioPath != null) {
- event.volume = this.getValue(eventMap, "volume", 1);
- event.balance = this.getValue(eventMap, "balance", 0);
- }
- timeline.setFrame(frameIndex++, event);
- }
- timelines.push(timeline);
- duration = Math.max(duration, timeline.frames[timeline.getFrameCount() - 1]);
- }
- if (isNaN(duration)) {
- throw new Error("Error while parsing animation, duration is NaN");
- }
- skeletonData.animations.push(new Animation$1(name, timelines, duration));
- }
- readCurve (map, timeline, frameIndex) {
- if (!map.curve) return;
- if (map.curve === "stepped")
- timeline.setStepped(frameIndex);
- else if (Object.prototype.toString.call(map.curve) === '[object Array]') {
- let curve = map.curve;
- timeline.setCurve(frameIndex, curve[0], curve[1], curve[2], curve[3]);
- }
- }
- getValue (map, prop, defaultValue) {
- return map[prop] !== undefined ? map[prop] : defaultValue;
- }
- static blendModeFromString (str) {
- str = str.toLowerCase();
- if (str == "normal") return constants.BLEND_MODES.NORMAL;
- if (str == "additive") return constants.BLEND_MODES.ADD;
- if (str == "multiply") return constants.BLEND_MODES.MULTIPLY;
- if (str == "screen") return constants.BLEND_MODES.SCREEN;
- throw new Error(`Unknown blend mode: ${str}`);
- }
- static positionModeFromString (str) {
- str = str.toLowerCase();
- if (str == "fixed") return PositionMode$1.Fixed;
- if (str == "percent") return PositionMode$1.Percent;
- throw new Error(`Unknown position mode: ${str}`);
- }
- static spacingModeFromString (str) {
- str = str.toLowerCase();
- if (str == "length") return SpacingMode$1.Length;
- if (str == "fixed") return SpacingMode$1.Fixed;
- if (str == "percent") return SpacingMode$1.Percent;
- throw new Error(`Unknown position mode: ${str}`);
- }
- static rotateModeFromString (str) {
- str = str.toLowerCase();
- if (str == "tangent") return RotateMode$1.Tangent;
- if (str == "chain") return RotateMode$1.Chain;
- if (str == "chainscale") return RotateMode$1.ChainScale;
- throw new Error(`Unknown rotate mode: ${str}`);
- }
- static transformModeFromString(str) {
- str = str.toLowerCase();
- if (str == "normal") return TransformMode$1.Normal;
- if (str == "onlytranslation") return TransformMode$1.OnlyTranslation;
- if (str == "norotationorreflection") return TransformMode$1.NoRotationOrReflection;
- if (str == "noscale") return TransformMode$1.NoScale;
- if (str == "noscaleorreflection") return TransformMode$1.NoScaleOrReflection;
- throw new Error(`Unknown transform mode: ${str}`);
- }
- }
- class LinkedMesh$2 {
-
-
-
- constructor (mesh, skin, slotIndex, parent) {
- this.mesh = mesh;
- this.skin = skin;
- this.slotIndex = slotIndex;
- this.parent = parent;
- }
- }
- /**
- * @public
- */
- class Spine$1 extends SpineBase {
- createSkeleton(spineData) {
- this.skeleton = new Skeleton$1(spineData);
- this.skeleton.updateWorldTransform();
- this.stateData = new AnimationStateData$1(spineData);
- this.state = new AnimationState$1(this.stateData);
- }
- }
- var spine37 = /*#__PURE__*/Object.freeze({
- __proto__: null,
- Animation: Animation$1,
- AnimationState: AnimationState$1,
- AnimationStateAdapter2: AnimationStateAdapter2,
- AnimationStateData: AnimationStateData$1,
- AtlasAttachmentLoader: AtlasAttachmentLoader$1,
- Attachment: Attachment$1,
- AttachmentTimeline: AttachmentTimeline$1,
- Bone: Bone$1,
- BoneData: BoneData$1,
- BoundingBoxAttachment: BoundingBoxAttachment$1,
- ClippingAttachment: ClippingAttachment$1,
- ColorTimeline: ColorTimeline$1,
- CurveTimeline: CurveTimeline$1,
- DeformTimeline: DeformTimeline$1,
- DrawOrderTimeline: DrawOrderTimeline$1,
- Event: Event$1,
- EventData: EventData$1,
- EventQueue: EventQueue$1,
- EventTimeline: EventTimeline$1,
- get EventType () { return EventType$1; },
- IkConstraint: IkConstraint$1,
- IkConstraintData: IkConstraintData$1,
- IkConstraintTimeline: IkConstraintTimeline$1,
- JitterEffect: JitterEffect$1,
- MeshAttachment: MeshAttachment$1,
- get MixBlend () { return MixBlend$1; },
- get MixDirection () { return MixDirection$1; },
- PathAttachment: PathAttachment$1,
- PathConstraint: PathConstraint$1,
- PathConstraintData: PathConstraintData$1,
- PathConstraintMixTimeline: PathConstraintMixTimeline$1,
- PathConstraintPositionTimeline: PathConstraintPositionTimeline$1,
- PathConstraintSpacingTimeline: PathConstraintSpacingTimeline$1,
- PointAttachment: PointAttachment$1,
- get PositionMode () { return PositionMode$1; },
- RegionAttachment: RegionAttachment$1,
- get RotateMode () { return RotateMode$1; },
- RotateTimeline: RotateTimeline$1,
- ScaleTimeline: ScaleTimeline$1,
- ShearTimeline: ShearTimeline$1,
- Skeleton: Skeleton$1,
- SkeletonBounds: SkeletonBounds$1,
- SkeletonData: SkeletonData$1,
- SkeletonJson: SkeletonJson$1,
- Skin: Skin$1,
- Slot: Slot$1,
- SlotData: SlotData$1,
- get SpacingMode () { return SpacingMode$1; },
- Spine: Spine$1,
- SwirlEffect: SwirlEffect$1,
- get TimelineType () { return TimelineType$1; },
- TrackEntry: TrackEntry$1,
- TransformConstraint: TransformConstraint$1,
- TransformConstraintData: TransformConstraintData$1,
- TransformConstraintTimeline: TransformConstraintTimeline$1,
- get TransformMode () { return TransformMode$1; },
- TranslateTimeline: TranslateTimeline$1,
- TwoColorTimeline: TwoColorTimeline$1,
- VertexAttachment: VertexAttachment$1
- });
- /* eslint-disable */
- /**
- * @public
- */
- class Attachment$2 {
-
-
- constructor (name) {
- if (name == null) throw new Error("name cannot be null.");
- this.name = name;
- }
-
- }
- /**
- * Base class for an attachment with vertices that are transformed by one or more bones and can be deformed by a slot's
- * {@link Slot#deform}.
- * @public
- */
- class VertexAttachment$2 extends Attachment$2 {
- static __initStatic() {this.nextID = 0;}
- /** The unique ID for this attachment. */
- __init() {this.id = VertexAttachment$2.nextID++;}
- /** The bones which affect the {@link #getVertices()}. The array entries are, for each vertex, the number of bones affecting
- * the vertex followed by that many bone indices, which is the index of the bone in {@link Skeleton#bones}. Will be null
- * if this attachment has no weights. */
-
- /** The vertex positions in the bone's coordinate system. For a non-weighted attachment, the values are `x,y`
- * entries for each vertex. For a weighted attachment, the values are `x,y,weight` entries for each bone affecting
- * each vertex. */
-
- /** The maximum number of world vertex values that can be output by
- * {@link #computeWorldVertices()} using the `count` parameter. */
- __init2() {this.worldVerticesLength = 0;}
- /** Deform keys for the deform attachment are also applied to this attachment. May be null if no deform keys should be applied. */
- __init3() {this.deformAttachment = this;}
- constructor (name) {
- super(name);VertexAttachment$2.prototype.__init.call(this);VertexAttachment$2.prototype.__init2.call(this);VertexAttachment$2.prototype.__init3.call(this); }
- computeWorldVerticesOld(slot, worldVertices) {
- this.computeWorldVertices(slot, 0, this.worldVerticesLength, worldVertices, 0, 2);
- }
- /** Transforms the attachment's local {@link #vertices} to world coordinates. If the slot's {@link Slot#deform} is
- * not empty, it is used to deform the vertices.
- *
- * See [World transforms](http://esotericsoftware.com/spine-runtime-skeletons#World-transforms) in the Spine
- * Runtimes Guide.
- * @param start The index of the first {@link #vertices} value to transform. Each vertex has 2 values, x and y.
- * @param count The number of world vertex values to output. Must be <= {@link #worldVerticesLength} - `start`.
- * @param worldVertices The output world vertices. Must have a length >= `offset` + `count` *
- * `stride` / 2.
- * @param offset The `worldVertices` index to begin writing values.
- * @param stride The number of `worldVertices` entries between the value pairs written. */
- computeWorldVertices (slot, start, count, worldVertices, offset, stride) {
- count = offset + (count >> 1) * stride;
- let skeleton = slot.bone.skeleton;
- let deformArray = slot.deform;
- let vertices = this.vertices;
- let bones = this.bones;
- if (bones == null) {
- if (deformArray.length > 0) vertices = deformArray;
- let mat = slot.bone.matrix;
- let x = mat.tx;
- let y = mat.ty;
- let a = mat.a, b = mat.c, c = mat.b, d = mat.d;
- for (let v = start, w = offset; w < count; v += 2, w += stride) {
- let vx = vertices[v], vy = vertices[v + 1];
- worldVertices[w] = vx * a + vy * b + x;
- worldVertices[w + 1] = vx * c + vy * d + y;
- }
- return;
- }
- let v = 0, skip = 0;
- for (let i = 0; i < start; i += 2) {
- let n = bones[v];
- v += n + 1;
- skip += n;
- }
- let skeletonBones = skeleton.bones;
- if (deformArray.length == 0) {
- for (let w = offset, b = skip * 3; w < count; w += stride) {
- let wx = 0, wy = 0;
- let n = bones[v++];
- n += v;
- for (; v < n; v++, b += 3) {
- let mat = skeletonBones[bones[v]].matrix;
- let vx = vertices[b], vy = vertices[b + 1], weight = vertices[b + 2];
- wx += (vx * mat.a + vy * mat.c + mat.tx) * weight;
- wy += (vx * mat.b + vy * mat.d + mat.ty) * weight;
- }
- worldVertices[w] = wx;
- worldVertices[w + 1] = wy;
- }
- } else {
- let deform = deformArray;
- for (let w = offset, b = skip * 3, f = skip << 1; w < count; w += stride) {
- let wx = 0, wy = 0;
- let n = bones[v++];
- n += v;
- for (; v < n; v++, b += 3, f += 2) {
- let mat = skeletonBones[bones[v]].matrix;
- let vx = vertices[b] + deform[f], vy = vertices[b + 1] + deform[f + 1], weight = vertices[b + 2];
- wx += (vx * mat.a + vy * mat.c + mat.tx) * weight;
- wy += (vx * mat.b + vy * mat.d + mat.ty) * weight;
- }
- worldVertices[w] = wx;
- worldVertices[w + 1] = wy;
- }
- }
- }
- /** Does not copy id (generated) or name (set on construction). **/
- copyTo (attachment) {
- if (this.bones != null) {
- attachment.bones = new Array(this.bones.length);
- Utils.arrayCopy(this.bones, 0, attachment.bones, 0, this.bones.length);
- } else
- attachment.bones = null;
- if (this.vertices != null) {
- attachment.vertices = Utils.newFloatArray(this.vertices.length);
- Utils.arrayCopy(this.vertices, 0, attachment.vertices, 0, this.vertices.length);
- } else
- attachment.vertices = null;
- attachment.worldVerticesLength = this.worldVerticesLength;
- attachment.deformAttachment = this.deformAttachment;
- }
- } VertexAttachment$2.__initStatic();
- /**
- * @public
- */
- class BoundingBoxAttachment$2 extends VertexAttachment$2 {
- __init() {this.type = exports.AttachmentType.BoundingBox;}
- __init2() {this.color = new Color(1, 1, 1, 1);}
- constructor (name) {
- super(name);BoundingBoxAttachment$2.prototype.__init.call(this);BoundingBoxAttachment$2.prototype.__init2.call(this); }
- copy () {
- let copy = new BoundingBoxAttachment$2(this.name);
- this.copyTo(copy);
- copy.color.setFromColor(this.color);
- return copy;
- }
- }
- /**
- * @public
- */
- class ClippingAttachment$2 extends VertexAttachment$2 {
- __init() {this.type = exports.AttachmentType.Clipping;}
-
- // Nonessential.
- /** The color of the clipping polygon as it was in Spine. Available only when nonessential data was exported. Clipping polygons
- * are not usually rendered at runtime. */
- __init2() {this.color = new Color(0.2275, 0.2275, 0.8078, 1);} // ce3a3aff
- constructor (name) {
- super(name);ClippingAttachment$2.prototype.__init.call(this);ClippingAttachment$2.prototype.__init2.call(this); }
- copy () {
- let copy = new ClippingAttachment$2(this.name);
- this.copyTo(copy);
- copy.endSlot = this.endSlot;
- copy.color.setFromColor(this.color);
- return copy;
- }
- }
- /**
- * @public
- */
- class MeshAttachment$2 extends VertexAttachment$2 {
- __init() {this.type = exports.AttachmentType.Mesh;}
-
- /** The name of the texture region for this attachment. */
-
- /** The UV pair for each vertex, normalized within the texture region. */
-
- /** Triplets of vertex indices which describe the mesh's triangulation. */
-
- /** The color to tint the mesh. */
- __init2() {this.color = new Color(1, 1, 1, 1);}
- /** The width of the mesh's image. Available only when nonessential data was exported. */
-
- /** The height of the mesh's image. Available only when nonessential data was exported. */
-
- /** The number of entries at the beginning of {@link #vertices} that make up the mesh hull. */
-
- /** Vertex index pairs describing edges for controling triangulation. Mesh triangles will never cross edges. Only available if
- * nonessential data was exported. Triangulation is not performed at runtime. */
-
-
- __init3() {this.tempColor = new Color(0, 0, 0, 0);}
- constructor (name) {
- super(name);MeshAttachment$2.prototype.__init.call(this);MeshAttachment$2.prototype.__init2.call(this);MeshAttachment$2.prototype.__init3.call(this); }
- /** The parent mesh if this is a linked mesh, else null. A linked mesh shares the {@link #bones}, {@link #vertices},
- * {@link #regionUVs}, {@link #triangles}, {@link #hullLength}, {@link #edges}, {@link #width}, and {@link #height} with the
- * parent mesh, but may have a different {@link #name} or {@link #path} (and therefore a different texture). */
- getParentMesh () {
- return this.parentMesh;
- }
- /** @param parentMesh May be null. */
- setParentMesh (parentMesh) {
- this.parentMesh = parentMesh;
- if (parentMesh != null) {
- this.bones = parentMesh.bones;
- this.vertices = parentMesh.vertices;
- this.worldVerticesLength = parentMesh.worldVerticesLength;
- this.regionUVs = parentMesh.regionUVs;
- this.triangles = parentMesh.triangles;
- this.hullLength = parentMesh.hullLength;
- this.worldVerticesLength = parentMesh.worldVerticesLength;
- }
- }
- copy () {
- if (this.parentMesh != null) return this.newLinkedMesh();
- let copy = new MeshAttachment$2(this.name);
- copy.region = this.region;
- copy.path = this.path;
- copy.color.setFromColor(this.color);
- this.copyTo(copy);
- copy.regionUVs = new Float32Array(this.regionUVs.length);
- Utils.arrayCopy(this.regionUVs, 0, copy.regionUVs, 0, this.regionUVs.length);
- copy.triangles = new Array(this.triangles.length);
- Utils.arrayCopy(this.triangles, 0, copy.triangles, 0, this.triangles.length);
- copy.hullLength = this.hullLength;
- // Nonessential.
- if (this.edges != null) {
- copy.edges = new Array(this.edges.length);
- Utils.arrayCopy(this.edges, 0, copy.edges, 0, this.edges.length);
- }
- copy.width = this.width;
- copy.height = this.height;
- return copy;
- }
- /** Returns a new mesh with the {@link #parentMesh} set to this mesh's parent mesh, if any, else to this mesh. **/
- newLinkedMesh () {
- let copy = new MeshAttachment$2(this.name);
- copy.region = this.region;
- copy.path = this.path;
- copy.color.setFromColor(this.color);
- copy.deformAttachment = this.deformAttachment;
- copy.setParentMesh(this.parentMesh != null ? this.parentMesh : this);
- // copy.updateUVs();
- return copy;
- }
- }
- /**
- * @public
- */
- class PathAttachment$2 extends VertexAttachment$2 {
- __init() {this.type = exports.AttachmentType.Path;}
- /** The lengths along the path in the setup pose from the start of the path to the end of each Bezier curve. */
-
- /** If true, the start and end knots are connected. */
- __init2() {this.closed = false;}
- /** If true, additional calculations are performed to make calculating positions along the path more accurate. If false, fewer
- * calculations are performed but calculating positions along the path is less accurate. */
- __init3() {this.constantSpeed = false;}
- /** The color of the path as it was in Spine. Available only when nonessential data was exported. Paths are not usually
- * rendered at runtime. */
- __init4() {this.color = new Color(1, 1, 1, 1);}
- constructor (name) {
- super(name);PathAttachment$2.prototype.__init.call(this);PathAttachment$2.prototype.__init2.call(this);PathAttachment$2.prototype.__init3.call(this);PathAttachment$2.prototype.__init4.call(this); }
- copy () {
- let copy = new PathAttachment$2(this.name);
- this.copyTo(copy);
- copy.lengths = new Array(this.lengths.length);
- Utils.arrayCopy(this.lengths, 0, copy.lengths, 0, this.lengths.length);
- copy.closed = closed;
- copy.constantSpeed = this.constantSpeed;
- copy.color.setFromColor(this.color);
- return copy;
- }
- }
- /**
- * @public
- */
- class PointAttachment$2 extends VertexAttachment$2 {
- __init() {this.type = exports.AttachmentType.Point;}
-
- /** The color of the point attachment as it was in Spine. Available only when nonessential data was exported. Point attachments
- * are not usually rendered at runtime. */
- __init2() {this.color = new Color(0.38, 0.94, 0, 1);}
- constructor (name) {
- super(name);PointAttachment$2.prototype.__init.call(this);PointAttachment$2.prototype.__init2.call(this); }
- computeWorldPosition (bone, point) {
- const mat = bone.matrix;
- point.x = this.x * mat.a + this.y * mat.c + bone.worldX;
- point.y = this.x * mat.b + this.y * mat.d + bone.worldY;
- return point;
- }
- computeWorldRotation (bone) {
- const mat = bone.matrix;
- let cos = MathUtils.cosDeg(this.rotation), sin = MathUtils.sinDeg(this.rotation);
- let x = cos * mat.a + sin * mat.c;
- let y = cos * mat.b + sin * mat.d;
- return Math.atan2(y, x) * MathUtils.radDeg;
- }
- copy () {
- let copy = new PointAttachment$2(this.name);
- copy.x = this.x;
- copy.y = this.y;
- copy.rotation = this.rotation;
- copy.color.setFromColor(this.color);
- return copy;
- }
- }
- /**
- * @public
- */
- class RegionAttachment$2 extends Attachment$2 {
- __init() {this.type = exports.AttachmentType.Region;}
- static __initStatic() {this.OX1 = 0;}
- static __initStatic2() {this.OY1 = 1;}
- static __initStatic3() {this.OX2 = 2;}
- static __initStatic4() {this.OY2 = 3;}
- static __initStatic5() {this.OX3 = 4;}
- static __initStatic6() {this.OY3 = 5;}
- static __initStatic7() {this.OX4 = 6;}
- static __initStatic8() {this.OY4 = 7;}
- static __initStatic9() {this.X1 = 0;}
- static __initStatic10() {this.Y1 = 1;}
- static __initStatic11() {this.C1R = 2;}
- static __initStatic12() {this.C1G = 3;}
- static __initStatic13() {this.C1B = 4;}
- static __initStatic14() {this.C1A = 5;}
- static __initStatic15() {this.U1 = 6;}
- static __initStatic16() {this.V1 = 7;}
- static __initStatic17() {this.X2 = 8;}
- static __initStatic18() {this.Y2 = 9;}
- static __initStatic19() {this.C2R = 10;}
- static __initStatic20() {this.C2G = 11;}
- static __initStatic21() {this.C2B = 12;}
- static __initStatic22() {this.C2A = 13;}
- static __initStatic23() {this.U2 = 14;}
- static __initStatic24() {this.V2 = 15;}
- static __initStatic25() {this.X3 = 16;}
- static __initStatic26() {this.Y3 = 17;}
- static __initStatic27() {this.C3R = 18;}
- static __initStatic28() {this.C3G = 19;}
- static __initStatic29() {this.C3B = 20;}
- static __initStatic30() {this.C3A = 21;}
- static __initStatic31() {this.U3 = 22;}
- static __initStatic32() {this.V3 = 23;}
- static __initStatic33() {this.X4 = 24;}
- static __initStatic34() {this.Y4 = 25;}
- static __initStatic35() {this.C4R = 26;}
- static __initStatic36() {this.C4G = 27;}
- static __initStatic37() {this.C4B = 28;}
- static __initStatic38() {this.C4A = 29;}
- static __initStatic39() {this.U4 = 30;}
- static __initStatic40() {this.V4 = 31;}
- /** The local x translation. */
- __init2() {this.x = 0;}
- /** The local y translation. */
- __init3() {this.y = 0;}
- /** The local scaleX. */
- __init4() {this.scaleX = 1;}
- /** The local scaleY. */
- __init5() {this.scaleY = 1;}
- /** The local rotation. */
- __init6() {this.rotation = 0;}
- /** The width of the region attachment in Spine. */
- __init7() {this.width = 0;}
- /** The height of the region attachment in Spine. */
- __init8() {this.height = 0;}
- /** The color to tint the region attachment. */
- __init9() {this.color = new Color(1, 1, 1, 1);}
- /** The name of the texture region for this attachment. */
-
-
-
- /** For each of the 4 vertices, a pair of <code>x,y</code> values that is the local position of the vertex.
- *
- * See {@link #updateOffset()}. */
- __init10() {this.offset = Utils.newFloatArray(8);}
- __init11() {this.uvs = Utils.newFloatArray(8);}
- __init12() {this.tempColor = new Color(1, 1, 1, 1);}
- constructor (name) {
- super(name);RegionAttachment$2.prototype.__init.call(this);RegionAttachment$2.prototype.__init2.call(this);RegionAttachment$2.prototype.__init3.call(this);RegionAttachment$2.prototype.__init4.call(this);RegionAttachment$2.prototype.__init5.call(this);RegionAttachment$2.prototype.__init6.call(this);RegionAttachment$2.prototype.__init7.call(this);RegionAttachment$2.prototype.__init8.call(this);RegionAttachment$2.prototype.__init9.call(this);RegionAttachment$2.prototype.__init10.call(this);RegionAttachment$2.prototype.__init11.call(this);RegionAttachment$2.prototype.__init12.call(this); }
- /** Calculates the {@link #offset} using the region settings. Must be called after changing region settings. */
- updateOffset () {
- let regionScaleX = this.width / this.region.originalWidth * this.scaleX;
- let regionScaleY = this.height / this.region.originalHeight * this.scaleY;
- let localX = -this.width / 2 * this.scaleX + this.region.offsetX * regionScaleX;
- let localY = -this.height / 2 * this.scaleY + this.region.offsetY * regionScaleY;
- let localX2 = localX + this.region.width * regionScaleX;
- let localY2 = localY + this.region.height * regionScaleY;
- let radians = this.rotation * Math.PI / 180;
- let cos = Math.cos(radians);
- let sin = Math.sin(radians);
- let localXCos = localX * cos + this.x;
- let localXSin = localX * sin;
- let localYCos = localY * cos + this.y;
- let localYSin = localY * sin;
- let localX2Cos = localX2 * cos + this.x;
- let localX2Sin = localX2 * sin;
- let localY2Cos = localY2 * cos + this.y;
- let localY2Sin = localY2 * sin;
- let offset = this.offset;
- offset[RegionAttachment$2.OX1] = localXCos - localYSin;
- offset[RegionAttachment$2.OY1] = localYCos + localXSin;
- offset[RegionAttachment$2.OX2] = localXCos - localY2Sin;
- offset[RegionAttachment$2.OY2] = localY2Cos + localXSin;
- offset[RegionAttachment$2.OX3] = localX2Cos - localY2Sin;
- offset[RegionAttachment$2.OY3] = localY2Cos + localX2Sin;
- offset[RegionAttachment$2.OX4] = localX2Cos - localYSin;
- offset[RegionAttachment$2.OY4] = localYCos + localX2Sin;
- }
- setRegion (region) {
- this.region = region;
- let uvs = this.uvs;
- if (region.degrees == 90) {
- uvs[2] = region.u;
- uvs[3] = region.v2;
- uvs[4] = region.u;
- uvs[5] = region.v;
- uvs[6] = region.u2;
- uvs[7] = region.v;
- uvs[0] = region.u2;
- uvs[1] = region.v2;
- } else {
- uvs[0] = region.u;
- uvs[1] = region.v2;
- uvs[2] = region.u;
- uvs[3] = region.v;
- uvs[4] = region.u2;
- uvs[5] = region.v;
- uvs[6] = region.u2;
- uvs[7] = region.v2;
- }
- }
- /** Transforms the attachment's four vertices to world coordinates.
- *
- * See [World transforms](http://esotericsoftware.com/spine-runtime-skeletons#World-transforms) in the Spine
- * Runtimes Guide.
- * @param worldVertices The output world vertices. Must have a length >= `offset` + 8.
- * @param offset The `worldVertices` index to begin writing values.
- * @param stride The number of `worldVertices` entries between the value pairs written. */
- computeWorldVertices (bone, worldVertices, offset, stride) {
- let vertexOffset = this.offset;
- let mat = bone.matrix;
- let x = mat.tx, y = mat.ty;
- let a = mat.a, b = mat.c, c = mat.b, d = mat.d;
- let offsetX = 0, offsetY = 0;
- offsetX = vertexOffset[RegionAttachment$2.OX1];
- offsetY = vertexOffset[RegionAttachment$2.OY1];
- worldVertices[offset] = offsetX * a + offsetY * b + x; // br
- worldVertices[offset + 1] = offsetX * c + offsetY * d + y;
- offset += stride;
- offsetX = vertexOffset[RegionAttachment$2.OX2];
- offsetY = vertexOffset[RegionAttachment$2.OY2];
- worldVertices[offset] = offsetX * a + offsetY * b + x; // bl
- worldVertices[offset + 1] = offsetX * c + offsetY * d + y;
- offset += stride;
- offsetX = vertexOffset[RegionAttachment$2.OX3];
- offsetY = vertexOffset[RegionAttachment$2.OY3];
- worldVertices[offset] = offsetX * a + offsetY * b + x; // ul
- worldVertices[offset + 1] = offsetX * c + offsetY * d + y;
- offset += stride;
- offsetX = vertexOffset[RegionAttachment$2.OX4];
- offsetY = vertexOffset[RegionAttachment$2.OY4];
- worldVertices[offset] = offsetX * a + offsetY * b + x; // ur
- worldVertices[offset + 1] = offsetX * c + offsetY * d + y;
- }
- copy () {
- let copy = new RegionAttachment$2(this.name);
- copy.region = this.region;
- copy.rendererObject = this.rendererObject;
- copy.path = this.path;
- copy.x = this.x;
- copy.y = this.y;
- copy.scaleX = this.scaleX;
- copy.scaleY = this.scaleY;
- copy.rotation = this.rotation;
- copy.width = this.width;
- copy.height = this.height;
- Utils.arrayCopy(this.uvs, 0, copy.uvs, 0, 8);
- Utils.arrayCopy(this.offset, 0, copy.offset, 0, 8);
- copy.color.setFromColor(this.color);
- return copy;
- }
- } RegionAttachment$2.__initStatic(); RegionAttachment$2.__initStatic2(); RegionAttachment$2.__initStatic3(); RegionAttachment$2.__initStatic4(); RegionAttachment$2.__initStatic5(); RegionAttachment$2.__initStatic6(); RegionAttachment$2.__initStatic7(); RegionAttachment$2.__initStatic8(); RegionAttachment$2.__initStatic9(); RegionAttachment$2.__initStatic10(); RegionAttachment$2.__initStatic11(); RegionAttachment$2.__initStatic12(); RegionAttachment$2.__initStatic13(); RegionAttachment$2.__initStatic14(); RegionAttachment$2.__initStatic15(); RegionAttachment$2.__initStatic16(); RegionAttachment$2.__initStatic17(); RegionAttachment$2.__initStatic18(); RegionAttachment$2.__initStatic19(); RegionAttachment$2.__initStatic20(); RegionAttachment$2.__initStatic21(); RegionAttachment$2.__initStatic22(); RegionAttachment$2.__initStatic23(); RegionAttachment$2.__initStatic24(); RegionAttachment$2.__initStatic25(); RegionAttachment$2.__initStatic26(); RegionAttachment$2.__initStatic27(); RegionAttachment$2.__initStatic28(); RegionAttachment$2.__initStatic29(); RegionAttachment$2.__initStatic30(); RegionAttachment$2.__initStatic31(); RegionAttachment$2.__initStatic32(); RegionAttachment$2.__initStatic33(); RegionAttachment$2.__initStatic34(); RegionAttachment$2.__initStatic35(); RegionAttachment$2.__initStatic36(); RegionAttachment$2.__initStatic37(); RegionAttachment$2.__initStatic38(); RegionAttachment$2.__initStatic39(); RegionAttachment$2.__initStatic40();
- /**
- * @public
- */
- class JitterEffect$2 {
- __init() {this.jitterX = 0;}
- __init2() {this.jitterY = 0;}
- constructor (jitterX, jitterY) {JitterEffect$2.prototype.__init.call(this);JitterEffect$2.prototype.__init2.call(this);
- this.jitterX = jitterX;
- this.jitterY = jitterY;
- }
- //@ts-ignore
- begin(skeleton) {
- }
- //@ts-ignore
- transform(position, uv, light, dark) {
- position.x += MathUtils.randomTriangular(-this.jitterX, this.jitterY);
- position.y += MathUtils.randomTriangular(-this.jitterX, this.jitterY);
- }
- end() {
- }
- }
- /**
- * @public
- */
- class SwirlEffect$2 {
- static __initStatic() {this.interpolation = new PowOut(2);}
- __init() {this.centerX = 0;}
- __init2() {this.centerY = 0;}
- __init3() {this.radius = 0;}
- __init4() {this.angle = 0;}
- __init5() {this.worldX = 0;}
- __init6() {this.worldY = 0;}
- constructor (radius) {SwirlEffect$2.prototype.__init.call(this);SwirlEffect$2.prototype.__init2.call(this);SwirlEffect$2.prototype.__init3.call(this);SwirlEffect$2.prototype.__init4.call(this);SwirlEffect$2.prototype.__init5.call(this);SwirlEffect$2.prototype.__init6.call(this);
- this.radius = radius;
- }
- begin(skeleton) {
- this.worldX = skeleton.x + this.centerX;
- this.worldY = skeleton.y + this.centerY;
- }
- //@ts-ignore
- transform(position, uv, light, dark) {
- let radAngle = this.angle * MathUtils.degreesToRadians;
- let x = position.x - this.worldX;
- let y = position.y - this.worldY;
- let dist = Math.sqrt(x * x + y * y);
- if (dist < this.radius) {
- let theta = SwirlEffect$2.interpolation.apply(0, radAngle, (this.radius - dist) / this.radius);
- let cos = Math.cos(theta);
- let sin = Math.sin(theta);
- position.x = cos * x - sin * y + this.worldX;
- position.y = sin * x + cos * y + this.worldY;
- }
- }
- end() {
- }
- } SwirlEffect$2.__initStatic();
- /**
- * A simple container for a list of timelines and a name.
- * @public
- * */
- class Animation$2 {
- /** The animation's name, which is unique across all animations in the skeleton. */
-
-
-
- /** The duration of the animation in seconds, which is the highest time of all keys in the timeline. */
-
- constructor (name, timelines, duration) {
- if (name == null) throw new Error("name cannot be null.");
- if (timelines == null) throw new Error("timelines cannot be null.");
- this.name = name;
- this.timelines = timelines;
- this.timelineIds = new StringSet();
- for (var i = 0; i < timelines.length; i++)
- this.timelineIds.addAll(timelines[i].getPropertyIds());
- this.duration = duration;
- }
- hasTimeline(ids) {
- for (let i = 0; i < ids.length; i++) {
- if (this.timelineIds.contains(ids[i])) return true;
- }
- return false;
- }
- /** Applies all the animation's timelines to the specified skeleton.
- *
- * See Timeline {@link Timeline#apply(Skeleton, float, float, Array, float, MixBlend, MixDirection)}.
- * @param loop If true, the animation repeats after {@link #getDuration()}.
- * @param events May be null to ignore fired events. */
- apply (skeleton, lastTime, time, loop, events, alpha, blend, direction) {
- if (skeleton == null) throw new Error("skeleton cannot be null.");
- if (loop && this.duration != 0) {
- time %= this.duration;
- if (lastTime > 0) lastTime %= this.duration;
- }
- let timelines = this.timelines;
- for (let i = 0, n = timelines.length; i < n; i++)
- timelines[i].apply(skeleton, lastTime, time, events, alpha, blend, direction);
- }
- static search (frames, time) {
- let n = frames.length;
- for (let i = 1; i < n; i++)
- if (frames[i] > time) return i - 1;
- return n - 1;
- }
- static search2 (values, time, step) {
- let n = values.length;
- for (let i = step; i < n; i += step)
- if (values[i] > time) return i - step;
- return n - step;
- }
- }
- /** Controls how a timeline value is mixed with the setup pose value or current pose value when a timeline's `alpha`
- * < 1.
- *
- * See Timeline {@link Timeline#apply(Skeleton, float, float, Array, float, MixBlend, MixDirection)}.
- * @public
- * */
- var MixBlend$2; (function (MixBlend) {
- /** Transitions from the setup value to the timeline value (the current value is not used). Before the first key, the setup
- * value is set. */
- const setup = 0; MixBlend[MixBlend["setup"] = setup] = "setup";
- /** Transitions from the current value to the timeline value. Before the first key, transitions from the current value to
- * the setup value. Timelines which perform instant transitions, such as {@link DrawOrderTimeline} or
- * {@link AttachmentTimeline}, use the setup value before the first key.
- *
- * `first` is intended for the first animations applied, not for animations layered on top of those. */
- const first = setup + 1; MixBlend[MixBlend["first"] = first] = "first";
- /** Transitions from the current value to the timeline value. No change is made before the first key (the current value is
- * kept until the first key).
- *
- * `replace` is intended for animations layered on top of others, not for the first animations applied. */
- const replace = first + 1; MixBlend[MixBlend["replace"] = replace] = "replace";
- /** Transitions from the current value to the current value plus the timeline value. No change is made before the first key
- * (the current value is kept until the first key).
- *
- * `add` is intended for animations layered on top of others, not for the first animations applied. Properties
- * keyed by additive animations must be set manually or by another animation before applying the additive animations, else
- * the property values will increase continually. */
- const add = replace + 1; MixBlend[MixBlend["add"] = add] = "add";
- })(MixBlend$2 || (MixBlend$2 = {}));
- /** Indicates whether a timeline's `alpha` is mixing out over time toward 0 (the setup or current pose value) or
- * mixing in toward 1 (the timeline's value).
- *
- * See Timeline {@link Timeline#apply(Skeleton, float, float, Array, float, MixBlend, MixDirection)}.
- * @public
- * */
- var MixDirection$2; (function (MixDirection) {
- const mixIn = 0; MixDirection[MixDirection["mixIn"] = mixIn] = "mixIn"; const mixOut = mixIn + 1; MixDirection[MixDirection["mixOut"] = mixOut] = "mixOut";
- })(MixDirection$2 || (MixDirection$2 = {}));
- /**
- * @public
- */
- var Property; (function (Property) {
- const rotate = 0; Property[Property["rotate"] = rotate] = "rotate"; const x = rotate + 1; Property[Property["x"] = x] = "x"; const y = x + 1; Property[Property["y"] = y] = "y"; const scaleX = y + 1; Property[Property["scaleX"] = scaleX] = "scaleX"; const scaleY = scaleX + 1; Property[Property["scaleY"] = scaleY] = "scaleY"; const shearX = scaleY + 1; Property[Property["shearX"] = shearX] = "shearX"; const shearY = shearX + 1; Property[Property["shearY"] = shearY] = "shearY"; //
- const rgb = shearY + 1; Property[Property["rgb"] = rgb] = "rgb"; const alpha = rgb + 1; Property[Property["alpha"] = alpha] = "alpha"; const rgb2 = alpha + 1; Property[Property["rgb2"] = rgb2] = "rgb2"; //
- const attachment = rgb2 + 1; Property[Property["attachment"] = attachment] = "attachment"; const deform = attachment + 1; Property[Property["deform"] = deform] = "deform"; //
- const event = deform + 1; Property[Property["event"] = event] = "event"; const drawOrder = event + 1; Property[Property["drawOrder"] = drawOrder] = "drawOrder"; //
- const ikConstraint = drawOrder + 1; Property[Property["ikConstraint"] = ikConstraint] = "ikConstraint"; const transformConstraint = ikConstraint + 1; Property[Property["transformConstraint"] = transformConstraint] = "transformConstraint"; //
- const pathConstraintPosition = transformConstraint + 1; Property[Property["pathConstraintPosition"] = pathConstraintPosition] = "pathConstraintPosition"; const pathConstraintSpacing = pathConstraintPosition + 1; Property[Property["pathConstraintSpacing"] = pathConstraintSpacing] = "pathConstraintSpacing"; const pathConstraintMix = pathConstraintSpacing + 1; Property[Property["pathConstraintMix"] = pathConstraintMix] = "pathConstraintMix";
- })(Property || (Property = {}));
- /** The interface for all timelines.
- * @public
- * */
- class Timeline {
-
-
- constructor(frameCount, propertyIds) {
- this.propertyIds = propertyIds;
- this.frames = Utils.newFloatArray(frameCount * this.getFrameEntries());
- }
- getPropertyIds () {
- return this.propertyIds;
- }
-
- getFrameCount () {
- return this.frames.length / this.getFrameEntries();
- }
- getDuration () {
- return this.frames[this.frames.length - this.getFrameEntries()];
- }
-
- }
- /**
- * @public
- */
- /** The base class for timelines that use interpolation between key frame values.
- * @public
- * */
- class CurveTimeline$2 extends Timeline {
- static __initStatic() {this.LINEAR = 0;} static __initStatic2() {this.STEPPED = 1;} static __initStatic3() {this.BEZIER = 2;}
- static __initStatic4() {this.BEZIER_SIZE = 18;}
- // type, x, y, ...
- constructor (frameCount, bezierCount, propertyIds) {
- super(frameCount, propertyIds);
- this.curves = Utils.newFloatArray(frameCount + bezierCount * CurveTimeline$2.BEZIER_SIZE);
- this.curves[frameCount - 1] = CurveTimeline$2.STEPPED;
- }
- /** Sets the specified key frame to linear interpolation. */
- setLinear (frame) {
- this.curves[frame] = CurveTimeline$2.LINEAR;
- }
- /** Sets the specified key frame to stepped interpolation. */
- setStepped (frame) {
- this.curves[frame] = CurveTimeline$2.STEPPED;
- }
- /** Shrinks the storage for Bezier curves, for use when <code>bezierCount</code> (specified in the constructor) was larger
- * than the actual number of Bezier curves. */
- shrink (bezierCount) {
- let size = this.getFrameCount() + bezierCount * CurveTimeline$2.BEZIER_SIZE;
- if (this.curves.length > size) {
- let newCurves = Utils.newFloatArray(size);
- Utils.arrayCopy(this.curves, 0, newCurves, 0, size);
- this.curves = newCurves;
- }
- }
- /** Stores the segments for the specified Bezier curve. For timelines that modify multiple values, there may be more than
- * one curve per frame.
- * @param bezier The ordinal of this Bezier curve for this timeline, between 0 and <code>bezierCount - 1</code> (specified
- * in the constructor), inclusive.
- * @param frame Between 0 and <code>frameCount - 1</code>, inclusive.
- * @param value The index of the value for this frame that this curve is used for.
- * @param time1 The time for the first key.
- * @param value1 The value for the first key.
- * @param cx1 The time for the first Bezier handle.
- * @param cy1 The value for the first Bezier handle.
- * @param cx2 The time of the second Bezier handle.
- * @param cy2 The value for the second Bezier handle.
- * @param time2 The time for the second key.
- * @param value2 The value for the second key. */
- setBezier (bezier, frame, value, time1, value1, cx1, cy1, cx2,
- cy2, time2, value2) {
- let curves = this.curves;
- let i = this.getFrameCount() + bezier * CurveTimeline$2.BEZIER_SIZE;
- if (value == 0) curves[frame] = CurveTimeline$2.BEZIER + i;
- let tmpx = (time1 - cx1 * 2 + cx2) * 0.03, tmpy = (value1 - cy1 * 2 + cy2) * 0.03;
- let dddx = ((cx1 - cx2) * 3 - time1 + time2) * 0.006, dddy = ((cy1 - cy2) * 3 - value1 + value2) * 0.006;
- let ddx = tmpx * 2 + dddx, ddy = tmpy * 2 + dddy;
- let dx = (cx1 - time1) * 0.3 + tmpx + dddx * 0.16666667, dy = (cy1 - value1) * 0.3 + tmpy + dddy * 0.16666667;
- let x = time1 + dx, y = value1 + dy;
- for (let n = i + CurveTimeline$2.BEZIER_SIZE; i < n; i += 2) {
- curves[i] = x;
- curves[i + 1] = y;
- dx += ddx;
- dy += ddy;
- ddx += dddx;
- ddy += dddy;
- x += dx;
- y += dy;
- }
- }
- /** Returns the Bezier interpolated value for the specified time.
- * @param frameIndex The index into {@link #getFrames()} for the values of the frame before <code>time</code>.
- * @param valueOffset The offset from <code>frameIndex</code> to the value this curve is used for.
- * @param i The index of the Bezier segments. See {@link #getCurveType(int)}. */
- getBezierValue (time, frameIndex, valueOffset, i) {
- let curves = this.curves;
- let frames = this.frames;
- if (curves[i] > time) {
- let x = frames[frameIndex], y = frames[frameIndex + valueOffset];
- return y + (time - x) / (curves[i] - x) * (curves[i + 1] - y);
- }
- let n = i + CurveTimeline$2.BEZIER_SIZE;
- for (i += 2; i < n; i += 2) {
- if (curves[i] >= time) {
- let x = curves[i - 2], y = curves[i - 1];
- return y + (time - x) / (curves[i] - x) * (curves[i + 1] - y);
- }
- }
- frameIndex += this.getFrameEntries();
- let x = curves[n - 2], y = curves[n - 1];
- return y + (time - x) / (frames[frameIndex] - x) * (frames[frameIndex + valueOffset] - y);
- }
- } CurveTimeline$2.__initStatic(); CurveTimeline$2.__initStatic2(); CurveTimeline$2.__initStatic3(); CurveTimeline$2.__initStatic4();
- /**
- * @public
- */
- class CurveTimeline1 extends CurveTimeline$2 {
- static __initStatic5() {this.ENTRIES = 2;}
- static __initStatic6() {this.VALUE = 1;}
- constructor(frameCount, bezierCount, propertyIds) {
- super(frameCount, bezierCount, propertyIds);
- }
- getFrameEntries() {
- return CurveTimeline1.ENTRIES;
- }
- /** Sets the time and value for the specified frame.
- * @param frame Between 0 and <code>frameCount</code>, inclusive.
- * @param time The frame time in seconds. */
- setFrame (frame, time, value) {
- frame <<= 1;
- this.frames[frame] = time;
- this.frames[frame + CurveTimeline1.VALUE] = value;
- }
- /** Returns the interpolated value for the specified time. */
- getCurveValue (time) {
- let frames = this.frames;
- let i = frames.length - 2;
- for (let ii = 2; ii <= i; ii += 2) {
- if (frames[ii] > time) {
- i = ii - 2;
- break;
- }
- }
- let curveType = this.curves[i >> 1];
- switch (curveType) {
- case CurveTimeline$2.LINEAR:
- let before = frames[i], value = frames[i + CurveTimeline1.VALUE];
- return value + (time - before) / (frames[i + CurveTimeline1.ENTRIES] - before) * (frames[i + CurveTimeline1.ENTRIES + CurveTimeline1.VALUE] - value);
- case CurveTimeline$2.STEPPED:
- return frames[i + CurveTimeline1.VALUE];
- }
- return this.getBezierValue(time, i, CurveTimeline1.VALUE, curveType - CurveTimeline1.BEZIER);
- }
- } CurveTimeline1.__initStatic5(); CurveTimeline1.__initStatic6();
- /** The base class for a {@link CurveTimeline} which sets two properties.
- * @public
- * */
- class CurveTimeline2 extends CurveTimeline$2 {
- static __initStatic7() {this.ENTRIES = 3;}
- static __initStatic8() {this.VALUE1 = 1;}
- static __initStatic9() {this.VALUE2 = 2;}
- /** @param bezierCount The maximum number of Bezier curves. See {@link #shrink(int)}.
- * @param propertyIds Unique identifiers for the properties the timeline modifies. */
- constructor (frameCount, bezierCount, propertyIds) {
- super(frameCount, bezierCount, propertyIds);
- }
- getFrameEntries () {
- return CurveTimeline2.ENTRIES;
- }
- /** Sets the time and values for the specified frame.
- * @param frame Between 0 and <code>frameCount</code>, inclusive.
- * @param time The frame time in seconds. */
- setFrame (frame, time, value1, value2) {
- frame *= CurveTimeline2.ENTRIES;
- let frames = this.frames;
- frames[frame] = time;
- frames[frame + CurveTimeline2.VALUE1] = value1;
- frames[frame + CurveTimeline2.VALUE2] = value2;
- }
- } CurveTimeline2.__initStatic7(); CurveTimeline2.__initStatic8(); CurveTimeline2.__initStatic9();
- /** Changes a bone's local {@link Bone#rotation}.
- * @public
- * */
- class RotateTimeline$2 extends CurveTimeline1 {
- __init() {this.boneIndex = 0;}
- constructor (frameCount, bezierCount, boneIndex) {
- super(frameCount, bezierCount, [
- Property.rotate + "|" + boneIndex
- ]);RotateTimeline$2.prototype.__init.call(this); this.boneIndex = boneIndex;
- }
- apply (skeleton, lastTime, time, events, alpha, blend, direction) {
- let frames = this.frames;
- let bone = skeleton.bones[this.boneIndex];
- if (!bone.active) return;
- if (time < frames[0]) {
- switch (blend) {
- case MixBlend$2.setup:
- bone.rotation = bone.data.rotation;
- return;
- case MixBlend$2.first:
- bone.rotation += (bone.data.rotation - bone.rotation) * alpha;
- }
- return;
- }
- let r = this.getCurveValue(time);
- switch (blend) {
- case MixBlend$2.setup:
- bone.rotation = bone.data.rotation + r * alpha;
- break;
- case MixBlend$2.first:
- case MixBlend$2.replace:
- r += bone.data.rotation - bone.rotation;
- case MixBlend$2.add:
- bone.rotation += r * alpha;
- }
- }
- }
- /** Changes a bone's local {@link Bone#x} and {@link Bone#y}.
- * @public
- * */
- class TranslateTimeline$2 extends CurveTimeline2 {
- __init2() {this.boneIndex = 0;}
- constructor (frameCount, bezierCount, boneIndex) {
- super(frameCount, bezierCount, [
- Property.x + "|" + boneIndex,
- Property.y + "|" + boneIndex,
- ]);TranslateTimeline$2.prototype.__init2.call(this); this.boneIndex = boneIndex;
- }
- apply (skeleton, lastTime, time, events, alpha, blend, direction) {
- let frames = this.frames;
- let bone = skeleton.bones[this.boneIndex];
- if (!bone.active) return;
- if (time < frames[0]) {
- switch (blend) {
- case MixBlend$2.setup:
- bone.x = bone.data.x;
- bone.y = bone.data.y;
- return;
- case MixBlend$2.first:
- bone.x += (bone.data.x - bone.x) * alpha;
- bone.y += (bone.data.y - bone.y) * alpha;
- }
- return;
- }
- let x = 0, y = 0;
- let i = Animation$2.search2(frames, time, CurveTimeline2.ENTRIES);
- let curveType = this.curves[i / CurveTimeline2.ENTRIES];
- switch (curveType) {
- case CurveTimeline$2.LINEAR:
- let before = frames[i];
- x = frames[i + CurveTimeline2.VALUE1];
- y = frames[i + CurveTimeline2.VALUE2];
- let t = (time - before) / (frames[i + CurveTimeline2.ENTRIES] - before);
- x += (frames[i + CurveTimeline2.ENTRIES + CurveTimeline2.VALUE1] - x) * t;
- y += (frames[i + CurveTimeline2.ENTRIES + CurveTimeline2.VALUE2] - y) * t;
- break;
- case CurveTimeline$2.STEPPED:
- x = frames[i + CurveTimeline2.VALUE1];
- y = frames[i + CurveTimeline2.VALUE2];
- break;
- default:
- x = this.getBezierValue(time, i, CurveTimeline2.VALUE1, curveType - CurveTimeline$2.BEZIER);
- y = this.getBezierValue(time, i, CurveTimeline2.VALUE2, curveType + CurveTimeline$2.BEZIER_SIZE - CurveTimeline$2.BEZIER);
- }
- switch (blend) {
- case MixBlend$2.setup:
- bone.x = bone.data.x + x * alpha;
- bone.y = bone.data.y + y * alpha;
- break;
- case MixBlend$2.first:
- case MixBlend$2.replace:
- bone.x += (bone.data.x + x - bone.x) * alpha;
- bone.y += (bone.data.y + y - bone.y) * alpha;
- break;
- case MixBlend$2.add:
- bone.x += x * alpha;
- bone.y += y * alpha;
- }
- }
- }
- /** Changes a bone's local {@link Bone#x}.
- * @public
- * */
- class TranslateXTimeline extends CurveTimeline1 {
- __init3() {this.boneIndex = 0;}
- constructor (frameCount, bezierCount, boneIndex) {
- super(frameCount, bezierCount, [
- Property.x + "|" + boneIndex
- ]);TranslateXTimeline.prototype.__init3.call(this); this.boneIndex = boneIndex;
- }
- apply (skeleton, lastTime, time, events, alpha, blend, direction) {
- let frames = this.frames;
- let bone = skeleton.bones[this.boneIndex];
- if (!bone.active) return;
- if (time < frames[0]) {
- switch (blend) {
- case MixBlend$2.setup:
- bone.x = bone.data.x;
- return;
- case MixBlend$2.first:
- bone.x += (bone.data.x - bone.x) * alpha;
- }
- return;
- }
- let x = this.getCurveValue(time);
- switch (blend) {
- case MixBlend$2.setup:
- bone.x = bone.data.x + x * alpha;
- break;
- case MixBlend$2.first:
- case MixBlend$2.replace:
- bone.x += (bone.data.x + x - bone.x) * alpha;
- break;
- case MixBlend$2.add:
- bone.x += x * alpha;
- }
- }
- }
- /** Changes a bone's local {@link Bone#x}.
- * @public
- * */
- class TranslateYTimeline extends CurveTimeline1 {
- __init4() {this.boneIndex = 0;}
- constructor (frameCount, bezierCount, boneIndex) {
- super(frameCount, bezierCount, [
- Property.y + "|" + boneIndex
- ]);TranslateYTimeline.prototype.__init4.call(this); this.boneIndex = boneIndex;
- }
- apply (skeleton, lastTime, time, events, alpha, blend, direction) {
- let frames = this.frames;
- let bone = skeleton.bones[this.boneIndex];
- if (!bone.active) return;
- if (time < frames[0]) {
- switch (blend) {
- case MixBlend$2.setup:
- bone.y = bone.data.y;
- return;
- case MixBlend$2.first:
- bone.y += (bone.data.y - bone.y) * alpha;
- }
- return;
- }
- let y = this.getCurveValue(time);
- switch (blend) {
- case MixBlend$2.setup:
- bone.y = bone.data.y + y * alpha;
- break;
- case MixBlend$2.first:
- case MixBlend$2.replace:
- bone.y += (bone.data.y + y - bone.y) * alpha;
- break;
- case MixBlend$2.add:
- bone.y += y * alpha;
- }
- }
- }
- /** Changes a bone's local {@link Bone#scaleX)} and {@link Bone#scaleY}.
- * @public
- * */
- class ScaleTimeline$2 extends CurveTimeline2 {
- __init5() {this.boneIndex = 0;}
- constructor (frameCount, bezierCount, boneIndex) {
- super(frameCount, bezierCount, [
- Property.scaleX + "|" + boneIndex,
- Property.scaleY + "|" + boneIndex
- ]);ScaleTimeline$2.prototype.__init5.call(this); this.boneIndex = boneIndex;
- }
- apply (skeleton, lastTime, time, events, alpha, blend, direction) {
- let frames = this.frames;
- let bone = skeleton.bones[this.boneIndex];
- if (!bone.active) return;
- if (time < frames[0]) {
- switch (blend) {
- case MixBlend$2.setup:
- bone.scaleX = bone.data.scaleX;
- bone.scaleY = bone.data.scaleY;
- return;
- case MixBlend$2.first:
- bone.scaleX += (bone.data.scaleX - bone.scaleX) * alpha;
- bone.scaleY += (bone.data.scaleY - bone.scaleY) * alpha;
- }
- return;
- }
- let x = 0, y = 0;
- let i = Animation$2.search2(frames, time, CurveTimeline2.ENTRIES);
- let curveType = this.curves[i / CurveTimeline2.ENTRIES];
- switch (curveType) {
- case CurveTimeline$2.LINEAR:
- let before = frames[i];
- x = frames[i + CurveTimeline2.VALUE1];
- y = frames[i + CurveTimeline2.VALUE2];
- let t = (time - before) / (frames[i + CurveTimeline2.ENTRIES] - before);
- x += (frames[i + CurveTimeline2.ENTRIES + CurveTimeline2.VALUE1] - x) * t;
- y += (frames[i + CurveTimeline2.ENTRIES + CurveTimeline2.VALUE2] - y) * t;
- break;
- case CurveTimeline$2.STEPPED:
- x = frames[i + CurveTimeline2.VALUE1];
- y = frames[i + CurveTimeline2.VALUE2];
- break;
- default:
- x = this.getBezierValue(time, i, CurveTimeline2.VALUE1, curveType - CurveTimeline2.BEZIER);
- y = this.getBezierValue(time, i, CurveTimeline2.VALUE2, curveType + CurveTimeline2.BEZIER_SIZE - CurveTimeline2.BEZIER);
- }
- x *= bone.data.scaleX;
- y *= bone.data.scaleY;
- if (alpha == 1) {
- if (blend == MixBlend$2.add) {
- bone.scaleX += x - bone.data.scaleX;
- bone.scaleY += y - bone.data.scaleY;
- } else {
- bone.scaleX = x;
- bone.scaleY = y;
- }
- } else {
- let bx = 0, by = 0;
- if (direction == MixDirection$2.mixOut) {
- switch (blend) {
- case MixBlend$2.setup:
- bx = bone.data.scaleX;
- by = bone.data.scaleY;
- bone.scaleX = bx + (Math.abs(x) * MathUtils.signum(bx) - bx) * alpha;
- bone.scaleY = by + (Math.abs(y) * MathUtils.signum(by) - by) * alpha;
- break;
- case MixBlend$2.first:
- case MixBlend$2.replace:
- bx = bone.scaleX;
- by = bone.scaleY;
- bone.scaleX = bx + (Math.abs(x) * MathUtils.signum(bx) - bx) * alpha;
- bone.scaleY = by + (Math.abs(y) * MathUtils.signum(by) - by) * alpha;
- break;
- case MixBlend$2.add:
- bx = bone.scaleX;
- by = bone.scaleY;
- bone.scaleX = bx + (Math.abs(x) * MathUtils.signum(bx) - bone.data.scaleX) * alpha;
- bone.scaleY = by + (Math.abs(y) * MathUtils.signum(by) - bone.data.scaleY) * alpha;
- }
- } else {
- switch (blend) {
- case MixBlend$2.setup:
- bx = Math.abs(bone.data.scaleX) * MathUtils.signum(x);
- by = Math.abs(bone.data.scaleY) * MathUtils.signum(y);
- bone.scaleX = bx + (x - bx) * alpha;
- bone.scaleY = by + (y - by) * alpha;
- break;
- case MixBlend$2.first:
- case MixBlend$2.replace:
- bx = Math.abs(bone.scaleX) * MathUtils.signum(x);
- by = Math.abs(bone.scaleY) * MathUtils.signum(y);
- bone.scaleX = bx + (x - bx) * alpha;
- bone.scaleY = by + (y - by) * alpha;
- break;
- case MixBlend$2.add:
- bx = MathUtils.signum(x);
- by = MathUtils.signum(y);
- bone.scaleX = Math.abs(bone.scaleX) * bx + (x - Math.abs(bone.data.scaleX) * bx) * alpha;
- bone.scaleY = Math.abs(bone.scaleY) * by + (y - Math.abs(bone.data.scaleY) * by) * alpha;
- }
- }
- }
- }
- }
- /** Changes a bone's local {@link Bone#scaleX)} and {@link Bone#scaleY}.
- * @public
- * */
- class ScaleXTimeline extends CurveTimeline1 {
- __init6() {this.boneIndex = 0;}
- constructor (frameCount, bezierCount, boneIndex) {
- super(frameCount, bezierCount, [
- Property.scaleX + "|" + boneIndex
- ]);ScaleXTimeline.prototype.__init6.call(this); this.boneIndex = boneIndex;
- }
- apply (skeleton, lastTime, time, events, alpha, blend, direction) {
- let frames = this.frames;
- let bone = skeleton.bones[this.boneIndex];
- if (!bone.active) return;
- if (time < frames[0]) {
- switch (blend) {
- case MixBlend$2.setup:
- bone.scaleX = bone.data.scaleX;
- return;
- case MixBlend$2.first:
- bone.scaleX += (bone.data.scaleX - bone.scaleX) * alpha;
- }
- return;
- }
- let x = this.getCurveValue(time) * bone.data.scaleX;
- if (alpha == 1) {
- if (blend == MixBlend$2.add)
- bone.scaleX += x - bone.data.scaleX;
- else
- bone.scaleX = x;
- } else {
- // Mixing out uses sign of setup or current pose, else use sign of key.
- let bx = 0;
- if (direction == MixDirection$2.mixOut) {
- switch (blend) {
- case MixBlend$2.setup:
- bx = bone.data.scaleX;
- bone.scaleX = bx + (Math.abs(x) * MathUtils.signum(bx) - bx) * alpha;
- break;
- case MixBlend$2.first:
- case MixBlend$2.replace:
- bx = bone.scaleX;
- bone.scaleX = bx + (Math.abs(x) * MathUtils.signum(bx) - bx) * alpha;
- break;
- case MixBlend$2.add:
- bx = bone.scaleX;
- bone.scaleX = bx + (Math.abs(x) * MathUtils.signum(bx) - bone.data.scaleX) * alpha;
- }
- } else {
- switch (blend) {
- case MixBlend$2.setup:
- bx = Math.abs(bone.data.scaleX) * MathUtils.signum(x);
- bone.scaleX = bx + (x - bx) * alpha;
- break;
- case MixBlend$2.first:
- case MixBlend$2.replace:
- bx = Math.abs(bone.scaleX) * MathUtils.signum(x);
- bone.scaleX = bx + (x - bx) * alpha;
- break;
- case MixBlend$2.add:
- bx = MathUtils.signum(x);
- bone.scaleX = Math.abs(bone.scaleX) * bx + (x - Math.abs(bone.data.scaleX) * bx) * alpha;
- }
- }
- }
- }
- }
- /** Changes a bone's local {@link Bone#scaleX)} and {@link Bone#scaleY}.
- * @public
- * */
- class ScaleYTimeline extends CurveTimeline1 {
- __init7() {this.boneIndex = 0;}
- constructor (frameCount, bezierCount, boneIndex) {
- super(frameCount, bezierCount, [
- Property.scaleY + "|" + boneIndex
- ]);ScaleYTimeline.prototype.__init7.call(this); this.boneIndex = boneIndex;
- }
- apply (skeleton, lastTime, time, events, alpha, blend, direction) {
- let frames = this.frames;
- let bone = skeleton.bones[this.boneIndex];
- if (!bone.active) return;
- if (time < frames[0]) {
- switch (blend) {
- case MixBlend$2.setup:
- bone.scaleY = bone.data.scaleY;
- return;
- case MixBlend$2.first:
- bone.scaleY += (bone.data.scaleY - bone.scaleY) * alpha;
- }
- return;
- }
- let y = this.getCurveValue(time) * bone.data.scaleY;
- if (alpha == 1) {
- if (blend == MixBlend$2.add)
- bone.scaleY += y - bone.data.scaleY;
- else
- bone.scaleY = y;
- } else {
- // Mixing out uses sign of setup or current pose, else use sign of key.
- let by = 0;
- if (direction == MixDirection$2.mixOut) {
- switch (blend) {
- case MixBlend$2.setup:
- by = bone.data.scaleY;
- bone.scaleY = by + (Math.abs(y) * MathUtils.signum(by) - by) * alpha;
- break;
- case MixBlend$2.first:
- case MixBlend$2.replace:
- by = bone.scaleY;
- bone.scaleY = by + (Math.abs(y) * MathUtils.signum(by) - by) * alpha;
- break;
- case MixBlend$2.add:
- by = bone.scaleY;
- bone.scaleY = by + (Math.abs(y) * MathUtils.signum(by) - bone.data.scaleY) * alpha;
- }
- } else {
- switch (blend) {
- case MixBlend$2.setup:
- by = Math.abs(bone.data.scaleY) * MathUtils.signum(y);
- bone.scaleY = by + (y - by) * alpha;
- break;
- case MixBlend$2.first:
- case MixBlend$2.replace:
- by = Math.abs(bone.scaleY) * MathUtils.signum(y);
- bone.scaleY = by + (y - by) * alpha;
- break;
- case MixBlend$2.add:
- by = MathUtils.signum(y);
- bone.scaleY = Math.abs(bone.scaleY) * by + (y - Math.abs(bone.data.scaleY) * by) * alpha;
- }
- }
- }
- }
- }
- /** Changes a bone's local {@link Bone#shearX} and {@link Bone#shearY}.
- * @public
- * */
- class ShearTimeline$2 extends CurveTimeline2 {
- __init8() {this.boneIndex = 0;}
- constructor (frameCount, bezierCount, boneIndex) {
- super(frameCount, bezierCount, [
- Property.shearX + "|" + boneIndex,
- Property.shearY + "|" + boneIndex
- ]);ShearTimeline$2.prototype.__init8.call(this); this.boneIndex = boneIndex;
- }
- apply (skeleton, lastTime, time, events, alpha, blend, direction) {
- let frames = this.frames;
- let bone = skeleton.bones[this.boneIndex];
- if (!bone.active) return;
- if (time < frames[0]) {
- switch (blend) {
- case MixBlend$2.setup:
- bone.shearX = bone.data.shearX;
- bone.shearY = bone.data.shearY;
- return;
- case MixBlend$2.first:
- bone.shearX += (bone.data.shearX - bone.shearX) * alpha;
- bone.shearY += (bone.data.shearY - bone.shearY) * alpha;
- }
- return;
- }
- let x = 0, y = 0;
- let i = Animation$2.search2(frames, time, CurveTimeline2.ENTRIES);
- let curveType = this.curves[i / CurveTimeline2.ENTRIES];
- switch (curveType) {
- case CurveTimeline2.LINEAR:
- let before = frames[i];
- x = frames[i + CurveTimeline2.VALUE1];
- y = frames[i + CurveTimeline2.VALUE2];
- let t = (time - before) / (frames[i + CurveTimeline2.ENTRIES] - before);
- x += (frames[i + CurveTimeline2.ENTRIES + CurveTimeline2.VALUE1] - x) * t;
- y += (frames[i + CurveTimeline2.ENTRIES + CurveTimeline2.VALUE2] - y) * t;
- break;
- case CurveTimeline2.STEPPED:
- x = frames[i + CurveTimeline2.VALUE1];
- y = frames[i + CurveTimeline2.VALUE2];
- break;
- default:
- x = this.getBezierValue(time, i, CurveTimeline2.VALUE1, curveType - CurveTimeline2.BEZIER);
- y = this.getBezierValue(time, i, CurveTimeline2.VALUE2, curveType + CurveTimeline2.BEZIER_SIZE - CurveTimeline2.BEZIER);
- }
- switch (blend) {
- case MixBlend$2.setup:
- bone.shearX = bone.data.shearX + x * alpha;
- bone.shearY = bone.data.shearY + y * alpha;
- break;
- case MixBlend$2.first:
- case MixBlend$2.replace:
- bone.shearX += (bone.data.shearX + x - bone.shearX) * alpha;
- bone.shearY += (bone.data.shearY + y - bone.shearY) * alpha;
- break;
- case MixBlend$2.add:
- bone.shearX += x * alpha;
- bone.shearY += y * alpha;
- }
- }
- }
- /** Changes a bone's local {@link Bone#shearX} and {@link Bone#shearY}.
- * @public
- * */
- class ShearXTimeline extends CurveTimeline1 {
- __init9() {this.boneIndex = 0;}
- constructor (frameCount, bezierCount, boneIndex) {
- super(frameCount, bezierCount, [
- Property.shearX + "|" + boneIndex
- ]);ShearXTimeline.prototype.__init9.call(this); this.boneIndex = boneIndex;
- }
- apply (skeleton, lastTime, time, events, alpha, blend, direction) {
- let frames = this.frames;
- let bone = skeleton.bones[this.boneIndex];
- if (!bone.active) return;
- if (time < frames[0]) {
- switch (blend) {
- case MixBlend$2.setup:
- bone.shearX = bone.data.shearX;
- return;
- case MixBlend$2.first:
- bone.shearX += (bone.data.shearX - bone.shearX) * alpha;
- }
- return;
- }
- let x = this.getCurveValue(time);
- switch (blend) {
- case MixBlend$2.setup:
- bone.shearX = bone.data.shearX + x * alpha;
- break;
- case MixBlend$2.first:
- case MixBlend$2.replace:
- bone.shearX += (bone.data.shearX + x - bone.shearX) * alpha;
- break;
- case MixBlend$2.add:
- bone.shearX += x * alpha;
- }
- }
- }
- /** Changes a bone's local {@link Bone#shearX} and {@link Bone#shearY}.
- * @public
- * */
- class ShearYTimeline extends CurveTimeline1 {
- __init10() {this.boneIndex = 0;}
- constructor (frameCount, bezierCount, boneIndex) {
- super(frameCount, bezierCount, [
- Property.shearY + "|" + boneIndex
- ]);ShearYTimeline.prototype.__init10.call(this); this.boneIndex = boneIndex;
- }
- apply (skeleton, lastTime, time, events, alpha, blend, direction) {
- let frames = this.frames;
- let bone = skeleton.bones[this.boneIndex];
- if (!bone.active) return;
- if (time < frames[0]) {
- switch (blend) {
- case MixBlend$2.setup:
- bone.shearY = bone.data.shearY;
- return;
- case MixBlend$2.first:
- bone.shearY += (bone.data.shearY - bone.shearY) * alpha;
- }
- return;
- }
- let y = this.getCurveValue(time);
- switch (blend) {
- case MixBlend$2.setup:
- bone.shearY = bone.data.shearY + y * alpha;
- break;
- case MixBlend$2.first:
- case MixBlend$2.replace:
- bone.shearY += (bone.data.shearY + y - bone.shearY) * alpha;
- break;
- case MixBlend$2.add:
- bone.shearY += y * alpha;
- }
- }
- }
- /** Changes a slot's {@link Slot#color}.
- * @public
- * */
- class RGBATimeline extends CurveTimeline$2 {
- static __initStatic10() {this.ENTRIES = 5;}
- static __initStatic11() {this.R = 1;} static __initStatic12() {this.G = 2;} static __initStatic13() {this.B = 3;} static __initStatic14() {this.A = 4;}
- __init11() {this.slotIndex = 0;}
- constructor (frameCount, bezierCount, slotIndex) {
- super(frameCount, bezierCount, [
- Property.rgb + "|" + slotIndex,
- Property.alpha + "|" + slotIndex
- ]);RGBATimeline.prototype.__init11.call(this); this.slotIndex = slotIndex;
- }
- getFrameEntries () {
- return RGBATimeline.ENTRIES;
- }
- /** Sets the time in seconds, red, green, blue, and alpha for the specified key frame. */
- setFrame (frame, time, r, g, b, a) {
- frame *= RGBATimeline.ENTRIES;
- this.frames[frame] = time;
- this.frames[frame + RGBATimeline.R] = r;
- this.frames[frame + RGBATimeline.G] = g;
- this.frames[frame + RGBATimeline.B] = b;
- this.frames[frame + RGBATimeline.A] = a;
- }
- apply (skeleton, lastTime, time, events, alpha, blend, direction) {
- let slot = skeleton.slots[this.slotIndex];
- if (!slot.bone.active) return;
- let frames = this.frames;
- if (time < frames[0]) {
- let color = slot.color, setup = slot.data.color;
- switch (blend) {
- case MixBlend$2.setup:
- color.setFromColor(slot.data.color);
- return;
- case MixBlend$2.first:
- color.add((setup.r - color.r) * alpha, (setup.g - color.g) * alpha, (setup.b - color.b) * alpha,
- (setup.a - color.a) * alpha);
- }
- return;
- }
- let r = 0, g = 0, b = 0, a = 0;
- let i = Animation$2.search2(frames, time, RGBATimeline.ENTRIES);
- let curveType = this.curves[i / RGBATimeline.ENTRIES];
- switch (curveType) {
- case RGBATimeline.LINEAR:
- let before = frames[i];
- r = frames[i + RGBATimeline.R];
- g = frames[i + RGBATimeline.G];
- b = frames[i + RGBATimeline.B];
- a = frames[i + RGBATimeline.A];
- let t = (time - before) / (frames[i + RGBATimeline.ENTRIES] - before);
- r += (frames[i + RGBATimeline.ENTRIES + RGBATimeline.R] - r) * t;
- g += (frames[i + RGBATimeline.ENTRIES + RGBATimeline.G] - g) * t;
- b += (frames[i + RGBATimeline.ENTRIES + RGBATimeline.B] - b) * t;
- a += (frames[i + RGBATimeline.ENTRIES + RGBATimeline.A] - a) * t;
- break;
- case RGBATimeline.STEPPED:
- r = frames[i + RGBATimeline.R];
- g = frames[i + RGBATimeline.G];
- b = frames[i + RGBATimeline.B];
- a = frames[i + RGBATimeline.A];
- break;
- default:
- r = this.getBezierValue(time, i, RGBATimeline.R, curveType - RGBATimeline.BEZIER);
- g = this.getBezierValue(time, i, RGBATimeline.G, curveType + RGBATimeline.BEZIER_SIZE - RGBATimeline.BEZIER);
- b = this.getBezierValue(time, i, RGBATimeline.B, curveType + RGBATimeline.BEZIER_SIZE * 2 - RGBATimeline.BEZIER);
- a = this.getBezierValue(time, i, RGBATimeline.A, curveType + RGBATimeline.BEZIER_SIZE * 3 - RGBATimeline.BEZIER);
- }
- let color = slot.color;
- if (alpha == 1)
- color.set(r, g, b, a);
- else {
- if (blend == MixBlend$2.setup) color.setFromColor(slot.data.color);
- color.add((r - color.r) * alpha, (g - color.g) * alpha, (b - color.b) * alpha, (a - color.a) * alpha);
- }
- }
- } RGBATimeline.__initStatic10(); RGBATimeline.__initStatic11(); RGBATimeline.__initStatic12(); RGBATimeline.__initStatic13(); RGBATimeline.__initStatic14();
- /** Changes a slot's {@link Slot#color}.
- * @public
- * */
- class RGBTimeline extends CurveTimeline$2 {
- static __initStatic15() {this.ENTRIES = 4;}
- static __initStatic16() {this.R = 1;} static __initStatic17() {this.G = 2;} static __initStatic18() {this.B = 3;}
- __init12() {this.slotIndex = 0;}
- constructor (frameCount, bezierCount, slotIndex) {
- super(frameCount, bezierCount, [
- Property.rgb + "|" + slotIndex
- ]);RGBTimeline.prototype.__init12.call(this); this.slotIndex = slotIndex;
- }
- getFrameEntries () {
- return RGBTimeline.ENTRIES;
- }
- /** Sets the time in seconds, red, green, blue, and alpha for the specified key frame. */
- setFrame (frame, time, r, g, b) {
- frame *= RGBTimeline.ENTRIES;
- this.frames[frame] = time;
- this.frames[frame + RGBTimeline.R] = r;
- this.frames[frame + RGBTimeline.G] = g;
- this.frames[frame + RGBTimeline.B] = b;
- }
- apply (skeleton, lastTime, time, events, alpha, blend, direction) {
- let slot = skeleton.slots[this.slotIndex];
- if (!slot.bone.active) return;
- let frames = this.frames;
- if (time < frames[0]) {
- let color = slot.color, setup = slot.data.color;
- switch (blend) {
- case MixBlend$2.setup:
- color.r = setup.r;
- color.g = setup.g;
- color.b = setup.b;
- return;
- case MixBlend$2.first:
- color.r += (setup.r - color.r) * alpha;
- color.g += (setup.g - color.g) * alpha;
- color.b += (setup.b - color.b) * alpha;
- }
- return;
- }
- let r = 0, g = 0, b = 0;
- let i = Animation$2.search2(frames, time, RGBTimeline.ENTRIES);
- let curveType = this.curves[i / RGBTimeline.ENTRIES];
- switch (curveType) {
- case RGBTimeline.LINEAR:
- let before = frames[i];
- r = frames[i + RGBTimeline.R];
- g = frames[i + RGBTimeline.G];
- b = frames[i + RGBTimeline.B];
- let t = (time - before) / (frames[i + RGBTimeline.ENTRIES] - before);
- r += (frames[i + RGBTimeline.ENTRIES + RGBTimeline.R] - r) * t;
- g += (frames[i + RGBTimeline.ENTRIES + RGBTimeline.G] - g) * t;
- b += (frames[i + RGBTimeline.ENTRIES + RGBTimeline.B] - b) * t;
- break;
- case RGBATimeline.STEPPED:
- r = frames[i + RGBTimeline.R];
- g = frames[i + RGBTimeline.G];
- b = frames[i + RGBTimeline.B];
- break;
- default:
- r = this.getBezierValue(time, i, RGBTimeline.R, curveType - RGBTimeline.BEZIER);
- g = this.getBezierValue(time, i, RGBTimeline.G, curveType + RGBTimeline.BEZIER_SIZE - RGBTimeline.BEZIER);
- b = this.getBezierValue(time, i, RGBTimeline.B, curveType + RGBTimeline.BEZIER_SIZE * 2 - RGBTimeline.BEZIER);
- }
- let color = slot.color;
- if (alpha == 1) {
- color.r = r;
- color.g = g;
- color.b = b;
- } else {
- if (blend == MixBlend$2.setup) {
- let setup = slot.data.color;
- color.r = setup.r;
- color.g = setup.g;
- color.b = setup.b;
- }
- color.r += (r - color.r) * alpha;
- color.g += (g - color.g) * alpha;
- color.b += (b - color.b) * alpha;
- }
- }
- } RGBTimeline.__initStatic15(); RGBTimeline.__initStatic16(); RGBTimeline.__initStatic17(); RGBTimeline.__initStatic18();
- /** Changes a bone's local {@link Bone#shearX} and {@link Bone#shearY}.
- * @public
- * */
- class AlphaTimeline extends CurveTimeline1 {
- __init13() {this.slotIndex = 0;}
- constructor (frameCount, bezierCount, slotIndex) {
- super(frameCount, bezierCount, [
- Property.alpha + "|" + slotIndex
- ]);AlphaTimeline.prototype.__init13.call(this); this.slotIndex = slotIndex;
- }
- apply (skeleton, lastTime, time, events, alpha, blend, direction) {
- let frames = this.frames;
- let slot = skeleton.slots[this.slotIndex];
- if (!slot.bone.active) return;
- if (time < frames[0]) { // Time is before first frame.
- let color = slot.color, setup = slot.data.color;
- switch (blend) {
- case MixBlend$2.setup:
- color.a = setup.a;
- return;
- case MixBlend$2.first:
- color.a += (setup.a - color.a) * alpha;
- }
- return;
- }
- let a = this.getCurveValue(time);
- if (alpha == 1)
- slot.color.a = a;
- else {
- if (blend == MixBlend$2.setup) slot.color.a = slot.data.color.a;
- slot.color.a += (a - slot.color.a) * alpha;
- }
- }
- }
- /** Changes a slot's {@link Slot#color} and {@link Slot#darkColor} for two color tinting.
- * @public
- * */
- class RGBA2Timeline extends CurveTimeline$2 {
- static __initStatic19() {this.ENTRIES = 8;}
- static __initStatic20() {this.R = 1;} static __initStatic21() {this.G = 2;} static __initStatic22() {this.B = 3;} static __initStatic23() {this.A = 4;} static __initStatic24() {this.R2 = 5;} static __initStatic25() {this.G2 = 6;} static __initStatic26() {this.B2 = 7;}
- __init14() {this.slotIndex = 0;}
- constructor (frameCount, bezierCount, slotIndex) {
- super(frameCount, bezierCount, [
- Property.rgb + "|" + slotIndex,
- Property.alpha + "|" + slotIndex,
- Property.rgb2 + "|" + slotIndex
- ]);RGBA2Timeline.prototype.__init14.call(this); this.slotIndex = slotIndex;
- }
- getFrameEntries () {
- return RGBA2Timeline.ENTRIES;
- }
- /** Sets the time in seconds, light, and dark colors for the specified key frame. */
- setFrame (frame, time, r, g, b, a, r2, g2, b2) {
- frame *= RGBA2Timeline.ENTRIES;
- this.frames[frame] = time;
- this.frames[frame + RGBA2Timeline.R] = r;
- this.frames[frame + RGBA2Timeline.G] = g;
- this.frames[frame + RGBA2Timeline.B] = b;
- this.frames[frame + RGBA2Timeline.A] = a;
- this.frames[frame + RGBA2Timeline.R2] = r2;
- this.frames[frame + RGBA2Timeline.G2] = g2;
- this.frames[frame + RGBA2Timeline.B2] = b2;
- }
- apply (skeleton, lastTime, time, events, alpha, blend, direction) {
- let slot = skeleton.slots[this.slotIndex];
- if (!slot.bone.active) return;
- let frames = this.frames;
- if (time < frames[0]) {
- let light = slot.color, dark = slot.darkColor, setupLight = slot.data.color, setupDark = slot.data.darkColor;
- switch (blend) {
- case MixBlend$2.setup:
- light.setFromColor(setupLight);
- dark.r = setupDark.r;
- dark.g = setupDark.g;
- dark.b = setupDark.b;
- return;
- case MixBlend$2.first:
- light.add((setupLight.r - light.r) * alpha, (setupLight.g - light.g) * alpha, (setupLight.b - light.b) * alpha,
- (setupLight.a - light.a) * alpha);
- dark.r += (setupDark.r - dark.r) * alpha;
- dark.g += (setupDark.g - dark.g) * alpha;
- dark.b += (setupDark.b - dark.b) * alpha;
- }
- return;
- }
- let r = 0, g = 0, b = 0, a = 0, r2 = 0, g2 = 0, b2 = 0;
- let i = Animation$2.search2(frames, time, RGBA2Timeline.ENTRIES);
- let curveType = this.curves[i >> 3];
- switch (curveType) {
- case RGBA2Timeline.LINEAR:
- let before = frames[i];
- r = frames[i + RGBA2Timeline.R];
- g = frames[i + RGBA2Timeline.G];
- b = frames[i + RGBA2Timeline.B];
- a = frames[i + RGBA2Timeline.A];
- r2 = frames[i + RGBA2Timeline.R2];
- g2 = frames[i + RGBA2Timeline.G2];
- b2 = frames[i + RGBA2Timeline.B2];
- let t = (time - before) / (frames[i + RGBA2Timeline.ENTRIES] - before);
- r += (frames[i + RGBA2Timeline.ENTRIES + RGBA2Timeline.R] - r) * t;
- g += (frames[i + RGBA2Timeline.ENTRIES + RGBA2Timeline.G] - g) * t;
- b += (frames[i + RGBA2Timeline.ENTRIES + RGBA2Timeline.B] - b) * t;
- a += (frames[i + RGBA2Timeline.ENTRIES + RGBA2Timeline.A] - a) * t;
- r2 += (frames[i + RGBA2Timeline.ENTRIES + RGBA2Timeline.R2] - r2) * t;
- g2 += (frames[i + RGBA2Timeline.ENTRIES + RGBA2Timeline.G2] - g2) * t;
- b2 += (frames[i + RGBA2Timeline.ENTRIES + RGBA2Timeline.B2] - b2) * t;
- break;
- case RGBA2Timeline.STEPPED:
- r = frames[i + RGBA2Timeline.R];
- g = frames[i + RGBA2Timeline.G];
- b = frames[i + RGBA2Timeline.B];
- a = frames[i + RGBA2Timeline.A];
- r2 = frames[i + RGBA2Timeline.R2];
- g2 = frames[i + RGBA2Timeline.G2];
- b2 = frames[i + RGBA2Timeline.B2];
- break;
- default:
- r = this.getBezierValue(time, i, RGBA2Timeline.R, curveType - RGBA2Timeline.BEZIER);
- g = this.getBezierValue(time, i, RGBA2Timeline.G, curveType + RGBA2Timeline.BEZIER_SIZE - RGBA2Timeline.BEZIER);
- b = this.getBezierValue(time, i, RGBA2Timeline.B, curveType + RGBA2Timeline.BEZIER_SIZE * 2 - RGBA2Timeline.BEZIER);
- a = this.getBezierValue(time, i, RGBA2Timeline.A, curveType + RGBA2Timeline.BEZIER_SIZE * 3 - RGBA2Timeline.BEZIER);
- r2 = this.getBezierValue(time, i, RGBA2Timeline.R2, curveType + RGBA2Timeline.BEZIER_SIZE * 4 - RGBA2Timeline.BEZIER);
- g2 = this.getBezierValue(time, i, RGBA2Timeline.G2, curveType + RGBA2Timeline.BEZIER_SIZE * 5 - RGBA2Timeline.BEZIER);
- b2 = this.getBezierValue(time, i, RGBA2Timeline.B2, curveType + RGBA2Timeline.BEZIER_SIZE * 6 - RGBA2Timeline.BEZIER);
- }
- let light = slot.color, dark = slot.darkColor;
- if (alpha == 1) {
- light.set(r, g, b, a);
- dark.r = r2;
- dark.g = g2;
- dark.b = b2;
- } else {
- if (blend == MixBlend$2.setup) {
- light.setFromColor(slot.data.color);
- dark.setFromColor(slot.data.darkColor);
- }
- light.add((r - light.r) * alpha, (g - light.g) * alpha, (b - light.b) * alpha, (a - light.a) * alpha);
- dark.r += (r2 - dark.r) * alpha;
- dark.g += (g2 - dark.g) * alpha;
- dark.b += (b2 - dark.b) * alpha;
- }
- }
- } RGBA2Timeline.__initStatic19(); RGBA2Timeline.__initStatic20(); RGBA2Timeline.__initStatic21(); RGBA2Timeline.__initStatic22(); RGBA2Timeline.__initStatic23(); RGBA2Timeline.__initStatic24(); RGBA2Timeline.__initStatic25(); RGBA2Timeline.__initStatic26();
- /** Changes a slot's {@link Slot#color} and {@link Slot#darkColor} for two color tinting.
- * @public
- * */
- class RGB2Timeline extends CurveTimeline$2 {
- static __initStatic27() {this.ENTRIES = 7;}
- static __initStatic28() {this.R = 1;} static __initStatic29() {this.G = 2;} static __initStatic30() {this.B = 3;} static __initStatic31() {this.R2 = 4;} static __initStatic32() {this.G2 = 5;} static __initStatic33() {this.B2 = 6;}
- __init15() {this.slotIndex = 0;}
- constructor (frameCount, bezierCount, slotIndex) {
- super(frameCount, bezierCount, [
- Property.rgb + "|" + slotIndex,
- Property.rgb2 + "|" + slotIndex
- ]);RGB2Timeline.prototype.__init15.call(this); this.slotIndex = slotIndex;
- }
- getFrameEntries () {
- return RGB2Timeline.ENTRIES;
- }
- /** Sets the time in seconds, light, and dark colors for the specified key frame. */
- setFrame (frame, time, r, g, b, r2, g2, b2) {
- frame *= RGB2Timeline.ENTRIES;
- this.frames[frame] = time;
- this.frames[frame + RGB2Timeline.R] = r;
- this.frames[frame + RGB2Timeline.G] = g;
- this.frames[frame + RGB2Timeline.B] = b;
- this.frames[frame + RGB2Timeline.R2] = r2;
- this.frames[frame + RGB2Timeline.G2] = g2;
- this.frames[frame + RGB2Timeline.B2] = b2;
- }
- apply (skeleton, lastTime, time, events, alpha, blend, direction) {
- let slot = skeleton.slots[this.slotIndex];
- if (!slot.bone.active) return;
- let frames = this.frames;
- if (time < frames[0]) {
- let light = slot.color, dark = slot.darkColor, setupLight = slot.data.color, setupDark = slot.data.darkColor;
- switch (blend) {
- case MixBlend$2.setup:
- light.r = setupLight.r;
- light.g = setupLight.g;
- light.b = setupLight.b;
- dark.r = setupDark.r;
- dark.g = setupDark.g;
- dark.b = setupDark.b;
- return;
- case MixBlend$2.first:
- light.r += (setupLight.r - light.r) * alpha;
- light.g += (setupLight.g - light.g) * alpha;
- light.b += (setupLight.b - light.b) * alpha;
- dark.r += (setupDark.r - dark.r) * alpha;
- dark.g += (setupDark.g - dark.g) * alpha;
- dark.b += (setupDark.b - dark.b) * alpha;
- }
- return;
- }
- // @ts-ignore
- let r = 0, g = 0, b = 0, r2 = 0, g2 = 0, b2 = 0;
- let i = Animation$2.search2(frames, time, RGB2Timeline.ENTRIES);
- let curveType = this.curves[i >> 3];
- switch (curveType) {
- case RGB2Timeline.LINEAR:
- let before = frames[i];
- r = frames[i + RGB2Timeline.R];
- g = frames[i + RGB2Timeline.G];
- b = frames[i + RGB2Timeline.B];
- r2 = frames[i + RGB2Timeline.R2];
- g2 = frames[i + RGB2Timeline.G2];
- b2 = frames[i + RGB2Timeline.B2];
- let t = (time - before) / (frames[i + RGB2Timeline.ENTRIES] - before);
- r += (frames[i + RGB2Timeline.ENTRIES + RGB2Timeline.R] - r) * t;
- g += (frames[i + RGB2Timeline.ENTRIES + RGB2Timeline.G] - g) * t;
- b += (frames[i + RGB2Timeline.ENTRIES + RGB2Timeline.B] - b) * t;
- r2 += (frames[i + RGB2Timeline.ENTRIES + RGB2Timeline.R2] - r2) * t;
- g2 += (frames[i + RGB2Timeline.ENTRIES + RGB2Timeline.G2] - g2) * t;
- b2 += (frames[i + RGB2Timeline.ENTRIES + RGB2Timeline.B2] - b2) * t;
- break;
- case RGB2Timeline.STEPPED:
- r = frames[i + RGB2Timeline.R];
- g = frames[i + RGB2Timeline.G];
- b = frames[i + RGB2Timeline.B];
- r2 = frames[i + RGB2Timeline.R2];
- g2 = frames[i + RGB2Timeline.G2];
- b2 = frames[i + RGB2Timeline.B2];
- break;
- default:
- r = this.getBezierValue(time, i, RGB2Timeline.R, curveType - RGB2Timeline.BEZIER);
- g = this.getBezierValue(time, i, RGB2Timeline.G, curveType + RGB2Timeline.BEZIER_SIZE - RGB2Timeline.BEZIER);
- b = this.getBezierValue(time, i, RGB2Timeline.B, curveType + RGB2Timeline.BEZIER_SIZE * 2 - RGB2Timeline.BEZIER);
- r2 = this.getBezierValue(time, i, RGB2Timeline.R2, curveType + RGB2Timeline.BEZIER_SIZE * 3 - RGB2Timeline.BEZIER);
- g2 = this.getBezierValue(time, i, RGB2Timeline.G2, curveType + RGB2Timeline.BEZIER_SIZE * 4 - RGB2Timeline.BEZIER);
- b2 = this.getBezierValue(time, i, RGB2Timeline.B2, curveType + RGB2Timeline.BEZIER_SIZE * 5 - RGB2Timeline.BEZIER);
- }
- let light = slot.color, dark = slot.darkColor;
- if (alpha == 1) {
- light.r = r;
- light.g = g;
- light.b = b;
- dark.r = r2;
- dark.g = g2;
- dark.b = b2;
- } else {
- if (blend == MixBlend$2.setup) {
- let setupLight = slot.data.color, setupDark = slot.data.darkColor;
- light.r = setupLight.r;
- light.g = setupLight.g;
- light.b = setupLight.b;
- dark.r = setupDark.r;
- dark.g = setupDark.g;
- dark.b = setupDark.b;
- }
- light.r += (r - light.r) * alpha;
- light.g += (g - light.g) * alpha;
- light.b += (b - light.b) * alpha;
- dark.r += (r2 - dark.r) * alpha;
- dark.g += (g2 - dark.g) * alpha;
- dark.b += (b2 - dark.b) * alpha;
- }
- }
- } RGB2Timeline.__initStatic27(); RGB2Timeline.__initStatic28(); RGB2Timeline.__initStatic29(); RGB2Timeline.__initStatic30(); RGB2Timeline.__initStatic31(); RGB2Timeline.__initStatic32(); RGB2Timeline.__initStatic33();
- /** Changes a slot's {@link Slot#attachment}.
- * @public
- * */
- class AttachmentTimeline$2 extends Timeline {
- __init16() {this.slotIndex = 0;}
- /** The attachment name for each key frame. May contain null values to clear the attachment. */
-
- constructor (frameCount, slotIndex) {
- super(frameCount, [
- Property.attachment + "|" + slotIndex
- ]);AttachmentTimeline$2.prototype.__init16.call(this); this.slotIndex = slotIndex;
- this.attachmentNames = new Array(frameCount);
- }
- getFrameEntries () {
- return 1;
- }
- /** The number of key frames for this timeline. */
- getFrameCount () {
- return this.frames.length;
- }
- /** Sets the time in seconds and the attachment name for the specified key frame. */
- setFrame (frame, time, attachmentName) {
- this.frames[frame] = time;
- this.attachmentNames[frame] = attachmentName;
- }
- apply (skeleton, lastTime, time, events, alpha, blend, direction) {
- let slot = skeleton.slots[this.slotIndex];
- if (!slot.bone.active) return;
- if (direction == MixDirection$2.mixOut) {
- if (blend == MixBlend$2.setup)
- this.setAttachment(skeleton, slot, slot.data.attachmentName);
- return;
- }
- let frames = this.frames;
- if (time < frames[0]) {
- if (blend == MixBlend$2.setup || blend == MixBlend$2.first) this.setAttachment(skeleton, slot, slot.data.attachmentName);
- return;
- }
- this.setAttachment(skeleton, slot, this.attachmentNames[Animation$2.search(frames, time)]);
- }
- setAttachment(skeleton, slot, attachmentName) {
- slot.setAttachment(attachmentName == null ? null : skeleton.getAttachment(this.slotIndex, attachmentName));
- }
- }
- let zeros$2 = null;
- /** Changes a slot's {@link Slot#deform} to deform a {@link VertexAttachment}.
- * @public
- * */
- class DeformTimeline$2 extends CurveTimeline$2 {
- __init17() {this.slotIndex = 0;}
- /** The attachment that will be deformed. */
-
- /** The vertices for each key frame. */
-
- constructor (frameCount, bezierCount, slotIndex, attachment) {
- super(frameCount, bezierCount, [
- Property.deform + "|" + slotIndex + "|" + attachment.id
- ]);DeformTimeline$2.prototype.__init17.call(this); this.slotIndex = slotIndex;
- this.attachment = attachment;
- this.vertices = new Array(frameCount);
- if (zeros$2 == null) zeros$2 = Utils.newFloatArray(64);
- }
- getFrameEntries () {
- return 1;
- }
- /** Sets the time in seconds and the vertices for the specified key frame.
- * @param vertices Vertex positions for an unweighted VertexAttachment, or deform offsets if it has weights. */
- setFrame (frame, time, vertices) {
- this.frames[frame] = time;
- this.vertices[frame] = vertices;
- }
- /** @param value1 Ignored (0 is used for a deform timeline).
- * @param value2 Ignored (1 is used for a deform timeline). */
- setBezier (bezier, frame, value, time1, value1, cx1, cy1, cx2,
- cy2, time2, value2) {
- let curves = this.curves;
- let i = this.getFrameCount() + bezier * DeformTimeline$2.BEZIER_SIZE;
- if (value == 0) curves[frame] = DeformTimeline$2.BEZIER + i;
- let tmpx = (time1 - cx1 * 2 + cx2) * 0.03, tmpy = cy2 * 0.03 - cy1 * 0.06;
- let dddx = ((cx1 - cx2) * 3 - time1 + time2) * 0.006, dddy = (cy1 - cy2 + 0.33333333) * 0.018;
- let ddx = tmpx * 2 + dddx, ddy = tmpy * 2 + dddy;
- let dx = (cx1 - time1) * 0.3 + tmpx + dddx * 0.16666667, dy = cy1 * 0.3 + tmpy + dddy * 0.16666667;
- let x = time1 + dx, y = dy;
- for (let n = i + DeformTimeline$2.BEZIER_SIZE; i < n; i += 2) {
- curves[i] = x;
- curves[i + 1] = y;
- dx += ddx;
- dy += ddy;
- ddx += dddx;
- ddy += dddy;
- x += dx;
- y += dy;
- }
- }
- getCurvePercent (time, frame) {
- let curves = this.curves;
- let frames = this.frames;
- let i = curves[frame];
- switch (i) {
- case DeformTimeline$2.LINEAR:
- let x = frames[frame];
- return (time - x) / (frames[frame + this.getFrameEntries()] - x);
- case DeformTimeline$2.STEPPED:
- return 0;
- }
- i -= DeformTimeline$2.BEZIER;
- if (curves[i] > time) {
- let x = frames[frame];
- return curves[i + 1] * (time - x) / (curves[i] - x);
- }
- let n = i + DeformTimeline$2.BEZIER_SIZE;
- for (i += 2; i < n; i += 2) {
- if (curves[i] >= time) {
- let x = curves[i - 2], y = curves[i - 1];
- return y + (time - x) / (curves[i] - x) * (curves[i + 1] - y);
- }
- }
- let x = curves[n - 2], y = curves[n - 1];
- return y + (1 - y) * (time - x) / (frames[frame + this.getFrameEntries()] - x);
- }
- apply (skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
- let slot = skeleton.slots[this.slotIndex];
- if (!slot.bone.active) return;
- let slotAttachment = slot.getAttachment();
- if (!(slotAttachment instanceof VertexAttachment$2) || !((slotAttachment).deformAttachment == this.attachment)) return;
- let deformArray = slot.deform;
- if (deformArray.length == 0) blend = MixBlend$2.setup;
- let vertices = this.vertices;
- let vertexCount = vertices[0].length;
- let frames = this.frames;
- if (time < frames[0]) {
- let vertexAttachment = slotAttachment;
- switch (blend) {
- case MixBlend$2.setup:
- deformArray.length = 0;
- return;
- case MixBlend$2.first:
- if (alpha == 1) {
- deformArray.length = 0;
- break;
- }
- let deform = Utils.setArraySize(deformArray, vertexCount);
- if (vertexAttachment.bones == null) {
- // Unweighted vertex positions.
- let setupVertices = vertexAttachment.vertices;
- for (var i = 0; i < vertexCount; i++)
- deform[i] += (setupVertices[i] - deform[i]) * alpha;
- } else {
- // Weighted deform offsets.
- alpha = 1 - alpha;
- for (var i = 0; i < vertexCount; i++)
- deform[i] *= alpha;
- }
- }
- return;
- }
- let deform = Utils.setArraySize(deformArray, vertexCount);
- if (time >= frames[frames.length - 1]) { // Time is after last frame.
- let lastVertices = vertices[frames.length - 1];
- if (alpha == 1) {
- if (blend == MixBlend$2.add) {
- let vertexAttachment = slotAttachment ;
- if (vertexAttachment.bones == null) {
- // Unweighted vertex positions, with alpha.
- let setupVertices = vertexAttachment.vertices;
- for (let i = 0; i < vertexCount; i++) {
- deform[i] += lastVertices[i] - setupVertices[i];
- }
- } else {
- // Weighted deform offsets, with alpha.
- for (let i = 0; i < vertexCount; i++)
- deform[i] += lastVertices[i];
- }
- } else {
- Utils.arrayCopy(lastVertices, 0, deform, 0, vertexCount);
- }
- } else {
- switch (blend) {
- case MixBlend$2.setup: {
- let vertexAttachment = slotAttachment ;
- if (vertexAttachment.bones == null) {
- // Unweighted vertex positions, with alpha.
- let setupVertices = vertexAttachment.vertices;
- for (let i = 0; i < vertexCount; i++) {
- let setup = setupVertices[i];
- deform[i] = setup + (lastVertices[i] - setup) * alpha;
- }
- } else {
- // Weighted deform offsets, with alpha.
- for (let i = 0; i < vertexCount; i++)
- deform[i] = lastVertices[i] * alpha;
- }
- break;
- }
- case MixBlend$2.first:
- case MixBlend$2.replace:
- for (let i = 0; i < vertexCount; i++)
- deform[i] += (lastVertices[i] - deform[i]) * alpha;
- break;
- case MixBlend$2.add:
- let vertexAttachment = slotAttachment ;
- if (vertexAttachment.bones == null) {
- // Unweighted vertex positions, with alpha.
- let setupVertices = vertexAttachment.vertices;
- for (let i = 0; i < vertexCount; i++) {
- deform[i] += (lastVertices[i] - setupVertices[i]) * alpha;
- }
- } else {
- // Weighted deform offsets, with alpha.
- for (let i = 0; i < vertexCount; i++)
- deform[i] += lastVertices[i] * alpha;
- }
- }
- }
- return;
- }
- // Interpolate between the previous frame and the current frame.
- let frame = Animation$2.search(frames, time);
- let percent = this.getCurvePercent(time, frame);
- let prevVertices = vertices[frame];
- let nextVertices = vertices[frame + 1];
- if (alpha == 1) {
- if (blend == MixBlend$2.add) {
- let vertexAttachment = slotAttachment ;
- if (vertexAttachment.bones == null) {
- // Unweighted vertex positions, with alpha.
- let setupVertices = vertexAttachment.vertices;
- for (let i = 0; i < vertexCount; i++) {
- let prev = prevVertices[i];
- deform[i] += prev + (nextVertices[i] - prev) * percent - setupVertices[i];
- }
- } else {
- // Weighted deform offsets, with alpha.
- for (let i = 0; i < vertexCount; i++) {
- let prev = prevVertices[i];
- deform[i] += prev + (nextVertices[i] - prev) * percent;
- }
- }
- } else {
- for (let i = 0; i < vertexCount; i++) {
- let prev = prevVertices[i];
- deform[i] = prev + (nextVertices[i] - prev) * percent;
- }
- }
- } else {
- switch (blend) {
- case MixBlend$2.setup: {
- let vertexAttachment = slotAttachment ;
- if (vertexAttachment.bones == null) {
- // Unweighted vertex positions, with alpha.
- let setupVertices = vertexAttachment.vertices;
- for (let i = 0; i < vertexCount; i++) {
- let prev = prevVertices[i], setup = setupVertices[i];
- deform[i] = setup + (prev + (nextVertices[i] - prev) * percent - setup) * alpha;
- }
- } else {
- // Weighted deform offsets, with alpha.
- for (let i = 0; i < vertexCount; i++) {
- let prev = prevVertices[i];
- deform[i] = (prev + (nextVertices[i] - prev) * percent) * alpha;
- }
- }
- break;
- }
- case MixBlend$2.first:
- case MixBlend$2.replace:
- for (let i = 0; i < vertexCount; i++) {
- let prev = prevVertices[i];
- deform[i] += (prev + (nextVertices[i] - prev) * percent - deform[i]) * alpha;
- }
- break;
- case MixBlend$2.add:
- let vertexAttachment = slotAttachment ;
- if (vertexAttachment.bones == null) {
- // Unweighted vertex positions, with alpha.
- let setupVertices = vertexAttachment.vertices;
- for (let i = 0; i < vertexCount; i++) {
- let prev = prevVertices[i];
- deform[i] += (prev + (nextVertices[i] - prev) * percent - setupVertices[i]) * alpha;
- }
- } else {
- // Weighted deform offsets, with alpha.
- for (let i = 0; i < vertexCount; i++) {
- let prev = prevVertices[i];
- deform[i] += (prev + (nextVertices[i] - prev) * percent) * alpha;
- }
- }
- }
- }
- }
- }
- /** Fires an {@link Event} when specific animation times are reached.
- * @public
- * */
- class EventTimeline$2 extends Timeline {
- static __initStatic34() {this.propertyIds = [ "" + Property.event ];}
- /** The event for each key frame. */
-
- constructor (frameCount) {
- super(frameCount, EventTimeline$2.propertyIds);
- this.events = new Array(frameCount);
- }
- getFrameEntries () {
- return 1;
- }
- /** Sets the time in seconds and the event for the specified key frame. */
- setFrame (frame, event) {
- this.frames[frame] = event.time;
- this.events[frame] = event;
- }
- /** Fires events for frames > `lastTime` and <= `time`. */
- apply (skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
- if (firedEvents == null) return;
- let frames = this.frames;
- let frameCount = this.frames.length;
- if (lastTime > time) { // Fire events after last time for looped animations.
- this.apply(skeleton, lastTime, Number.MAX_VALUE, firedEvents, alpha, blend, direction);
- lastTime = -1;
- } else if (lastTime >= frames[frameCount - 1]) // Last time is after last frame.
- return;
- if (time < frames[0]) return; // Time is before first frame.
- let i = 0;
- if (lastTime < frames[0])
- i = 0;
- else {
- i = Animation$2.search(frames, lastTime) + 1;
- let frameTime = frames[i];
- while (i > 0) { // Fire multiple events with the same frame.
- if (frames[i - 1] != frameTime) break;
- i--;
- }
- }
- for (; i < frameCount && time >= frames[i]; i++)
- firedEvents.push(this.events[i]);
- }
- } EventTimeline$2.__initStatic34();
- /** Changes a skeleton's {@link Skeleton#drawOrder}.
- * @public
- * */
- class DrawOrderTimeline$2 extends Timeline {
- static __initStatic35() {this.propertyIds = [ "" + Property.drawOrder ];}
- /** The draw order for each key frame. See {@link #setFrame(int, float, int[])}. */
-
- constructor (frameCount) {
- super(frameCount, DrawOrderTimeline$2.propertyIds);
- this.drawOrders = new Array(frameCount);
- }
- getFrameEntries () {
- return 1;
- }
- /** Sets the time in seconds and the draw order for the specified key frame.
- * @param drawOrder For each slot in {@link Skeleton#slots}, the index of the new draw order. May be null to use setup pose
- * draw order. */
- setFrame (frame, time, drawOrder) {
- this.frames[frame] = time;
- this.drawOrders[frame] = drawOrder;
- }
- apply (skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
- let drawOrder = skeleton.drawOrder;
- let slots = skeleton.slots;
- if (direction == MixDirection$2.mixOut) {
- if (blend == MixBlend$2.setup) Utils.arrayCopy(skeleton.slots, 0, skeleton.drawOrder, 0, skeleton.slots.length);
- return;
- }
- let frames = this.frames;
- if (time < frames[0]) {
- if (blend == MixBlend$2.setup || blend == MixBlend$2.first) Utils.arrayCopy(skeleton.slots, 0, drawOrder, 0, skeleton.slots.length);
- return;
- }
- let drawOrderToSetupIndex = this.drawOrders[Animation$2.search(frames, time)];
- if (drawOrderToSetupIndex == null)
- Utils.arrayCopy(slots, 0, drawOrder, 0, slots.length);
- else {
- for (let i = 0, n = drawOrderToSetupIndex.length; i < n; i++)
- drawOrder[i] = slots[drawOrderToSetupIndex[i]];
- }
- }
- } DrawOrderTimeline$2.__initStatic35();
- /** Changes an IK constraint's {@link IkConstraint#mix}, {@link IkConstraint#softness},
- * {@link IkConstraint#bendDirection}, {@link IkConstraint#stretch}, and {@link IkConstraint#compress}.
- * @public
- * */
- class IkConstraintTimeline$2 extends CurveTimeline$2 {
- static __initStatic36() {this.ENTRIES = 6;}
- static __initStatic37() {this.MIX = 1;} static __initStatic38() {this.SOFTNESS = 2;} static __initStatic39() {this.BEND_DIRECTION = 3;} static __initStatic40() {this.COMPRESS = 4;} static __initStatic41() {this.STRETCH = 5;}
- /** The index of the IK constraint slot in {@link Skeleton#ikConstraints} that will be changed. */
-
- constructor (frameCount, bezierCount, ikConstraintIndex) {
- super(frameCount, bezierCount, [
- Property.ikConstraint + "|" + ikConstraintIndex
- ]);
- this.ikConstraintIndex = ikConstraintIndex;
- }
- getFrameEntries () {
- return IkConstraintTimeline$2.ENTRIES;
- }
- /** Sets the time in seconds, mix, softness, bend direction, compress, and stretch for the specified key frame. */
- setFrame (frame, time, mix, softness, bendDirection, compress, stretch) {
- frame *= IkConstraintTimeline$2.ENTRIES;
- this.frames[frame] = time;
- this.frames[frame + IkConstraintTimeline$2.MIX] = mix;
- this.frames[frame + IkConstraintTimeline$2.SOFTNESS] = softness;
- this.frames[frame + IkConstraintTimeline$2.BEND_DIRECTION] = bendDirection;
- this.frames[frame + IkConstraintTimeline$2.COMPRESS] = compress ? 1 : 0;
- this.frames[frame + IkConstraintTimeline$2.STRETCH] = stretch ? 1 : 0;
- }
- apply (skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
- let frames = this.frames;
- let constraint = skeleton.ikConstraints[this.ikConstraintIndex];
- if (!constraint.active) return;
- if (time < frames[0]) {
- switch (blend) {
- case MixBlend$2.setup:
- constraint.mix = constraint.data.mix;
- constraint.softness = constraint.data.softness;
- constraint.bendDirection = constraint.data.bendDirection;
- constraint.compress = constraint.data.compress;
- constraint.stretch = constraint.data.stretch;
- return;
- case MixBlend$2.first:
- constraint.mix += (constraint.data.mix - constraint.mix) * alpha;
- constraint.softness += (constraint.data.softness - constraint.softness) * alpha;
- constraint.bendDirection = constraint.data.bendDirection;
- constraint.compress = constraint.data.compress;
- constraint.stretch = constraint.data.stretch;
- }
- return;
- }
- let mix = 0, softness = 0;
- let i = Animation$2.search2(frames, time, IkConstraintTimeline$2.ENTRIES);
- let curveType = this.curves[i / IkConstraintTimeline$2.ENTRIES];
- switch (curveType) {
- case IkConstraintTimeline$2.LINEAR:
- let before = frames[i];
- mix = frames[i + IkConstraintTimeline$2.MIX];
- softness = frames[i + IkConstraintTimeline$2.SOFTNESS];
- let t = (time - before) / (frames[i + IkConstraintTimeline$2.ENTRIES] - before);
- mix += (frames[i + IkConstraintTimeline$2.ENTRIES + IkConstraintTimeline$2.MIX] - mix) * t;
- softness += (frames[i + IkConstraintTimeline$2.ENTRIES + IkConstraintTimeline$2.SOFTNESS] - softness) * t;
- break;
- case IkConstraintTimeline$2.STEPPED:
- mix = frames[i + IkConstraintTimeline$2.MIX];
- softness = frames[i + IkConstraintTimeline$2.SOFTNESS];
- break;
- default:
- mix = this.getBezierValue(time, i, IkConstraintTimeline$2.MIX, curveType - IkConstraintTimeline$2.BEZIER);
- softness = this.getBezierValue(time, i, IkConstraintTimeline$2.SOFTNESS, curveType + IkConstraintTimeline$2.BEZIER_SIZE - IkConstraintTimeline$2.BEZIER);
- }
- if (blend == MixBlend$2.setup) {
- constraint.mix = constraint.data.mix + (mix - constraint.data.mix) * alpha;
- constraint.softness = constraint.data.softness + (softness - constraint.data.softness) * alpha;
- if (direction == MixDirection$2.mixOut) {
- constraint.bendDirection = constraint.data.bendDirection;
- constraint.compress = constraint.data.compress;
- constraint.stretch = constraint.data.stretch;
- } else {
- constraint.bendDirection = frames[i + IkConstraintTimeline$2.BEND_DIRECTION];
- constraint.compress = frames[i + IkConstraintTimeline$2.COMPRESS] != 0;
- constraint.stretch = frames[i + IkConstraintTimeline$2.STRETCH] != 0;
- }
- } else {
- constraint.mix += (mix - constraint.mix) * alpha;
- constraint.softness += (softness - constraint.softness) * alpha;
- if (direction == MixDirection$2.mixIn) {
- constraint.bendDirection = frames[i + IkConstraintTimeline$2.BEND_DIRECTION];
- constraint.compress = frames[i + IkConstraintTimeline$2.COMPRESS] != 0;
- constraint.stretch = frames[i + IkConstraintTimeline$2.STRETCH] != 0;
- }
- }
- }
- } IkConstraintTimeline$2.__initStatic36(); IkConstraintTimeline$2.__initStatic37(); IkConstraintTimeline$2.__initStatic38(); IkConstraintTimeline$2.__initStatic39(); IkConstraintTimeline$2.__initStatic40(); IkConstraintTimeline$2.__initStatic41();
- /** Changes a transform constraint's {@link TransformConstraint#rotateMix}, {@link TransformConstraint#translateMix},
- * {@link TransformConstraint#scaleMix}, and {@link TransformConstraint#shearMix}.
- * @public
- * */
- class TransformConstraintTimeline$2 extends CurveTimeline$2 {
- static __initStatic42() {this.ENTRIES = 7;}
- static __initStatic43() {this.ROTATE = 1;} static __initStatic44() {this.X = 2;} static __initStatic45() {this.Y = 3;} static __initStatic46() {this.SCALEX = 4;} static __initStatic47() {this.SCALEY = 5;} static __initStatic48() {this.SHEARY = 6;}
- /** The index of the transform constraint slot in {@link Skeleton#transformConstraints} that will be changed. */
-
- constructor (frameCount, bezierCount, transformConstraintIndex) {
- super(frameCount, bezierCount, [
- Property.transformConstraint + "|" + transformConstraintIndex
- ]);
- this.transformConstraintIndex = transformConstraintIndex;
- }
- getFrameEntries () {
- return TransformConstraintTimeline$2.ENTRIES;
- }
- /** The time in seconds, rotate mix, translate mix, scale mix, and shear mix for the specified key frame. */
- setFrame (frame, time, mixRotate, mixX, mixY, mixScaleX, mixScaleY,
- mixShearY) {
- let frames = this.frames;
- frame *= TransformConstraintTimeline$2.ENTRIES;
- this.frames[frame] = time;
- frames[frame + TransformConstraintTimeline$2.ROTATE] = mixRotate;
- frames[frame + TransformConstraintTimeline$2.X] = mixX;
- frames[frame + TransformConstraintTimeline$2.Y] = mixY;
- frames[frame + TransformConstraintTimeline$2.SCALEX] = mixScaleX;
- frames[frame + TransformConstraintTimeline$2.SCALEY] = mixScaleY;
- frames[frame + TransformConstraintTimeline$2.SHEARY] = mixShearY;
- }
- apply (skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
- let frames = this.frames;
- let constraint = skeleton.transformConstraints[this.transformConstraintIndex];
- if (!constraint.active) return;
- if (time < frames[0]) {
- let data = constraint.data;
- switch (blend) {
- case MixBlend$2.setup:
- constraint.mixRotate = data.mixRotate;
- constraint.mixX = data.mixX;
- constraint.mixY = data.mixY;
- constraint.mixScaleX = data.mixScaleX;
- constraint.mixScaleY = data.mixScaleY;
- constraint.mixShearY = data.mixShearY;
- return;
- case MixBlend$2.first:
- constraint.mixRotate += (data.mixRotate - constraint.mixRotate) * alpha;
- constraint.mixX += (data.mixX - constraint.mixX) * alpha;
- constraint.mixY += (data.mixY - constraint.mixY) * alpha;
- constraint.mixScaleX += (data.mixScaleX - constraint.mixScaleX) * alpha;
- constraint.mixScaleY += (data.mixScaleY - constraint.mixScaleY) * alpha;
- constraint.mixShearY += (data.mixShearY - constraint.mixShearY) * alpha;
- }
- return;
- }
- let rotate, x, y, scaleX, scaleY, shearY;
- let i = Animation$2.search2(frames, time, TransformConstraintTimeline$2.ENTRIES);
- let curveType = this.curves[i / TransformConstraintTimeline$2.ENTRIES];
- let ROTATE = TransformConstraintTimeline$2.ROTATE;
- let X = TransformConstraintTimeline$2.X;
- let Y = TransformConstraintTimeline$2.Y;
- let SCALEX = TransformConstraintTimeline$2.SCALEX;
- let SCALEY = TransformConstraintTimeline$2.SCALEY;
- let SHEARY = TransformConstraintTimeline$2.SHEARY;
- let ENTRIES = TransformConstraintTimeline$2.ENTRIES;
- let BEZIER = TransformConstraintTimeline$2.BEZIER;
- let BEZIER_SIZE = TransformConstraintTimeline$2.BEZIER_SIZE;
- switch (curveType) {
- case TransformConstraintTimeline$2.LINEAR:
- let before = frames[i];
- rotate = frames[i + ROTATE];
- x = frames[i + X];
- y = frames[i + Y];
- scaleX = frames[i + SCALEX];
- scaleY = frames[i + SCALEY];
- shearY = frames[i + SHEARY];
- let t = (time - before) / (frames[i + ENTRIES] - before);
- rotate += (frames[i + ENTRIES + ROTATE] - rotate) * t;
- x += (frames[i + ENTRIES + X] - x) * t;
- y += (frames[i + ENTRIES + Y] - y) * t;
- scaleX += (frames[i + ENTRIES + SCALEX] - scaleX) * t;
- scaleY += (frames[i + ENTRIES + SCALEY] - scaleY) * t;
- shearY += (frames[i + ENTRIES + SHEARY] - shearY) * t;
- break;
- case TransformConstraintTimeline$2.STEPPED:
- rotate = frames[i + ROTATE];
- x = frames[i + X];
- y = frames[i + Y];
- scaleX = frames[i + SCALEX];
- scaleY = frames[i + SCALEY];
- shearY = frames[i + SHEARY];
- break;
- default:
- rotate = this.getBezierValue(time, i, ROTATE, curveType - BEZIER);
- x = this.getBezierValue(time, i, X, curveType + BEZIER_SIZE - BEZIER);
- y = this.getBezierValue(time, i, Y, curveType + BEZIER_SIZE * 2 - BEZIER);
- scaleX = this.getBezierValue(time, i, SCALEX, curveType + BEZIER_SIZE * 3 - BEZIER);
- scaleY = this.getBezierValue(time, i, SCALEY, curveType + BEZIER_SIZE * 4 - BEZIER);
- shearY = this.getBezierValue(time, i, SHEARY, curveType + BEZIER_SIZE * 5 - BEZIER);
- }
- if (blend == MixBlend$2.setup) {
- let data = constraint.data;
- constraint.mixRotate = data.mixRotate + (rotate - data.mixRotate) * alpha;
- constraint.mixX = data.mixX + (x - data.mixX) * alpha;
- constraint.mixY = data.mixY + (y - data.mixY) * alpha;
- constraint.mixScaleX = data.mixScaleX + (scaleX - data.mixScaleX) * alpha;
- constraint.mixScaleY = data.mixScaleY + (scaleY - data.mixScaleY) * alpha;
- constraint.mixShearY = data.mixShearY + (shearY - data.mixShearY) * alpha;
- } else {
- constraint.mixRotate += (rotate - constraint.mixRotate) * alpha;
- constraint.mixX += (x - constraint.mixX) * alpha;
- constraint.mixY += (y - constraint.mixY) * alpha;
- constraint.mixScaleX += (scaleX - constraint.mixScaleX) * alpha;
- constraint.mixScaleY += (scaleY - constraint.mixScaleY) * alpha;
- constraint.mixShearY += (shearY - constraint.mixShearY) * alpha;
- }
- }
- } TransformConstraintTimeline$2.__initStatic42(); TransformConstraintTimeline$2.__initStatic43(); TransformConstraintTimeline$2.__initStatic44(); TransformConstraintTimeline$2.__initStatic45(); TransformConstraintTimeline$2.__initStatic46(); TransformConstraintTimeline$2.__initStatic47(); TransformConstraintTimeline$2.__initStatic48();
- /** Changes a path constraint's {@link PathConstraint#position}.
- * @public
- * */
- class PathConstraintPositionTimeline$2 extends CurveTimeline1 {
- /** The index of the path constraint slot in {@link Skeleton#pathConstraints} that will be changed. */
-
- constructor (frameCount, bezierCount, pathConstraintIndex) {
- super(frameCount, bezierCount, [
- Property.pathConstraintPosition + "|" + pathConstraintIndex
- ]);
- this.pathConstraintIndex = pathConstraintIndex;
- }
- apply (skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
- let frames = this.frames;
- let constraint = skeleton.pathConstraints[this.pathConstraintIndex];
- if (!constraint.active) return;
- if (time < frames[0]) {
- switch (blend) {
- case MixBlend$2.setup:
- constraint.position = constraint.data.position;
- return;
- case MixBlend$2.first:
- constraint.position += (constraint.data.position - constraint.position) * alpha;
- }
- return;
- }
- let position = this.getCurveValue(time);
- if (blend == MixBlend$2.setup)
- constraint.position = constraint.data.position + (position - constraint.data.position) * alpha;
- else
- constraint.position += (position - constraint.position) * alpha;
- }
- }
- /** Changes a path constraint's {@link PathConstraint#spacing}.
- * @public
- * */
- class PathConstraintSpacingTimeline$2 extends CurveTimeline1 {
- /** The index of the path constraint slot in {@link Skeleton#getPathConstraints()} that will be changed. */
- __init18() {this.pathConstraintIndex = 0;}
- constructor (frameCount, bezierCount, pathConstraintIndex) {
- super(frameCount, bezierCount, [
- Property.pathConstraintSpacing + "|" + pathConstraintIndex
- ]);PathConstraintSpacingTimeline$2.prototype.__init18.call(this); this.pathConstraintIndex = pathConstraintIndex;
- }
- apply (skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
- let frames = this.frames;
- let constraint = skeleton.pathConstraints[this.pathConstraintIndex];
- if (!constraint.active) return;
- if (time < frames[0]) {
- switch (blend) {
- case MixBlend$2.setup:
- constraint.spacing = constraint.data.spacing;
- return;
- case MixBlend$2.first:
- constraint.spacing += (constraint.data.spacing - constraint.spacing) * alpha;
- }
- return;
- }
- let spacing = this.getCurveValue(time);
- if (blend == MixBlend$2.setup)
- constraint.spacing = constraint.data.spacing + (spacing - constraint.data.spacing) * alpha;
- else
- constraint.spacing += (spacing - constraint.spacing) * alpha;
- }
- }
- /** Changes a transform constraint's {@link PathConstraint#getMixRotate()}, {@link PathConstraint#getMixX()}, and
- * {@link PathConstraint#getMixY()}.
- * @public
- * */
- class PathConstraintMixTimeline$2 extends CurveTimeline$2 {
- /** The index of the path constraint slot in {@link Skeleton#getPathConstraints()} that will be changed. */
- __init19() {this.pathConstraintIndex = 0;}
- static __initStatic49() {this.ENTRIES = 4;}
- static __initStatic50() {this.ROTATE = 1;} static __initStatic51() {this.X = 2;} static __initStatic52() {this.Y = 3;}
- constructor (frameCount, bezierCount, pathConstraintIndex) {
- super(frameCount, bezierCount, [
- Property.pathConstraintMix + "|" + pathConstraintIndex
- ]);PathConstraintMixTimeline$2.prototype.__init19.call(this); this.pathConstraintIndex = pathConstraintIndex;
- }
- getFrameEntries() {
- return PathConstraintMixTimeline$2.ENTRIES;
- }
- setFrame (frame, time, mixRotate, mixX, mixY) {
- let frames = this.frames;
- frame <<= 2;
- frames[frame] = time;
- frames[frame + PathConstraintMixTimeline$2.ROTATE] = mixRotate;
- frames[frame + PathConstraintMixTimeline$2.X] = mixX;
- frames[frame + PathConstraintMixTimeline$2.Y] = mixY;
- }
- apply (skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
- let frames = this.frames;
- let constraint = skeleton.pathConstraints[this.pathConstraintIndex];
- if (!constraint.active) return;
- if (time < frames[0]) {
- switch (blend) {
- case MixBlend$2.setup:
- constraint.mixRotate = constraint.data.mixRotate;
- constraint.mixX = constraint.data.mixX;
- constraint.mixY = constraint.data.mixY;
- return;
- case MixBlend$2.first:
- constraint.mixRotate += (constraint.data.mixRotate - constraint.mixRotate) * alpha;
- constraint.mixX += (constraint.data.mixX - constraint.mixX) * alpha;
- constraint.mixY += (constraint.data.mixY - constraint.mixY) * alpha;
- }
- return;
- }
- let rotate, x, y;
- let i = Animation$2.search2(frames, time, PathConstraintMixTimeline$2.ENTRIES);
- let curveType = this.curves[i >> 2];
- switch (curveType) {
- case PathConstraintMixTimeline$2.LINEAR:
- let before = frames[i];
- rotate = frames[i + PathConstraintMixTimeline$2.ROTATE];
- x = frames[i + PathConstraintMixTimeline$2.X];
- y = frames[i + PathConstraintMixTimeline$2.Y];
- let t = (time - before) / (frames[i + PathConstraintMixTimeline$2.ENTRIES] - before);
- rotate += (frames[i + PathConstraintMixTimeline$2.ENTRIES + PathConstraintMixTimeline$2.ROTATE] - rotate) * t;
- x += (frames[i + PathConstraintMixTimeline$2.ENTRIES + PathConstraintMixTimeline$2.X] - x) * t;
- y += (frames[i + PathConstraintMixTimeline$2.ENTRIES + PathConstraintMixTimeline$2.Y] - y) * t;
- break;
- case PathConstraintMixTimeline$2.STEPPED:
- rotate = frames[i + PathConstraintMixTimeline$2.ROTATE];
- x = frames[i + PathConstraintMixTimeline$2.X];
- y = frames[i + PathConstraintMixTimeline$2.Y];
- break;
- default:
- rotate = this.getBezierValue(time, i, PathConstraintMixTimeline$2.ROTATE, curveType - PathConstraintMixTimeline$2.BEZIER);
- x = this.getBezierValue(time, i, PathConstraintMixTimeline$2.X, curveType + PathConstraintMixTimeline$2.BEZIER_SIZE - PathConstraintMixTimeline$2.BEZIER);
- y = this.getBezierValue(time, i, PathConstraintMixTimeline$2.Y, curveType + PathConstraintMixTimeline$2.BEZIER_SIZE * 2 - PathConstraintMixTimeline$2.BEZIER);
- }
- if (blend == MixBlend$2.setup) {
- let data = constraint.data;
- constraint.mixRotate = data.mixRotate + (rotate - data.mixRotate) * alpha;
- constraint.mixX = data.mixX + (x - data.mixX) * alpha;
- constraint.mixY = data.mixY + (y - data.mixY) * alpha;
- } else {
- constraint.mixRotate += (rotate - constraint.mixRotate) * alpha;
- constraint.mixX += (x - constraint.mixX) * alpha;
- constraint.mixY += (y - constraint.mixY) * alpha;
- }
- }
- } PathConstraintMixTimeline$2.__initStatic49(); PathConstraintMixTimeline$2.__initStatic50(); PathConstraintMixTimeline$2.__initStatic51(); PathConstraintMixTimeline$2.__initStatic52();
- /** Applies animations over time, queues animations for later playback, mixes (crossfading) between animations, and applies
- * multiple animations on top of each other (layering).
- *
- * See [Applying Animations](http://esotericsoftware.com/spine-applying-animations/) in the Spine Runtimes Guide.
- * @public
- * */
- class AnimationState$2 {
- static __initStatic() {this._emptyAnimation = null;}
- static emptyAnimation() {
- if (AnimationState$2._emptyAnimation == null) AnimationState$2._emptyAnimation = new Animation$2("<empty>", [], 0);
- return AnimationState$2._emptyAnimation;
- }
- /** 1. A previously applied timeline has set this property.
- *
- * Result: Mix from the current pose to the timeline pose. */
- static __initStatic2() {this.SUBSEQUENT = 0;}
- /** 1. This is the first timeline to set this property.
- * 2. The next track entry applied after this one does not have a timeline to set this property.
- *
- * Result: Mix from the setup pose to the timeline pose. */
- static __initStatic3() {this.FIRST = 1;}
- /** 1) A previously applied timeline has set this property.<br>
- * 2) The next track entry to be applied does have a timeline to set this property.<br>
- * 3) The next track entry after that one does not have a timeline to set this property.<br>
- * Result: Mix from the current pose to the timeline pose, but do not mix out. This avoids "dipping" when crossfading
- * animations that key the same property. A subsequent timeline will set this property using a mix. */
- static __initStatic4() {this.HOLD_SUBSEQUENT = 2;}
- /** 1) This is the first timeline to set this property.<br>
- * 2) The next track entry to be applied does have a timeline to set this property.<br>
- * 3) The next track entry after that one does not have a timeline to set this property.<br>
- * Result: Mix from the setup pose to the timeline pose, but do not mix out. This avoids "dipping" when crossfading animations
- * that key the same property. A subsequent timeline will set this property using a mix. */
- static __initStatic5() {this.HOLD_FIRST = 3;}
- /** 1. This is the first timeline to set this property.
- * 2. The next track entry to be applied does have a timeline to set this property.
- * 3. The next track entry after that one does have a timeline to set this property.
- * 4. timelineHoldMix stores the first subsequent track entry that does not have a timeline to set this property.
- *
- * Result: The same as HOLD except the mix percentage from the timelineHoldMix track entry is used. This handles when more than
- * 2 track entries in a row have a timeline that sets the same property.
- *
- * Eg, A -> B -> C -> D where A, B, and C have a timeline setting same property, but D does not. When A is applied, to avoid
- * "dipping" A is not mixed out, however D (the first entry that doesn't set the property) mixing in is used to mix out A
- * (which affects B and C). Without using D to mix out, A would be applied fully until mixing completes, then snap into
- * place. */
- static __initStatic6() {this.HOLD_MIX = 4;}
- static __initStatic7() {this.SETUP = 1;}
- static __initStatic8() {this.CURRENT = 2;}
- /** The AnimationStateData to look up mix durations. */
-
- /** The list of tracks that currently have animations, which may contain null entries. */
- __init() {this.tracks = new Array();}
- /** Multiplier for the delta time when the animation state is updated, causing time for all animations and mixes to play slower
- * or faster. Defaults to 1.
- *
- * See TrackEntry {@link TrackEntry#timeScale} for affecting a single animation. */
- __init2() {this.timeScale = 1;}
- __init3() {this.unkeyedState = 0;}
- __init4() {this.events = new Array();}
- __init5() {this.listeners = new Array();}
- __init6() {this.queue = new EventQueue$2(this);}
- __init7() {this.propertyIDs = new StringSet();}
- __init8() {this.animationsChanged = false;}
- __init9() {this.trackEntryPool = new Pool(() => new TrackEntry$2());}
- constructor (data) {AnimationState$2.prototype.__init.call(this);AnimationState$2.prototype.__init2.call(this);AnimationState$2.prototype.__init3.call(this);AnimationState$2.prototype.__init4.call(this);AnimationState$2.prototype.__init5.call(this);AnimationState$2.prototype.__init6.call(this);AnimationState$2.prototype.__init7.call(this);AnimationState$2.prototype.__init8.call(this);AnimationState$2.prototype.__init9.call(this);
- this.data = data;
- }
- /** Increments each track entry {@link TrackEntry#trackTime()}, setting queued animations as current if needed. */
- update (delta) {
- delta *= this.timeScale;
- let tracks = this.tracks;
- for (let i = 0, n = tracks.length; i < n; i++) {
- let current = tracks[i];
- if (current == null) continue;
- current.animationLast = current.nextAnimationLast;
- current.trackLast = current.nextTrackLast;
- let currentDelta = delta * current.timeScale;
- if (current.delay > 0) {
- current.delay -= currentDelta;
- if (current.delay > 0) continue;
- currentDelta = -current.delay;
- current.delay = 0;
- }
- let next = current.next;
- if (next != null) {
- // When the next entry's delay is passed, change to the next entry, preserving leftover time.
- let nextTime = current.trackLast - next.delay;
- if (nextTime >= 0) {
- next.delay = 0;
- next.trackTime += current.timeScale == 0 ? 0 : (nextTime / current.timeScale + delta) * next.timeScale;
- current.trackTime += currentDelta;
- this.setCurrent(i, next, true);
- while (next.mixingFrom != null) {
- next.mixTime += delta;
- next = next.mixingFrom;
- }
- continue;
- }
- } else if (current.trackLast >= current.trackEnd && current.mixingFrom == null) {
- tracks[i] = null;
- this.queue.end(current);
- this.disposeNext(current);
- continue;
- }
- if (current.mixingFrom != null && this.updateMixingFrom(current, delta)) {
- // End mixing from entries once all have completed.
- let from = current.mixingFrom;
- current.mixingFrom = null;
- if (from != null) from.mixingTo = null;
- while (from != null) {
- this.queue.end(from);
- from = from.mixingFrom;
- }
- }
- current.trackTime += currentDelta;
- }
- this.queue.drain();
- }
- /** Returns true when all mixing from entries are complete. */
- updateMixingFrom (to, delta) {
- let from = to.mixingFrom;
- if (from == null) return true;
- let finished = this.updateMixingFrom(from, delta);
- from.animationLast = from.nextAnimationLast;
- from.trackLast = from.nextTrackLast;
- // Require mixTime > 0 to ensure the mixing from entry was applied at least once.
- if (to.mixTime > 0 && to.mixTime >= to.mixDuration) {
- // Require totalAlpha == 0 to ensure mixing is complete, unless mixDuration == 0 (the transition is a single frame).
- if (from.totalAlpha == 0 || to.mixDuration == 0) {
- to.mixingFrom = from.mixingFrom;
- if (from.mixingFrom != null) from.mixingFrom.mixingTo = to;
- to.interruptAlpha = from.interruptAlpha;
- this.queue.end(from);
- }
- return finished;
- }
- from.trackTime += delta * from.timeScale;
- to.mixTime += delta;
- return false;
- }
- /** Poses the skeleton using the track entry animations. There are no side effects other than invoking listeners, so the
- * animation state can be applied to multiple skeletons to pose them identically.
- * @returns True if any animations were applied. */
- apply (skeleton) {
- if (skeleton == null) throw new Error("skeleton cannot be null.");
- if (this.animationsChanged) this._animationsChanged();
- let events = this.events;
- let tracks = this.tracks;
- let applied = false;
- for (let i = 0, n = tracks.length; i < n; i++) {
- let current = tracks[i];
- if (current == null || current.delay > 0) continue;
- applied = true;
- let blend = i == 0 ? MixBlend$2.first : current.mixBlend;
- // Apply mixing from entries first.
- let mix = current.alpha;
- if (current.mixingFrom != null)
- mix *= this.applyMixingFrom(current, skeleton, blend);
- else if (current.trackTime >= current.trackEnd && current.next == null)
- mix = 0;
- // Apply current entry.
- let animationLast = current.animationLast, animationTime = current.getAnimationTime(), applyTime = animationTime;
- let applyEvents = events;
- if (current.reverse) {
- applyTime = current.animation.duration - applyTime;
- applyEvents = null;
- }
- let timelineCount = current.animation.timelines.length;
- let timelines = current.animation.timelines;
- if ((i == 0 && mix == 1) || blend == MixBlend$2.add) {
- for (let ii = 0; ii < timelineCount; ii++) {
- // Fixes issue #302 on IOS9 where mix, blend sometimes became undefined and caused assets
- // to sometimes stop rendering when using color correction, as their RGBA values become NaN.
- // (https://github.com/pixijs/pixi-spine/issues/302)
- Utils.webkit602BugfixHelper(mix, blend);
- var timeline = timelines[ii];
- if (timeline instanceof AttachmentTimeline$2)
- this.applyAttachmentTimeline(timeline, skeleton, applyTime, blend, true);
- else
- timeline.apply(skeleton, animationLast, applyTime, applyEvents, mix, blend, MixDirection$2.mixIn);
- }
- } else {
- let timelineMode = current.timelineMode;
- let firstFrame = current.timelinesRotation.length == 0;
- if (firstFrame) Utils.setArraySize(current.timelinesRotation, timelineCount << 1, null);
- let timelinesRotation = current.timelinesRotation;
- for (let ii = 0; ii < timelineCount; ii++) {
- let timeline = timelines[ii];
- let timelineBlend = timelineMode[ii] == AnimationState$2.SUBSEQUENT ? blend : MixBlend$2.setup;
- if (timeline instanceof RotateTimeline$2) {
- this.applyRotateTimeline(timeline, skeleton, applyTime, mix, timelineBlend, timelinesRotation, ii << 1, firstFrame);
- } else if (timeline instanceof AttachmentTimeline$2) {
- this.applyAttachmentTimeline(timeline, skeleton, applyTime, blend, true);
- } else {
- // This fixes the WebKit 602 specific issue described at http://esotericsoftware.com/forum/iOS-10-disappearing-graphics-10109
- Utils.webkit602BugfixHelper(mix, blend);
- timeline.apply(skeleton, animationLast, applyTime, applyEvents, mix, timelineBlend, MixDirection$2.mixIn);
- }
- }
- }
- this.queueEvents(current, animationTime);
- events.length = 0;
- current.nextAnimationLast = animationTime;
- current.nextTrackLast = current.trackTime;
- }
- // Set slots attachments to the setup pose, if needed. This occurs if an animation that is mixing out sets attachments so
- // subsequent timelines see any deform, but the subsequent timelines don't set an attachment (eg they are also mixing out or
- // the time is before the first key).
- var setupState = this.unkeyedState + AnimationState$2.SETUP;
- var slots = skeleton.slots;
- for (var i = 0, n = skeleton.slots.length; i < n; i++) {
- var slot = slots[i];
- if (slot.attachmentState == setupState) {
- var attachmentName = slot.data.attachmentName;
- slot.setAttachment(attachmentName == null ? null : skeleton.getAttachment(slot.data.index, attachmentName));
- }
- }
- this.unkeyedState += 2; // Increasing after each use avoids the need to reset attachmentState for every slot.
- this.queue.drain();
- return applied;
- }
- applyMixingFrom (to, skeleton, blend) {
- let from = to.mixingFrom;
- if (from.mixingFrom != null) this.applyMixingFrom(from, skeleton, blend);
- let mix = 0;
- if (to.mixDuration == 0) { // Single frame mix to undo mixingFrom changes.
- mix = 1;
- if (blend == MixBlend$2.first) blend = MixBlend$2.setup;
- } else {
- mix = to.mixTime / to.mixDuration;
- if (mix > 1) mix = 1;
- if (blend != MixBlend$2.first) blend = from.mixBlend;
- }
- let attachments = mix < from.attachmentThreshold, drawOrder = mix < from.drawOrderThreshold;
- let timelineCount = from.animation.timelines.length;
- let timelines = from.animation.timelines;
- let alphaHold = from.alpha * to.interruptAlpha, alphaMix = alphaHold * (1 - mix);
- let animationLast = from.animationLast, animationTime = from.getAnimationTime(), applyTime = animationTime;
- let events = null;
- // let events = mix < from.eventThreshold ? this.events : null;
- if (from.reverse) {
- applyTime = from.animation.duration - applyTime;
- } else {
- if (mix < from.eventThreshold) events = this.events;
- }
- if (blend == MixBlend$2.add) {
- for (let i = 0; i < timelineCount; i++)
- timelines[i].apply(skeleton, animationLast, applyTime, events, alphaMix, blend, MixDirection$2.mixOut);
- } else {
- let timelineMode = from.timelineMode;
- let timelineHoldMix = from.timelineHoldMix;
- let firstFrame = from.timelinesRotation.length == 0;
- if (firstFrame) Utils.setArraySize(from.timelinesRotation, timelineCount << 1, null);
- let timelinesRotation = from.timelinesRotation;
- from.totalAlpha = 0;
- for (let i = 0; i < timelineCount; i++) {
- let timeline = timelines[i];
- let direction = MixDirection$2.mixOut;
- let timelineBlend;
- let alpha = 0;
- switch (timelineMode[i]) {
- case AnimationState$2.SUBSEQUENT:
- if (!drawOrder && timeline instanceof DrawOrderTimeline$2) continue;
- timelineBlend = blend;
- alpha = alphaMix;
- break;
- case AnimationState$2.FIRST:
- timelineBlend = MixBlend$2.setup;
- alpha = alphaMix;
- break;
- case AnimationState$2.HOLD_SUBSEQUENT:
- timelineBlend = blend;
- alpha = alphaHold;
- break;
- case AnimationState$2.HOLD_FIRST:
- timelineBlend = MixBlend$2.setup;
- alpha = alphaHold;
- break;
- default:
- timelineBlend = MixBlend$2.setup;
- let holdMix = timelineHoldMix[i];
- alpha = alphaHold * Math.max(0, 1 - holdMix.mixTime / holdMix.mixDuration);
- break;
- }
- from.totalAlpha += alpha;
- if (timeline instanceof RotateTimeline$2)
- this.applyRotateTimeline(timeline, skeleton, applyTime, alpha, timelineBlend, timelinesRotation, i << 1, firstFrame);
- else if (timeline instanceof AttachmentTimeline$2)
- this.applyAttachmentTimeline(timeline, skeleton, applyTime, timelineBlend, attachments);
- else {
- // This fixes the WebKit 602 specific issue described at http://esotericsoftware.com/forum/iOS-10-disappearing-graphics-10109
- Utils.webkit602BugfixHelper(alpha, blend);
- if (drawOrder && timeline instanceof DrawOrderTimeline$2 && timelineBlend == MixBlend$2.setup)
- direction = MixDirection$2.mixIn;
- timeline.apply(skeleton, animationLast, applyTime, events, alpha, timelineBlend, direction);
- }
- }
- }
- if (to.mixDuration > 0) this.queueEvents(from, animationTime);
- this.events.length = 0;
- from.nextAnimationLast = animationTime;
- from.nextTrackLast = from.trackTime;
- return mix;
- }
- applyAttachmentTimeline (timeline, skeleton, time, blend, attachments) {
- var slot = skeleton.slots[timeline.slotIndex];
- if (!slot.bone.active) return;
- var frames = timeline.frames;
- if (time < frames[0]) { // Time is before first frame.
- if (blend == MixBlend$2.setup || blend == MixBlend$2.first)
- this.setAttachment(skeleton, slot, slot.data.attachmentName, attachments);
- }
- else
- this.setAttachment(skeleton, slot, timeline.attachmentNames[Animation$2.search(frames, time)], attachments);
- // If an attachment wasn't set (ie before the first frame or attachments is false), set the setup attachment later.
- if (slot.attachmentState <= this.unkeyedState) slot.attachmentState = this.unkeyedState + AnimationState$2.SETUP;
- }
- setAttachment (skeleton, slot, attachmentName, attachments) {
- slot.setAttachment(attachmentName == null ? null : skeleton.getAttachment(slot.data.index, attachmentName));
- if (attachments) slot.attachmentState = this.unkeyedState + AnimationState$2.CURRENT;
- }
- applyRotateTimeline (timeline, skeleton, time, alpha, blend,
- timelinesRotation, i, firstFrame) {
- if (firstFrame) timelinesRotation[i] = 0;
- if (alpha == 1) {
- timeline.apply(skeleton, 0, time, null, 1, blend, MixDirection$2.mixIn);
- return;
- }
- let rotateTimeline = timeline ;
- let bone = skeleton.bones[rotateTimeline.boneIndex];
- if (!bone.active) return;
- let frames = rotateTimeline.frames;
- let r1 = 0, r2 = 0;
- if (time < frames[0]) {
- switch (blend) {
- case MixBlend$2.setup:
- bone.rotation = bone.data.rotation;
- default:
- return;
- case MixBlend$2.first:
- r1 = bone.rotation;
- r2 = bone.data.rotation;
- }
- } else {
- r1 = blend == MixBlend$2.setup ? bone.data.rotation : bone.rotation;
- r2 = bone.data.rotation + rotateTimeline.getCurveValue(time);
- }
- // Mix between rotations using the direction of the shortest route on the first frame while detecting crosses.
- let total = 0, diff = r2 - r1;
- diff -= (16384 - ((16384.499999999996 - diff / 360) | 0)) * 360;
- if (diff == 0) {
- total = timelinesRotation[i];
- } else {
- let lastTotal = 0, lastDiff = 0;
- if (firstFrame) {
- lastTotal = 0;
- lastDiff = diff;
- } else {
- lastTotal = timelinesRotation[i]; // Angle and direction of mix, including loops.
- lastDiff = timelinesRotation[i + 1]; // Difference between bones.
- }
- let current = diff > 0, dir = lastTotal >= 0;
- // Detect cross at 0 (not 180).
- if (MathUtils.signum(lastDiff) != MathUtils.signum(diff) && Math.abs(lastDiff) <= 90) {
- // A cross after a 360 rotation is a loop.
- if (Math.abs(lastTotal) > 180) lastTotal += 360 * MathUtils.signum(lastTotal);
- dir = current;
- }
- total = diff + lastTotal - lastTotal % 360; // Store loops as part of lastTotal.
- if (dir != current) total += 360 * MathUtils.signum(lastTotal);
- timelinesRotation[i] = total;
- }
- timelinesRotation[i + 1] = diff;
- bone.rotation = r1 + total * alpha;
- }
- queueEvents (entry, animationTime) {
- let animationStart = entry.animationStart, animationEnd = entry.animationEnd;
- let duration = animationEnd - animationStart;
- let trackLastWrapped = entry.trackLast % duration;
- // Queue events before complete.
- let events = this.events;
- let i = 0, n = events.length;
- for (; i < n; i++) {
- let event = events[i];
- if (event.time < trackLastWrapped) break;
- if (event.time > animationEnd) continue; // Discard events outside animation start/end.
- this.queue.event(entry, event);
- }
- // Queue complete if completed a loop iteration or the animation.
- let complete = false;
- if (entry.loop)
- complete = duration == 0 || trackLastWrapped > entry.trackTime % duration;
- else
- complete = animationTime >= animationEnd && entry.animationLast < animationEnd;
- if (complete) this.queue.complete(entry);
- // Queue events after complete.
- for (; i < n; i++) {
- let event = events[i];
- if (event.time < animationStart) continue; // Discard events outside animation start/end.
- this.queue.event(entry, event);
- }
- }
- /** Removes all animations from all tracks, leaving skeletons in their current pose.
- *
- * It may be desired to use {@link AnimationState#setEmptyAnimation()} to mix the skeletons back to the setup pose,
- * rather than leaving them in their current pose. */
- clearTracks () {
- let oldDrainDisabled = this.queue.drainDisabled;
- this.queue.drainDisabled = true;
- for (let i = 0, n = this.tracks.length; i < n; i++)
- this.clearTrack(i);
- this.tracks.length = 0;
- this.queue.drainDisabled = oldDrainDisabled;
- this.queue.drain();
- }
- /** Removes all animations from the track, leaving skeletons in their current pose.
- *
- * It may be desired to use {@link AnimationState#setEmptyAnimation()} to mix the skeletons back to the setup pose,
- * rather than leaving them in their current pose. */
- clearTrack (trackIndex) {
- if (trackIndex >= this.tracks.length) return;
- let current = this.tracks[trackIndex];
- if (current == null) return;
- this.queue.end(current);
- this.disposeNext(current);
- let entry = current;
- while (true) {
- let from = entry.mixingFrom;
- if (from == null) break;
- this.queue.end(from);
- entry.mixingFrom = null;
- entry.mixingTo = null;
- entry = from;
- }
- this.tracks[current.trackIndex] = null;
- this.queue.drain();
- }
- /** Removes the {@link TrackEntry#getNext() next entry} and all entries after it for the specified entry. */
- clearNext(entry) {
- this.disposeNext(entry.next);
- }
- setCurrent (index, current, interrupt) {
- let from = this.expandToIndex(index);
- this.tracks[index] = current;
- current.previous = null;
- if (from != null) {
- if (interrupt) this.queue.interrupt(from);
- current.mixingFrom = from;
- from.mixingTo = current;
- current.mixTime = 0;
- // Store the interrupted mix percentage.
- if (from.mixingFrom != null && from.mixDuration > 0)
- current.interruptAlpha *= Math.min(1, from.mixTime / from.mixDuration);
- from.timelinesRotation.length = 0; // Reset rotation for mixing out, in case entry was mixed in.
- }
- this.queue.start(current);
- }
- /** Sets an animation by name.
- *
- * {@link #setAnimationWith(}. */
- setAnimation (trackIndex, animationName, loop) {
- let animation = this.data.skeletonData.findAnimation(animationName);
- if (animation == null) throw new Error("Animation not found: " + animationName);
- return this.setAnimationWith(trackIndex, animation, loop);
- }
- /** Sets the current animation for a track, discarding any queued animations. If the formerly current track entry was never
- * applied to a skeleton, it is replaced (not mixed from).
- * @param loop If true, the animation will repeat. If false it will not, instead its last frame is applied if played beyond its
- * duration. In either case {@link TrackEntry#trackEnd} determines when the track is cleared.
- * @returns A track entry to allow further customization of animation playback. References to the track entry must not be kept
- * after the {@link AnimationStateListener#dispose()} event occurs. */
- setAnimationWith (trackIndex, animation, loop) {
- if (animation == null) throw new Error("animation cannot be null.");
- let interrupt = true;
- let current = this.expandToIndex(trackIndex);
- if (current != null) {
- if (current.nextTrackLast == -1) {
- // Don't mix from an entry that was never applied.
- this.tracks[trackIndex] = current.mixingFrom;
- this.queue.interrupt(current);
- this.queue.end(current);
- this.disposeNext(current);
- current = current.mixingFrom;
- interrupt = false;
- } else
- this.disposeNext(current);
- }
- let entry = this.trackEntry(trackIndex, animation, loop, current);
- this.setCurrent(trackIndex, entry, interrupt);
- this.queue.drain();
- return entry;
- }
- /** Queues an animation by name.
- *
- * See {@link #addAnimationWith()}. */
- addAnimation (trackIndex, animationName, loop, delay) {
- let animation = this.data.skeletonData.findAnimation(animationName);
- if (animation == null) throw new Error("Animation not found: " + animationName);
- return this.addAnimationWith(trackIndex, animation, loop, delay);
- }
- /** Adds an animation to be played after the current or last queued animation for a track. If the track is empty, it is
- * equivalent to calling {@link #setAnimationWith()}.
- * @param delay If > 0, sets {@link TrackEntry#delay}. If <= 0, the delay set is the duration of the previous track entry
- * minus any mix duration (from the {@link AnimationStateData}) plus the specified `delay` (ie the mix
- * ends at (`delay` = 0) or before (`delay` < 0) the previous track entry duration). If the
- * previous entry is looping, its next loop completion is used instead of its duration.
- * @returns A track entry to allow further customization of animation playback. References to the track entry must not be kept
- * after the {@link AnimationStateListener#dispose()} event occurs. */
- addAnimationWith (trackIndex, animation, loop, delay) {
- if (animation == null) throw new Error("animation cannot be null.");
- let last = this.expandToIndex(trackIndex);
- if (last != null) {
- while (last.next != null)
- last = last.next;
- }
- let entry = this.trackEntry(trackIndex, animation, loop, last);
- if (last == null) {
- this.setCurrent(trackIndex, entry, true);
- this.queue.drain();
- } else {
- last.next = entry;
- entry.previous = last;
- if (delay <= 0) delay += last.getTrackComplete() - entry.mixDuration;
- }
- entry.delay = delay;
- return entry;
- }
- /** Sets an empty animation for a track, discarding any queued animations, and sets the track entry's
- * {@link TrackEntry#mixduration}. An empty animation has no timelines and serves as a placeholder for mixing in or out.
- *
- * Mixing out is done by setting an empty animation with a mix duration using either {@link #setEmptyAnimation()},
- * {@link #setEmptyAnimations()}, or {@link #addEmptyAnimation()}. Mixing to an empty animation causes
- * the previous animation to be applied less and less over the mix duration. Properties keyed in the previous animation
- * transition to the value from lower tracks or to the setup pose value if no lower tracks key the property. A mix duration of
- * 0 still mixes out over one frame.
- *
- * Mixing in is done by first setting an empty animation, then adding an animation using
- * {@link #addAnimation()} and on the returned track entry, set the
- * {@link TrackEntry#setMixDuration()}. Mixing from an empty animation causes the new animation to be applied more and
- * more over the mix duration. Properties keyed in the new animation transition from the value from lower tracks or from the
- * setup pose value if no lower tracks key the property to the value keyed in the new animation. */
- setEmptyAnimation (trackIndex, mixDuration) {
- let entry = this.setAnimationWith(trackIndex, AnimationState$2.emptyAnimation(), false);
- entry.mixDuration = mixDuration;
- entry.trackEnd = mixDuration;
- return entry;
- }
- /** Adds an empty animation to be played after the current or last queued animation for a track, and sets the track entry's
- * {@link TrackEntry#mixDuration}. If the track is empty, it is equivalent to calling
- * {@link #setEmptyAnimation()}.
- *
- * See {@link #setEmptyAnimation()}.
- * @param delay If > 0, sets {@link TrackEntry#delay}. If <= 0, the delay set is the duration of the previous track entry
- * minus any mix duration plus the specified `delay` (ie the mix ends at (`delay` = 0) or
- * before (`delay` < 0) the previous track entry duration). If the previous entry is looping, its next
- * loop completion is used instead of its duration.
- * @return A track entry to allow further customization of animation playback. References to the track entry must not be kept
- * after the {@link AnimationStateListener#dispose()} event occurs. */
- addEmptyAnimation (trackIndex, mixDuration, delay) {
- let entry = this.addAnimationWith(trackIndex, AnimationState$2.emptyAnimation(), false, delay <= 0 ? 1 : delay);
- entry.mixDuration = mixDuration;
- entry.trackEnd = mixDuration;
- if (delay <= 0 && entry.previous != null) entry.delay = entry.previous.getTrackComplete() - entry.mixDuration;
- return entry;
- }
- /** Sets an empty animation for every track, discarding any queued animations, and mixes to it over the specified mix
- * duration. */
- setEmptyAnimations (mixDuration) {
- let oldDrainDisabled = this.queue.drainDisabled;
- this.queue.drainDisabled = true;
- for (let i = 0, n = this.tracks.length; i < n; i++) {
- let current = this.tracks[i];
- if (current != null) this.setEmptyAnimation(current.trackIndex, mixDuration);
- }
- this.queue.drainDisabled = oldDrainDisabled;
- this.queue.drain();
- }
- expandToIndex (index) {
- if (index < this.tracks.length) return this.tracks[index];
- Utils.ensureArrayCapacity(this.tracks, index + 1, null);
- this.tracks.length = index + 1;
- return null;
- }
- /** @param last May be null. */
- trackEntry (trackIndex, animation, loop, last) {
- let entry = this.trackEntryPool.obtain();
- entry.trackIndex = trackIndex;
- entry.animation = animation;
- entry.loop = loop;
- entry.holdPrevious = false;
- entry.eventThreshold = 0;
- entry.attachmentThreshold = 0;
- entry.drawOrderThreshold = 0;
- entry.animationStart = 0;
- entry.animationEnd = animation.duration;
- entry.animationLast = -1;
- entry.nextAnimationLast = -1;
- entry.delay = 0;
- entry.trackTime = 0;
- entry.trackLast = -1;
- entry.nextTrackLast = -1;
- entry.trackEnd = Number.MAX_VALUE;
- entry.timeScale = 1;
- entry.alpha = 1;
- entry.interruptAlpha = 1;
- entry.mixTime = 0;
- entry.mixDuration = last == null ? 0 : this.data.getMix(last.animation, animation);
- entry.mixBlend = MixBlend$2.replace;
- return entry;
- }
- disposeNext (entry) {
- let next = entry.next;
- while (next != null) {
- this.queue.dispose(next);
- next = next.next;
- }
- entry.next = null;
- }
- _animationsChanged () {
- this.animationsChanged = false;
- this.propertyIDs.clear();
- for (let i = 0, n = this.tracks.length; i < n; i++) {
- let entry = this.tracks[i];
- if (entry == null) continue;
- while (entry.mixingFrom != null)
- entry = entry.mixingFrom;
- do {
- if (entry.mixingFrom == null || entry.mixBlend != MixBlend$2.add) this.computeHold(entry);
- entry = entry.mixingTo;
- } while (entry != null)
- }
- }
- computeHold (entry) {
- let to = entry.mixingTo;
- let timelines = entry.animation.timelines;
- let timelinesCount = entry.animation.timelines.length;
- let timelineMode = Utils.setArraySize(entry.timelineMode, timelinesCount);
- entry.timelineHoldMix.length = 0;
- let timelineDipMix = Utils.setArraySize(entry.timelineHoldMix, timelinesCount);
- let propertyIDs = this.propertyIDs;
- if (to != null && to.holdPrevious) {
- for (let i = 0; i < timelinesCount; i++) {
- timelineMode[i] = propertyIDs.addAll(timelines[i].getPropertyIds()) ? AnimationState$2.HOLD_FIRST : AnimationState$2.HOLD_SUBSEQUENT;
- }
- return;
- }
- outer:
- for (let i = 0; i < timelinesCount; i++) {
- let timeline = timelines[i];
- let ids = timeline.getPropertyIds();
- if (!propertyIDs.addAll(ids))
- timelineMode[i] = AnimationState$2.SUBSEQUENT;
- else if (to == null || timeline instanceof AttachmentTimeline$2 || timeline instanceof DrawOrderTimeline$2
- || timeline instanceof EventTimeline$2 || !to.animation.hasTimeline(ids)) {
- timelineMode[i] = AnimationState$2.FIRST;
- } else {
- for (let next = to.mixingTo; next != null; next = next.mixingTo) {
- if (next.animation.hasTimeline(ids)) continue;
- if (entry.mixDuration > 0) {
- timelineMode[i] = AnimationState$2.HOLD_MIX;
- timelineDipMix[i] = next;
- continue outer;
- }
- break;
- }
- timelineMode[i] = AnimationState$2.HOLD_FIRST;
- }
- }
- }
- /** Returns the track entry for the animation currently playing on the track, or null if no animation is currently playing. */
- getCurrent (trackIndex) {
- if (trackIndex >= this.tracks.length) return null;
- return this.tracks[trackIndex];
- }
- /** Adds a listener to receive events for all track entries. */
- addListener (listener) {
- if (listener == null) throw new Error("listener cannot be null.");
- this.listeners.push(listener);
- }
- /** Removes the listener added with {@link #addListener()}. */
- removeListener (listener) {
- let index = this.listeners.indexOf(listener);
- if (index >= 0) this.listeners.splice(index, 1);
- }
- /** Removes all listeners added with {@link #addListener()}. */
- clearListeners () {
- this.listeners.length = 0;
- }
- /** Discards all listener notifications that have not yet been delivered. This can be useful to call from an
- * {@link AnimationStateListener} when it is known that further notifications that may have been already queued for delivery
- * are not wanted because new animations are being set. */
- clearListenerNotifications () {
- this.queue.clear();
- }
- //deprecated stuff
-
-
-
-
- static __initStatic9() {this.deprecatedWarning1 = false;}
- setAnimationByName(trackIndex, animationName, loop) {
- if (!AnimationState$2.deprecatedWarning1) {
- AnimationState$2.deprecatedWarning1 = true;
- console.warn("Spine Deprecation Warning: AnimationState.setAnimationByName is deprecated, please use setAnimation from now on.");
- }
- this.setAnimation(trackIndex, animationName, loop);
- }
- static __initStatic10() {this.deprecatedWarning2 = false;}
- addAnimationByName(trackIndex, animationName, loop, delay) {
- if (!AnimationState$2.deprecatedWarning2) {
- AnimationState$2.deprecatedWarning2 = true;
- console.warn("Spine Deprecation Warning: AnimationState.addAnimationByName is deprecated, please use addAnimation from now on.");
- }
- this.addAnimation(trackIndex, animationName, loop, delay);
- }
- static __initStatic11() {this.deprecatedWarning3 = false;}
- hasAnimation(animationName) {
- let animation = this.data.skeletonData.findAnimation(animationName);
- return animation !== null;
- }
- hasAnimationByName(animationName) {
- if (!AnimationState$2.deprecatedWarning3) {
- AnimationState$2.deprecatedWarning3 = true;
- console.warn("Spine Deprecation Warning: AnimationState.hasAnimationByName is deprecated, please use hasAnimation from now on.");
- }
- return this.hasAnimation(animationName);
- }
- } AnimationState$2.__initStatic(); AnimationState$2.__initStatic2(); AnimationState$2.__initStatic3(); AnimationState$2.__initStatic4(); AnimationState$2.__initStatic5(); AnimationState$2.__initStatic6(); AnimationState$2.__initStatic7(); AnimationState$2.__initStatic8(); AnimationState$2.__initStatic9(); AnimationState$2.__initStatic10(); AnimationState$2.__initStatic11();
- /** Stores settings and other state for the playback of an animation on an {@link AnimationState} track.
- *
- * References to a track entry must not be kept after the {@link AnimationStateListener#dispose()} event occurs.
- * @public
- * */
- class TrackEntry$2 {constructor() { TrackEntry$2.prototype.__init10.call(this);TrackEntry$2.prototype.__init11.call(this);TrackEntry$2.prototype.__init12.call(this);TrackEntry$2.prototype.__init13.call(this); }
- /** The animation to apply for this track entry. */
-
-
- /** The animation queued to start after this animation, or null. `next` makes up a linked list. */
-
- /** The track entry for the previous animation when mixing from the previous animation to this animation, or null if no
- * mixing is currently occuring. When mixing from multiple animations, `mixingFrom` makes up a linked list. */
-
- /** The track entry for the next animation when mixing from this animation to the next animation, or null if no mixing is
- * currently occuring. When mixing to multiple animations, `mixingTo` makes up a linked list. */
-
- /** The listener for events generated by this track entry, or null.
- *
- * A track entry returned from {@link AnimationState#setAnimation()} is already the current animation
- * for the track, so the track entry listener {@link AnimationStateListener#start()} will not be called. */
-
- /** The index of the track where this track entry is either current or queued.
- *
- * See {@link AnimationState#getCurrent()}. */
-
- /** If true, the animation will repeat. If false it will not, instead its last frame is applied if played beyond its
- * duration. */
-
- /** If true, when mixing from the previous animation to this animation, the previous animation is applied as normal instead
- * of being mixed out.
- *
- * When mixing between animations that key the same property, if a lower track also keys that property then the value will
- * briefly dip toward the lower track value during the mix. This happens because the first animation mixes from 100% to 0%
- * while the second animation mixes from 0% to 100%. Setting `holdPrevious` to true applies the first animation
- * at 100% during the mix so the lower track value is overwritten. Such dipping does not occur on the lowest track which
- * keys the property, only when a higher track also keys the property.
- *
- * Snapping will occur if `holdPrevious` is true and this animation does not key all the same properties as the
- * previous animation. */
-
-
- /** When the mix percentage ({@link #mixTime} / {@link #mixDuration}) is less than the
- * `eventThreshold`, event timelines are applied while this animation is being mixed out. Defaults to 0, so event
- * timelines are not applied while this animation is being mixed out. */
-
- /** When the mix percentage ({@link #mixtime} / {@link #mixDuration}) is less than the
- * `attachmentThreshold`, attachment timelines are applied while this animation is being mixed out. Defaults to
- * 0, so attachment timelines are not applied while this animation is being mixed out. */
-
- /** When the mix percentage ({@link #mixTime} / {@link #mixDuration}) is less than the
- * `drawOrderThreshold`, draw order timelines are applied while this animation is being mixed out. Defaults to 0,
- * so draw order timelines are not applied while this animation is being mixed out. */
-
- /** Seconds when this animation starts, both initially and after looping. Defaults to 0.
- *
- * When changing the `animationStart` time, it often makes sense to set {@link #animationLast} to the same
- * value to prevent timeline keys before the start time from triggering. */
-
- /** Seconds for the last frame of this animation. Non-looping animations won't play past this time. Looping animations will
- * loop back to {@link #animationStart} at this time. Defaults to the animation {@link Animation#duration}. */
-
- /** The time in seconds this animation was last applied. Some timelines use this for one-time triggers. Eg, when this
- * animation is applied, event timelines will fire all events between the `animationLast` time (exclusive) and
- * `animationTime` (inclusive). Defaults to -1 to ensure triggers on frame 0 happen the first time this animation
- * is applied. */
-
-
- /** Seconds to postpone playing the animation. When this track entry is the current track entry, `delay`
- * postpones incrementing the {@link #trackTime}. When this track entry is queued, `delay` is the time from
- * the start of the previous animation to when this track entry will become the current track entry (ie when the previous
- * track entry {@link TrackEntry#trackTime} >= this track entry's `delay`).
- *
- * {@link #timeScale} affects the delay. */
-
- /** Current time in seconds this track entry has been the current track entry. The track time determines
- * {@link #animationTime}. The track time can be set to start the animation at a time other than 0, without affecting
- * looping. */
-
-
- /** The track time in seconds when this animation will be removed from the track. Defaults to the highest possible float
- * value, meaning the animation will be applied until a new animation is set or the track is cleared. If the track end time
- * is reached, no other animations are queued for playback, and mixing from any previous animations is complete, then the
- * properties keyed by the animation are set to the setup pose and the track is cleared.
- *
- * It may be desired to use {@link AnimationState#addEmptyAnimation()} rather than have the animation
- * abruptly cease being applied. */
-
- /** Multiplier for the delta time when this track entry is updated, causing time for this animation to pass slower or
- * faster. Defaults to 1.
- *
- * {@link #mixTime} is not affected by track entry time scale, so {@link #mixDuration} may need to be adjusted to
- * match the animation speed.
- *
- * When using {@link AnimationState#addAnimation()} with a `delay` <= 0, note the
- * {@link #delay} is set using the mix duration from the {@link AnimationStateData}, assuming time scale to be 1. If
- * the time scale is not 1, the delay may need to be adjusted.
- *
- * See AnimationState {@link AnimationState#timeScale} for affecting all animations. */
-
- /** Values < 1 mix this animation with the skeleton's current pose (usually the pose resulting from lower tracks). Defaults
- * to 1, which overwrites the skeleton's current pose with this animation.
- *
- * Typically track 0 is used to completely pose the skeleton, then alpha is used on higher tracks. It doesn't make sense to
- * use alpha on track 0 if the skeleton pose is from the last frame render. */
-
- /** Seconds from 0 to the {@link #getMixDuration()} when mixing from the previous animation to this animation. May be
- * slightly more than `mixDuration` when the mix is complete. */
-
- /** Seconds for mixing from the previous animation to this animation. Defaults to the value provided by AnimationStateData
- * {@link AnimationStateData#getMix()} based on the animation before this animation (if any).
- *
- * A mix duration of 0 still mixes out over one frame to provide the track entry being mixed out a chance to revert the
- * properties it was animating.
- *
- * The `mixDuration` can be set manually rather than use the value from
- * {@link AnimationStateData#getMix()}. In that case, the `mixDuration` can be set for a new
- * track entry only before {@link AnimationState#update(float)} is first called.
- *
- * When using {@link AnimationState#addAnimation()} with a `delay` <= 0, note the
- * {@link #delay} is set using the mix duration from the {@link AnimationStateData}, not a mix duration set
- * afterward. */
-
- /** Controls how properties keyed in the animation are mixed with lower tracks. Defaults to {@link MixBlend#replace}, which
- * replaces the values from the lower tracks with the animation values. {@link MixBlend#add} adds the animation values to
- * the values from the lower tracks.
- *
- * The `mixBlend` can be set for a new track entry only before {@link AnimationState#apply()} is first
- * called. */
- __init10() {this.mixBlend = MixBlend$2.replace;}
- __init11() {this.timelineMode = new Array();}
- __init12() {this.timelineHoldMix = new Array();}
- __init13() {this.timelinesRotation = new Array();}
- reset () {
- this.previous = null;
- this.next = null;
- this.mixingFrom = null;
- this.mixingTo = null;
- this.animation = null;
- this.listener = null;
- this.timelineMode.length = 0;
- this.timelineHoldMix.length = 0;
- this.timelinesRotation.length = 0;
- }
- /** Uses {@link #trackTime} to compute the `animationTime`, which is between {@link #animationStart}
- * and {@link #animationEnd}. When the `trackTime` is 0, the `animationTime` is equal to the
- * `animationStart` time. */
- getAnimationTime () {
- if (this.loop) {
- let duration = this.animationEnd - this.animationStart;
- if (duration == 0) return this.animationStart;
- return (this.trackTime % duration) + this.animationStart;
- }
- return Math.min(this.trackTime + this.animationStart, this.animationEnd);
- }
- setAnimationLast(animationLast) {
- this.animationLast = animationLast;
- this.nextAnimationLast = animationLast;
- }
- /** Returns true if at least one loop has been completed.
- *
- * See {@link AnimationStateListener#complete()}. */
- isComplete () {
- return this.trackTime >= this.animationEnd - this.animationStart;
- }
- /** Resets the rotation directions for mixing this entry's rotate timelines. This can be useful to avoid bones rotating the
- * long way around when using {@link #alpha} and starting animations on other tracks.
- *
- * Mixing with {@link MixBlend#replace} involves finding a rotation between two others, which has two possible solutions:
- * the short way or the long way around. The two rotations likely change over time, so which direction is the short or long
- * way also changes. If the short way was always chosen, bones would flip to the other side when that direction became the
- * long way. TrackEntry chooses the short way the first time it is applied and remembers that direction. */
- resetRotationDirections () {
- this.timelinesRotation.length = 0;
- }
- getTrackComplete() {
- let duration = this.animationEnd - this.animationStart;
- if (duration != 0) {
- if (this.loop) return duration * (1 + ((this.trackTime / duration) | 0)); // Completion of next loop.
- if (this.trackTime < duration) return duration; // Before duration.
- }
- return this.trackTime; // Next update.
- }
- //deprecated stuff
-
-
-
-
- static __initStatic12() {this.deprecatedWarning1 = false;}
- static __initStatic13() {this.deprecatedWarning2 = false;}
- get time() {
- if (!TrackEntry$2.deprecatedWarning1) {
- TrackEntry$2.deprecatedWarning1 = true;
- console.warn("Spine Deprecation Warning: TrackEntry.time is deprecated, please use trackTime from now on.");
- }
- return this.trackTime;
- }
- set time(value) {
- if (!TrackEntry$2.deprecatedWarning1) {
- TrackEntry$2.deprecatedWarning1 = true;
- console.warn("Spine Deprecation Warning: TrackEntry.time is deprecated, please use trackTime from now on.");
- }
- this.trackTime = value;
- }
- get endTime() {
- if (!TrackEntry$2.deprecatedWarning2) {
- TrackEntry$2.deprecatedWarning2 = true;
- console.warn("Spine Deprecation Warning: TrackEntry.endTime is deprecated, please use trackEnd from now on.");
- }
- return this.trackTime;
- }
- set endTime(value) {
- if (!TrackEntry$2.deprecatedWarning2) {
- TrackEntry$2.deprecatedWarning2 = true;
- console.warn("Spine Deprecation Warning: TrackEntry.endTime is deprecated, please use trackEnd from now on.");
- }
- this.trackTime = value;
- }
- loopsCount() {
- return Math.floor(this.trackTime / this.trackEnd);
- }
- } TrackEntry$2.__initStatic12(); TrackEntry$2.__initStatic13();
- /**
- * @public
- */
- class EventQueue$2 {
- __init14() {this.objects = [];}
- __init15() {this.drainDisabled = false;}
-
- constructor(animState) {EventQueue$2.prototype.__init14.call(this);EventQueue$2.prototype.__init15.call(this);
- this.animState = animState;
- }
- start (entry) {
- this.objects.push(EventType$2.start);
- this.objects.push(entry);
- this.animState.animationsChanged = true;
- }
- interrupt (entry) {
- this.objects.push(EventType$2.interrupt);
- this.objects.push(entry);
- }
- end (entry) {
- this.objects.push(EventType$2.end);
- this.objects.push(entry);
- this.animState.animationsChanged = true;
- }
- dispose (entry) {
- this.objects.push(EventType$2.dispose);
- this.objects.push(entry);
- }
- complete (entry) {
- this.objects.push(EventType$2.complete);
- this.objects.push(entry);
- }
- event (entry, event) {
- this.objects.push(EventType$2.event);
- this.objects.push(entry);
- this.objects.push(event);
- }
- drain () {
- if (this.drainDisabled) return;
- this.drainDisabled = true;
- let objects = this.objects;
- let listeners = this.animState.listeners;
- for (let i = 0; i < objects.length; i += 2) {
- let type = objects[i] ;
- let entry = objects[i + 1] ;
- switch (type) {
- case EventType$2.start:
- if (entry.listener != null && entry.listener.start) entry.listener.start(entry);
- for (let ii = 0; ii < listeners.length; ii++)
- if (listeners[ii].start) listeners[ii].start(entry);
- break;
- case EventType$2.interrupt:
- if (entry.listener != null && entry.listener.interrupt) entry.listener.interrupt(entry);
- for (let ii = 0; ii < listeners.length; ii++)
- if (listeners[ii].interrupt) listeners[ii].interrupt(entry);
- break;
- case EventType$2.end:
- if (entry.listener != null && entry.listener.end) entry.listener.end(entry);
- for (let ii = 0; ii < listeners.length; ii++)
- if (listeners[ii].end) listeners[ii].end(entry);
- // Fall through.
- case EventType$2.dispose:
- if (entry.listener != null && entry.listener.dispose) entry.listener.dispose(entry);
- for (let ii = 0; ii < listeners.length; ii++)
- if (listeners[ii].dispose) listeners[ii].dispose(entry);
- this.animState.trackEntryPool.free(entry);
- break;
- case EventType$2.complete:
- if (entry.listener != null && entry.listener.complete) entry.listener.complete(entry);
- for (let ii = 0; ii < listeners.length; ii++)
- if (listeners[ii].complete) listeners[ii].complete(entry);
- break;
- case EventType$2.event:
- let event = objects[i++ + 2] ;
- if (entry.listener != null && entry.listener.event) entry.listener.event(entry, event);
- for (let ii = 0; ii < listeners.length; ii++)
- if (listeners[ii].event) listeners[ii].event(entry, event);
- break;
- }
- }
- this.clear();
- this.drainDisabled = false;
- }
- clear () {
- this.objects.length = 0;
- }
- }
- /**
- * @public
- */
- var EventType$2; (function (EventType) {
- const start = 0; EventType[EventType["start"] = start] = "start"; const interrupt = start + 1; EventType[EventType["interrupt"] = interrupt] = "interrupt"; const end = interrupt + 1; EventType[EventType["end"] = end] = "end"; const dispose = end + 1; EventType[EventType["dispose"] = dispose] = "dispose"; const complete = dispose + 1; EventType[EventType["complete"] = complete] = "complete"; const event = complete + 1; EventType[EventType["event"] = event] = "event";
- })(EventType$2 || (EventType$2 = {}));
- /** The interface to implement for receiving TrackEntry events. It is always safe to call AnimationState methods when receiving
- * events.
- *
- * See TrackEntry {@link TrackEntry#listener} and AnimationState
- * {@link AnimationState#addListener()}.
- * @public
- * */
- /**
- * @public
- */
- class AnimationStateAdapter$1 {
- start (entry) {
- }
- interrupt (entry) {
- }
- end (entry) {
- }
- dispose (entry) {
- }
- complete (entry) {
- }
- event (entry, event) {
- }
- }
- /** Stores mix (crossfade) durations to be applied when {@link AnimationState} animations are changed.
- * @public
- * */
- class AnimationStateData$2 {
- /** The SkeletonData to look up animations when they are specified by name. */
-
- __init() {this.animationToMixTime = { };}
- /** The mix duration to use when no mix duration has been defined between two animations. */
- __init2() {this.defaultMix = 0;}
- constructor (skeletonData) {AnimationStateData$2.prototype.__init.call(this);AnimationStateData$2.prototype.__init2.call(this);
- if (skeletonData == null) throw new Error("skeletonData cannot be null.");
- this.skeletonData = skeletonData;
- }
- /** Sets a mix duration by animation name.
- *
- * See {@link #setMixWith()}. */
- setMix (fromName, toName, duration) {
- let from = this.skeletonData.findAnimation(fromName);
- if (from == null) throw new Error("Animation not found: " + fromName);
- let to = this.skeletonData.findAnimation(toName);
- if (to == null) throw new Error("Animation not found: " + toName);
- this.setMixWith(from, to, duration);
- }
- /** Sets the mix duration when changing from the specified animation to the other.
- *
- * See {@link TrackEntry#mixDuration}. */
- setMixWith (from, to, duration) {
- if (from == null) throw new Error("from cannot be null.");
- if (to == null) throw new Error("to cannot be null.");
- let key = from.name + "." + to.name;
- this.animationToMixTime[key] = duration;
- }
- /** Returns the mix duration to use when changing from the specified animation to the other, or the {@link #defaultMix} if
- * no mix duration has been set. */
- getMix (from, to) {
- let key = from.name + "." + to.name;
- let value = this.animationToMixTime[key];
- return value === undefined ? this.defaultMix : value;
- }
- }
- /**
- * @public
- */
- class AtlasAttachmentLoader$2 {
-
- constructor(atlas) {
- this.atlas = atlas;
- }
- /** @return May be null to not load an attachment. */
- // @ts-ignore
- newRegionAttachment(skin, name, path) {
- let region = this.atlas.findRegion(path);
- if (region == null) throw new Error("Region not found in atlas: " + path + " (region attachment: " + name + ")");
- let attachment = new RegionAttachment$2(name);
- attachment.region = region;
- return attachment;
- }
- /** @return May be null to not load an attachment. */
- // @ts-ignore
- newMeshAttachment(skin, name, path) {
- let region = this.atlas.findRegion(path);
- if (region == null) throw new Error("Region not found in atlas: " + path + " (mesh attachment: " + name + ")");
- let attachment = new MeshAttachment$2(name);
- attachment.region = region;
- return attachment;
- }
- /** @return May be null to not load an attachment. */
- // @ts-ignore
- newBoundingBoxAttachment(skin, name) {
- return new BoundingBoxAttachment$2(name);
- }
- /** @return May be null to not load an attachment */
- // @ts-ignore
- newPathAttachment(skin, name) {
- return new PathAttachment$2(name);
- }
- // @ts-ignore
- newPointAttachment(skin, name) {
- return new PointAttachment$2(name);
- }
- // @ts-ignore
- newClippingAttachment(skin, name) {
- return new ClippingAttachment$2(name);
- }
- }
- /** Stores the setup pose for a {@link Bone}.
- * @public
- * */
- class BoneData$2 {
- /** The index of the bone in {@link Skeleton#getBones()}. */
-
- /** The name of the bone, which is unique across all bones in the skeleton. */
-
- /** @returns May be null. */
-
- /** The bone's length. */
-
- /** The local x translation. */
- __init() {this.x = 0;}
- /** The local y translation. */
- __init2() {this.y = 0;}
- /** The local rotation. */
- __init3() {this.rotation = 0;}
- /** The local scaleX. */
- __init4() {this.scaleX = 1;}
- /** The local scaleY. */
- __init5() {this.scaleY = 1;}
- /** The local shearX. */
- __init6() {this.shearX = 0;}
- /** The local shearX. */
- __init7() {this.shearY = 0;}
- /** The transform mode for how parent world transforms affect this bone. */
- __init8() {this.transformMode = TransformMode$2.Normal;}
- /** When true, {@link Skeleton#updateWorldTransform()} only updates this bone if the {@link Skeleton#skin} contains this
- * bone.
- * @see Skin#bones */
- __init9() {this.skinRequired = false;}
- /** The color of the bone as it was in Spine. Available only when nonessential data was exported. Bones are not usually
- * rendered at runtime. */
- __init10() {this.color = new Color();}
- constructor (index, name, parent) {BoneData$2.prototype.__init.call(this);BoneData$2.prototype.__init2.call(this);BoneData$2.prototype.__init3.call(this);BoneData$2.prototype.__init4.call(this);BoneData$2.prototype.__init5.call(this);BoneData$2.prototype.__init6.call(this);BoneData$2.prototype.__init7.call(this);BoneData$2.prototype.__init8.call(this);BoneData$2.prototype.__init9.call(this);BoneData$2.prototype.__init10.call(this);
- if (index < 0) throw new Error("index must be >= 0.");
- if (name == null) throw new Error("name cannot be null.");
- this.index = index;
- this.name = name;
- this.parent = parent;
- }
- }
- /** Determines how a bone inherits world transforms from parent bones.
- * @public
- * */
- var TransformMode$2; (function (TransformMode) {
- const Normal = 0; TransformMode[TransformMode["Normal"] = Normal] = "Normal"; const OnlyTranslation = Normal + 1; TransformMode[TransformMode["OnlyTranslation"] = OnlyTranslation] = "OnlyTranslation"; const NoRotationOrReflection = OnlyTranslation + 1; TransformMode[TransformMode["NoRotationOrReflection"] = NoRotationOrReflection] = "NoRotationOrReflection"; const NoScale = NoRotationOrReflection + 1; TransformMode[TransformMode["NoScale"] = NoScale] = "NoScale"; const NoScaleOrReflection = NoScale + 1; TransformMode[TransformMode["NoScaleOrReflection"] = NoScaleOrReflection] = "NoScaleOrReflection";
- })(TransformMode$2 || (TransformMode$2 = {}));
- /** Stores a bone's current pose.
- *
- * A bone has a local transform which is used to compute its world transform. A bone also has an applied transform, which is a
- * local transform that can be applied to compute the world transform. The local transform and applied transform may differ if a
- * constraint or application code modifies the world transform after it was computed from the local transform.
- * @public
- * */
- class Bone$2 {
- //be careful! Spine b,c is c,b in pixi matrix
- __init() {this.matrix = new math.Matrix();}
- get worldX() {
- return this.matrix.tx;
- }
- get worldY() {
- return this.matrix.ty;
- }
- /** The bone's setup pose data. */
-
- /** The skeleton this bone belongs to. */
-
- /** The parent bone, or null if this is the root bone. */
-
- /** The immediate children of this bone. */
- __init2() {this.children = new Array();}
- /** The local x translation. */
- __init3() {this.x = 0;}
- /** The local y translation. */
- __init4() {this.y = 0;}
- /** The local rotation in degrees, counter clockwise. */
- __init5() {this.rotation = 0;}
- /** The local scaleX. */
- __init6() {this.scaleX = 0;}
- /** The local scaleY. */
- __init7() {this.scaleY = 0;}
- /** The local shearX. */
- __init8() {this.shearX = 0;}
- /** The local shearY. */
- __init9() {this.shearY = 0;}
- /** The applied local x translation. */
- __init10() {this.ax = 0;}
- /** The applied local y translation. */
- __init11() {this.ay = 0;}
- /** The applied local rotation in degrees, counter clockwise. */
- __init12() {this.arotation = 0;}
- /** The applied local scaleX. */
- __init13() {this.ascaleX = 0;}
- /** The applied local scaleY. */
- __init14() {this.ascaleY = 0;}
- /** The applied local shearX. */
- __init15() {this.ashearX = 0;}
- /** The applied local shearY. */
- __init16() {this.ashearY = 0;}
- /** If true, the applied transform matches the world transform. If false, the world transform has been modified since it was
- * computed and {@link #updateAppliedTransform()} must be called before accessing the applied transform. */
- __init17() {this.appliedValid = false;}
- __init18() {this.sorted = false;}
- __init19() {this.active = false;}
- /** @param parent May be null. */
- constructor (data, skeleton, parent) {Bone$2.prototype.__init.call(this);Bone$2.prototype.__init2.call(this);Bone$2.prototype.__init3.call(this);Bone$2.prototype.__init4.call(this);Bone$2.prototype.__init5.call(this);Bone$2.prototype.__init6.call(this);Bone$2.prototype.__init7.call(this);Bone$2.prototype.__init8.call(this);Bone$2.prototype.__init9.call(this);Bone$2.prototype.__init10.call(this);Bone$2.prototype.__init11.call(this);Bone$2.prototype.__init12.call(this);Bone$2.prototype.__init13.call(this);Bone$2.prototype.__init14.call(this);Bone$2.prototype.__init15.call(this);Bone$2.prototype.__init16.call(this);Bone$2.prototype.__init17.call(this);Bone$2.prototype.__init18.call(this);Bone$2.prototype.__init19.call(this);
- if (data == null) throw new Error("data cannot be null.");
- if (skeleton == null) throw new Error("skeleton cannot be null.");
- this.data = data;
- this.skeleton = skeleton;
- this.parent = parent;
- this.setToSetupPose();
- }
- /** Returns false when the bone has not been computed because {@link BoneData#skinRequired} is true and the
- * {@link Skeleton#skin active skin} does not {@link Skin#bones contain} this bone. */
- isActive () {
- return this.active;
- }
- /** Same as {@link #updateWorldTransform()}. This method exists for Bone to implement {@link Updatable}. */
- update () {
- this.updateWorldTransformWith(this.x, this.y, this.rotation, this.scaleX, this.scaleY, this.shearX, this.shearY);
- }
- /** Computes the world transform using the parent bone and this bone's local transform.
- *
- * See {@link #updateWorldTransformWith()}. */
- updateWorldTransform () {
- this.updateWorldTransformWith(this.x, this.y, this.rotation, this.scaleX, this.scaleY, this.shearX, this.shearY);
- }
- /** Computes the world transform using the parent bone and the specified local transform. Child bones are not updated.
- *
- * See [World transforms](http://esotericsoftware.com/spine-runtime-skeletons#World-transforms) in the Spine
- * Runtimes Guide. */
- updateWorldTransformWith (x, y, rotation, scaleX, scaleY, shearX, shearY) {
- this.ax = x;
- this.ay = y;
- this.arotation = rotation;
- this.ascaleX = scaleX;
- this.ascaleY = scaleY;
- this.ashearX = shearX;
- this.ashearY = shearY;
- this.appliedValid = true;
- let parent = this.parent;
- let m = this.matrix;
- let sx = this.skeleton.scaleX;
- let sy = settings.yDown? -this.skeleton.scaleY : this.skeleton.scaleY;
- if (parent == null) { // Root bone.
- let skeleton = this.skeleton;
- let rotationY = rotation + 90 + shearY;
- m.a = MathUtils.cosDeg(rotation + shearX) * scaleX * sx;
- m.c = MathUtils.cosDeg(rotationY) * scaleY * sx;
- m.b = MathUtils.sinDeg(rotation + shearX) * scaleX * sy;
- m.d = MathUtils.sinDeg(rotationY) * scaleY * sy;
- m.tx = x * sx + skeleton.x;
- m.ty = y * sy + skeleton.y;
- return;
- }
- let pa = parent.matrix.a, pb = parent.matrix.c, pc = parent.matrix.b, pd = parent.matrix.d;
- m.tx = pa * x + pb * y + parent.matrix.tx;
- m.ty = pc * x + pd * y + parent.matrix.ty;
- switch (this.data.transformMode) {
- case TransformMode$2.Normal: {
- let rotationY = rotation + 90 + shearY;
- let la = MathUtils.cosDeg(rotation + shearX) * scaleX;
- let lb = MathUtils.cosDeg(rotationY) * scaleY;
- let lc = MathUtils.sinDeg(rotation + shearX) * scaleX;
- let ld = MathUtils.sinDeg(rotationY) * scaleY;
- m.a = pa * la + pb * lc;
- m.c = pa * lb + pb * ld;
- m.b = pc * la + pd * lc;
- m.d = pc * lb + pd * ld;
- return;
- }
- case TransformMode$2.OnlyTranslation: {
- let rotationY = rotation + 90 + shearY;
- m.a = MathUtils.cosDeg(rotation + shearX) * scaleX;
- m.c = MathUtils.cosDeg(rotationY) * scaleY;
- m.b = MathUtils.sinDeg(rotation + shearX) * scaleX;
- m.d = MathUtils.sinDeg(rotationY) * scaleY;
- break;
- }
- case TransformMode$2.NoRotationOrReflection: {
- let s = pa * pa + pc * pc;
- let prx = 0;
- if (s > 0.0001) {
- s = Math.abs(pa * pd - pb * pc) / s;
- pa /= this.skeleton.scaleX;
- pc /= this.skeleton.scaleY;
- pb = pc * s;
- pd = pa * s;
- prx = Math.atan2(pc, pa) * MathUtils.radDeg;
- } else {
- pa = 0;
- pc = 0;
- prx = 90 - Math.atan2(pd, pb) * MathUtils.radDeg;
- }
- let rx = rotation + shearX - prx;
- let ry = rotation + shearY - prx + 90;
- let la = MathUtils.cosDeg(rx) * scaleX;
- let lb = MathUtils.cosDeg(ry) * scaleY;
- let lc = MathUtils.sinDeg(rx) * scaleX;
- let ld = MathUtils.sinDeg(ry) * scaleY;
- m.a = pa * la - pb * lc;
- m.c = pa * lb - pb * ld;
- m.b = pc * la + pd * lc;
- m.d = pc * lb + pd * ld;
- break;
- }
- case TransformMode$2.NoScale:
- case TransformMode$2.NoScaleOrReflection: {
- let cos = MathUtils.cosDeg(rotation);
- let sin = MathUtils.sinDeg(rotation);
- let za = (pa * cos + pb * sin) / sx;
- let zc = (pc * cos + pd * sin) / sy;
- let s = Math.sqrt(za * za + zc * zc);
- if (s > 0.00001) s = 1 / s;
- za *= s;
- zc *= s;
- s = Math.sqrt(za * za + zc * zc);
- if (
- this.data.transformMode == TransformMode$2.NoScale
- && (pa * pd - pb * pc < 0) != (settings.yDown?
- (this.skeleton.scaleX < 0 != this.skeleton.scaleY > 0) :
- (this.skeleton.scaleX < 0 != this.skeleton.scaleY < 0))
- ) s = -s;
- let r = Math.PI / 2 + Math.atan2(zc, za);
- let zb = Math.cos(r) * s;
- let zd = Math.sin(r) * s;
- let la = MathUtils.cosDeg(shearX) * scaleX;
- let lb = MathUtils.cosDeg(90 + shearY) * scaleY;
- let lc = MathUtils.sinDeg(shearX) * scaleX;
- let ld = MathUtils.sinDeg(90 + shearY) * scaleY;
- m.a = za * la + zb * lc;
- m.c = za * lb + zb * ld;
- m.b = zc * la + zd * lc;
- m.d = zc * lb + zd * ld;
- break;
- }
- }
- m.a *= sx;
- m.c *= sx;
- m.b *= sy;
- m.d *= sy;
- }
- /** Sets this bone's local transform to the setup pose. */
- setToSetupPose () {
- let data = this.data;
- this.x = data.x;
- this.y = data.y;
- this.rotation = data.rotation;
- this.scaleX = data.scaleX;
- this.scaleY = data.scaleY;
- this.shearX = data.shearX;
- this.shearY = data.shearY;
- }
- /** The world rotation for the X axis, calculated using {@link #a} and {@link #c}. */
- getWorldRotationX () {
- return Math.atan2(this.matrix.b, this.matrix.a) * MathUtils.radDeg;
- }
- /** The world rotation for the Y axis, calculated using {@link #b} and {@link #d}. */
- getWorldRotationY () {
- return Math.atan2(this.matrix.d, this.matrix.c) * MathUtils.radDeg;
- }
- /** The magnitude (always positive) of the world scale X, calculated using {@link #a} and {@link #c}. */
- getWorldScaleX () {
- let m = this.matrix;
- return Math.sqrt(m.a * m.a + m.c * m.c);
- }
- /** The magnitude (always positive) of the world scale Y, calculated using {@link #b} and {@link #d}. */
- getWorldScaleY () {
- let m = this.matrix;
- return Math.sqrt(m.b * m.b + m.d * m.d);
- }
- /** Computes the applied transform values from the world transform. This allows the applied transform to be accessed after the
- * world transform has been modified (by a constraint, {@link #rotateWorld()}, etc).
- *
- * If {@link #updateWorldTransform()} has been called for a bone and {@link #appliedValid} is false, then
- * {@link #updateAppliedTransform()} must be called before accessing the applied transform.
- *
- * Some information is ambiguous in the world transform, such as -1,-1 scale versus 180 rotation. The applied transform after
- * calling this method is equivalent to the local tranform used to compute the world transform, but may not be identical. */
- updateAppliedTransform () {
- this.appliedValid = true;
- let parent = this.parent;
- let m = this.matrix;
- if (parent == null) {
- this.ax = m.tx;
- this.ay = m.ty;
- this.arotation = Math.atan2(m.b, m.a) * MathUtils.radDeg;
- this.ascaleX = Math.sqrt(m.a * m.a + m.b * m.b);
- this.ascaleY = Math.sqrt(m.c * m.c + m.d * m.d);
- this.ashearX = 0;
- this.ashearY = Math.atan2(m.a * m.c + m.b * m.d, m.a * m.d - m.b * m.c) * MathUtils.radDeg;
- return;
- }
- let pm = parent.matrix;
- let pid = 1 / (pm.a * pm.d - pm.b * pm.c);
- let dx = m.tx - pm.tx, dy = m.ty - pm.ty;
- this.ax = (dx * pm.d * pid - dy * pm.c * pid);
- this.ay = (dy * pm.a * pid - dx * pm.b * pid);
- let ia = pid * pm.d;
- let id = pid * pm.a;
- let ib = pid * pm.c;
- let ic = pid * pm.b;
- let ra = ia * m.a - ib * m.b;
- let rb = ia * m.c - ib * m.d;
- let rc = id * m.b - ic * m.a;
- let rd = id * m.d - ic * m.c;
- this.ashearX = 0;
- this.ascaleX = Math.sqrt(ra * ra + rc * rc);
- if (this.ascaleX > 0.0001) {
- let det = ra * rd - rb * rc;
- this.ascaleY = det / this.ascaleX;
- this.ashearY = Math.atan2(ra * rb + rc * rd, det) * MathUtils.radDeg;
- this.arotation = Math.atan2(rc, ra) * MathUtils.radDeg;
- } else {
- this.ascaleX = 0;
- this.ascaleY = Math.sqrt(rb * rb + rd * rd);
- this.ashearY = 0;
- this.arotation = 90 - Math.atan2(rd, rb) * MathUtils.radDeg;
- }
- }
- /** Transforms a point from world coordinates to the bone's local coordinates. */
- worldToLocal(world) {
- let m = this.matrix;
- let a = m.a, b = m.c, c = m.b, d = m.d;
- let invDet = 1 / (a * d - b * c);
- let x = world.x - m.tx, y = world.y - m.ty;
- world.x = (x * d * invDet - y * b * invDet);
- world.y = (y * a * invDet - x * c * invDet);
- return world;
- }
- /** Transforms a point from the bone's local coordinates to world coordinates. */
- localToWorld(local) {
- let m = this.matrix;
- let x = local.x, y = local.y;
- local.x = x * m.a + y * m.c + m.tx;
- local.y = x * m.b + y * m.d + m.ty;
- return local;
- }
- /** Transforms a world rotation to a local rotation. */
- worldToLocalRotation (worldRotation) {
- let sin = MathUtils.sinDeg(worldRotation), cos = MathUtils.cosDeg(worldRotation);
- let mat = this.matrix;
- return Math.atan2(mat.a * sin - mat.b * cos, mat.d * cos - mat.c * sin) * MathUtils.radDeg;
- }
- /** Transforms a local rotation to a world rotation. */
- localToWorldRotation (localRotation) {
- //TODO: check same place in 3.8
- localRotation -= this.rotation - this.shearX;
- let sin = MathUtils.sinDeg(localRotation), cos = MathUtils.cosDeg(localRotation);
- let mat = this.matrix;
- return Math.atan2(cos * mat.b + sin * mat.d, cos * mat.a + sin * mat.c) * MathUtils.radDeg;
- }
- /** Rotates the world transform the specified amount and sets {@link #appliedValid} to false.
- * {@link #updateWorldTransform()} will need to be called on any child bones, recursively, and any constraints reapplied. */
- rotateWorld (degrees) {
- let mat = this.matrix;
- let a = mat.a, b = mat.c, c = mat.b, d = mat.d;
- let cos = MathUtils.cosDeg(degrees), sin = MathUtils.sinDeg(degrees);
- mat.a = cos * a - sin * c;
- mat.c = cos * b - sin * d;
- mat.b = sin * a + cos * c;
- mat.d = sin * b + cos * d;
- this.appliedValid = false;
- }
- }
- /** The base class for all constraint datas.
- * @public
- * */
- class ConstraintData$1 {
- constructor( name, order, skinRequired) {this.name = name;this.order = order;this.skinRequired = skinRequired; }
- }
- /** Stores the current pose values for an {@link Event}.
- *
- * See Timeline {@link Timeline#apply()},
- * AnimationStateListener {@link AnimationStateListener#event()}, and
- * [Events](http://esotericsoftware.com/spine-events) in the Spine User Guide.
- * @public
- * */
- class Event$2 {
-
-
-
-
-
-
-
- constructor (time, data) {
- if (data == null) throw new Error("data cannot be null.");
- this.time = time;
- this.data = data;
- }
- }
- /** Stores the setup pose values for an {@link Event}.
- *
- * See [Events](http://esotericsoftware.com/spine-events) in the Spine User Guide.
- * @public
- * */
- class EventData$2 {
-
-
-
-
-
-
-
- constructor (name) {
- this.name = name;
- }
- }
- /** Stores the current pose for an IK constraint. An IK constraint adjusts the rotation of 1 or 2 constrained bones so the tip of
- * the last bone is as close to the target bone as possible.
- *
- * See [IK constraints](http://esotericsoftware.com/spine-ik-constraints) in the Spine User Guide.
- * @public
- * */
- class IkConstraint$2 {
- /** The IK constraint's setup pose data. */
-
- /** The bones that will be modified by this IK constraint. */
-
- /** The bone that is the IK target. */
-
- /** Controls the bend direction of the IK bones, either 1 or -1. */
- __init() {this.bendDirection = 0;}
- /** When true and only a single bone is being constrained, if the target is too close, the bone is scaled to reach it. */
- __init2() {this.compress = false;}
- /** When true, if the target is out of range, the parent bone is scaled to reach it. If more than one bone is being constrained
- * and the parent bone has local nonuniform scale, stretch is not applied. */
- __init3() {this.stretch = false;}
- /** A percentage (0-1) that controls the mix between the constrained and unconstrained rotations. */
- __init4() {this.mix = 1;}
- /** For two bone IK, the distance from the maximum reach of the bones that rotation will slow. */
- __init5() {this.softness = 0;}
- __init6() {this.active = false;}
- constructor (data, skeleton) {IkConstraint$2.prototype.__init.call(this);IkConstraint$2.prototype.__init2.call(this);IkConstraint$2.prototype.__init3.call(this);IkConstraint$2.prototype.__init4.call(this);IkConstraint$2.prototype.__init5.call(this);IkConstraint$2.prototype.__init6.call(this);
- if (data == null) throw new Error("data cannot be null.");
- if (skeleton == null) throw new Error("skeleton cannot be null.");
- this.data = data;
- this.mix = data.mix;
- this.softness = data.softness;
- this.bendDirection = data.bendDirection;
- this.compress = data.compress;
- this.stretch = data.stretch;
- this.bones = new Array();
- for (let i = 0; i < data.bones.length; i++)
- this.bones.push(skeleton.findBone(data.bones[i].name));
- this.target = skeleton.findBone(data.target.name);
- }
- isActive () {
- return this.active;
- }
- update () {
- if (this.mix == 0) return;
- let target = this.target;
- let bones = this.bones;
- switch (bones.length) {
- case 1:
- this.apply1(bones[0], target.worldX, target.worldY, this.compress, this.stretch, this.data.uniform, this.mix);
- break;
- case 2:
- this.apply2(bones[0], bones[1], target.worldX, target.worldY, this.bendDirection, this.stretch, this.softness, this.mix);
- break;
- }
- }
- /** Applies 1 bone IK. The target is specified in the world coordinate system. */
- apply1 (bone, targetX, targetY, compress, stretch, uniform, alpha) {
- if (!bone.appliedValid) bone.updateAppliedTransform();
- let p = bone.parent.matrix;
- let pa = p.a, pb = p.c, pc = p.b, pd = p.d;
- let rotationIK = -bone.ashearX - bone.arotation, tx = 0, ty = 0;
- switch(bone.data.transformMode) {
- case TransformMode$2.OnlyTranslation:
- tx = targetX - bone.worldX;
- ty = targetY - bone.worldY;
- break;
- case TransformMode$2.NoRotationOrReflection:
- let s = Math.abs(pa * pd - pb * pc) / (pa * pa + pc * pc);
- let sa = pa / bone.skeleton.scaleX;
- let sc = pc / bone.skeleton.scaleY;
- pb = -sc * s * bone.skeleton.scaleX;
- pd = sa * s * bone.skeleton.scaleY;
- rotationIK += Math.atan2(sc, sa) * MathUtils.radDeg;
- // Fall through
- default:
- let x = targetX - p.tx, y = targetY - p.ty;
- let d = pa * pd - pb * pc;
- tx = (x * pd - y * pb) / d - bone.ax;
- ty = (y * pa - x * pc) / d - bone.ay;
- }
- rotationIK += Math.atan2(ty, tx) * MathUtils.radDeg;
- if (bone.ascaleX < 0) rotationIK += 180;
- if (rotationIK > 180)
- rotationIK -= 360;
- else if (rotationIK < -180) rotationIK += 360;
- let sx = bone.ascaleX, sy = bone.ascaleY;
- if (compress || stretch) {
- switch (bone.data.transformMode) {
- case TransformMode$2.NoScale:
- case TransformMode$2.NoScaleOrReflection:
- tx = targetX - bone.worldX;
- ty = targetY - bone.worldY;
- }
- let b = bone.data.length * sx, dd = Math.sqrt(tx * tx + ty * ty);
- if ((compress && dd < b) || (stretch && dd > b) && b > 0.0001) {
- let s = (dd / b - 1) * alpha + 1;
- sx *= s;
- if (uniform) sy *= s;
- }
- }
- bone.updateWorldTransformWith(bone.ax, bone.ay, bone.arotation + rotationIK * alpha, sx, sy, bone.ashearX,
- bone.ashearY);
- }
- /** Applies 2 bone IK. The target is specified in the world coordinate system.
- * @param child A direct descendant of the parent bone. */
- apply2 (parent, child, targetX, targetY, bendDir, stretch, softness, alpha) {
- if (!parent.appliedValid) parent.updateAppliedTransform();
- if (!child.appliedValid) child.updateAppliedTransform();
- let px = parent.ax, py = parent.ay, psx = parent.ascaleX, sx = psx, psy = parent.ascaleY, csx = child.ascaleX;
- let pmat = parent.matrix;
- let os1 = 0, os2 = 0, s2 = 0;
- if (psx < 0) {
- psx = -psx;
- os1 = 180;
- s2 = -1;
- } else {
- os1 = 0;
- s2 = 1;
- }
- if (psy < 0) {
- psy = -psy;
- s2 = -s2;
- }
- if (csx < 0) {
- csx = -csx;
- os2 = 180;
- } else
- os2 = 0;
- let cx = child.ax, cy = 0, cwx = 0, cwy = 0, a = pmat.a, b = pmat.c, c = pmat.b, d = pmat.d;
- let u = Math.abs(psx - psy) <= 0.0001;
- if (!u) {
- cy = 0;
- cwx = a * cx + pmat.tx;
- cwy = c * cx + pmat.ty;
- } else {
- cy = child.ay;
- cwx = a * cx + b * cy + pmat.tx;
- cwy = c * cx + d * cy + pmat.ty;
- }
- let pp = parent.parent.matrix;
- a = pp.a;
- b = pp.c;
- c = pp.b;
- d = pp.d;
- let id = 1 / (a * d - b * c), x = cwx - pp.tx, y = cwy - pp.ty;
- let dx = (x * d - y * b) * id - px, dy = (y * a - x * c) * id - py;
- let l1 = Math.sqrt(dx * dx + dy * dy), l2 = child.data.length * csx, a1, a2;
- if (l1 < 0.0001) {
- this.apply1(parent, targetX, targetY, false, stretch, false, alpha);
- child.updateWorldTransformWith(cx, cy, 0, child.ascaleX, child.ascaleY, child.ashearX, child.ashearY);
- return;
- }
- x = targetX - pp.tx;
- y = targetY - pp.ty;
- let tx = (x * d - y * b) * id - px, ty = (y * a - x * c) * id - py;
- let dd = tx * tx + ty * ty;
- if (softness != 0) {
- softness *= psx * (csx + 1) / 2;
- let td = Math.sqrt(dd), sd = td - l1 - l2 * psx + softness;
- if (sd > 0) {
- let p = Math.min(1, sd / (softness * 2)) - 1;
- p = (sd - softness * (1 - p * p)) / td;
- tx -= p * tx;
- ty -= p * ty;
- dd = tx * tx + ty * ty;
- }
- }
- outer:
- if (u) {
- l2 *= psx;
- let cos = (dd - l1 * l1 - l2 * l2) / (2 * l1 * l2);
- if (cos < -1)
- cos = -1;
- else if (cos > 1) {
- cos = 1;
- if (stretch) sx *= (Math.sqrt(dd) / (l1 + l2) - 1) * alpha + 1;
- }
- a2 = Math.acos(cos) * bendDir;
- a = l1 + l2 * cos;
- b = l2 * Math.sin(a2);
- a1 = Math.atan2(ty * a - tx * b, tx * a + ty * b);
- } else {
- a = psx * l2;
- b = psy * l2;
- let aa = a * a, bb = b * b, ta = Math.atan2(ty, tx);
- c = bb * l1 * l1 + aa * dd - aa * bb;
- let c1 = -2 * bb * l1, c2 = bb - aa;
- d = c1 * c1 - 4 * c2 * c;
- if (d >= 0) {
- let q = Math.sqrt(d);
- if (c1 < 0) q = -q;
- q = -(c1 + q) / 2;
- let r0 = q / c2, r1 = c / q;
- let r = Math.abs(r0) < Math.abs(r1) ? r0 : r1;
- if (r * r <= dd) {
- y = Math.sqrt(dd - r * r) * bendDir;
- a1 = ta - Math.atan2(y, r);
- a2 = Math.atan2(y / psy, (r - l1) / psx);
- break outer;
- }
- }
- let minAngle = MathUtils.PI, minX = l1 - a, minDist = minX * minX, minY = 0;
- let maxAngle = 0, maxX = l1 + a, maxDist = maxX * maxX, maxY = 0;
- c = -a * l1 / (aa - bb);
- if (c >= -1 && c <= 1) {
- c = Math.acos(c);
- x = a * Math.cos(c) + l1;
- y = b * Math.sin(c);
- d = x * x + y * y;
- if (d < minDist) {
- minAngle = c;
- minDist = d;
- minX = x;
- minY = y;
- }
- if (d > maxDist) {
- maxAngle = c;
- maxDist = d;
- maxX = x;
- maxY = y;
- }
- }
- if (dd <= (minDist + maxDist) / 2) {
- a1 = ta - Math.atan2(minY * bendDir, minX);
- a2 = minAngle * bendDir;
- } else {
- a1 = ta - Math.atan2(maxY * bendDir, maxX);
- a2 = maxAngle * bendDir;
- }
- }
- let os = Math.atan2(cy, cx) * s2;
- let rotation = parent.arotation;
- a1 = (a1 - os) * MathUtils.radDeg + os1 - rotation;
- if (a1 > 180)
- a1 -= 360;
- else if (a1 < -180) a1 += 360;
- parent.updateWorldTransformWith(px, py, rotation + a1 * alpha, sx, parent.ascaleY, 0, 0);
- rotation = child.arotation;
- a2 = ((a2 + os) * MathUtils.radDeg - child.ashearX) * s2 + os2 - rotation;
- if (a2 > 180)
- a2 -= 360;
- else if (a2 < -180) a2 += 360;
- child.updateWorldTransformWith(cx, cy, rotation + a2 * alpha, child.ascaleX, child.ascaleY, child.ashearX, child.ashearY);
- }
- }
- /** Stores the setup pose for an {@link IkConstraint}.
- * <p>
- * See [IK constraints](http://esotericsoftware.com/spine-ik-constraints) in the Spine User Guide.
- * @public
- * */
- class IkConstraintData$2 extends ConstraintData$1 {
- /** The bones that are constrained by this IK constraint. */
- __init() {this.bones = new Array();}
- /** The bone that is the IK target. */
-
- /** Controls the bend direction of the IK bones, either 1 or -1. */
- __init2() {this.bendDirection = 1;}
- /** When true and only a single bone is being constrained, if the target is too close, the bone is scaled to reach it. */
- __init3() {this.compress = false;}
- /** When true, if the target is out of range, the parent bone is scaled to reach it. If more than one bone is being constrained
- * and the parent bone has local nonuniform scale, stretch is not applied. */
- __init4() {this.stretch = false;}
- /** When true, only a single bone is being constrained, and {@link #getCompress()} or {@link #getStretch()} is used, the bone
- * is scaled on both the X and Y axes. */
- __init5() {this.uniform = false;}
- /** A percentage (0-1) that controls the mix between the constrained and unconstrained rotations. */
- __init6() {this.mix = 1;}
- /** For two bone IK, the distance from the maximum reach of the bones that rotation will slow. */
- __init7() {this.softness = 0;}
- constructor (name) {
- super(name, 0, false);IkConstraintData$2.prototype.__init.call(this);IkConstraintData$2.prototype.__init2.call(this);IkConstraintData$2.prototype.__init3.call(this);IkConstraintData$2.prototype.__init4.call(this);IkConstraintData$2.prototype.__init5.call(this);IkConstraintData$2.prototype.__init6.call(this);IkConstraintData$2.prototype.__init7.call(this); }
- }
- /** Stores the setup pose for a {@link PathConstraint}.
- *
- * See [Path constraints](http://esotericsoftware.com/spine-path-constraints) in the Spine User Guide.
- * @public
- * */
- class PathConstraintData$2 extends ConstraintData$1 {
- /** The bones that will be modified by this path constraint. */
- __init() {this.bones = new Array();}
- /** The slot whose path attachment will be used to constrained the bones. */
-
- /** The mode for positioning the first bone on the path. */
-
- /** The mode for positioning the bones after the first bone on the path. */
-
- /** The mode for adjusting the rotation of the bones. */
-
- /** An offset added to the constrained bone rotation. */
-
- /** The position along the path. */
-
- /** The spacing between bones. */
-
- __init2() {this.mixRotate = 0;}
- __init3() {this.mixX = 0;}
- __init4() {this.mixY = 0;}
- constructor (name) {
- super(name, 0, false);PathConstraintData$2.prototype.__init.call(this);PathConstraintData$2.prototype.__init2.call(this);PathConstraintData$2.prototype.__init3.call(this);PathConstraintData$2.prototype.__init4.call(this); }
- }
- /** Controls how the first bone is positioned along the path.
- *
- * See [Position mode](http://esotericsoftware.com/spine-path-constraints#Position-mode) in the Spine User Guide.
- * @public
- * */
- var PositionMode$2; (function (PositionMode) {
- const Fixed = 0; PositionMode[PositionMode["Fixed"] = Fixed] = "Fixed"; const Percent = Fixed + 1; PositionMode[PositionMode["Percent"] = Percent] = "Percent";
- })(PositionMode$2 || (PositionMode$2 = {}));
- /** Controls how bones after the first bone are positioned along the path.
- *
- * [Spacing mode](http://esotericsoftware.com/spine-path-constraints#Spacing-mode) in the Spine User Guide.
- * @public
- * */
- var SpacingMode$2; (function (SpacingMode) {
- const Length = 0; SpacingMode[SpacingMode["Length"] = Length] = "Length"; const Fixed = Length + 1; SpacingMode[SpacingMode["Fixed"] = Fixed] = "Fixed"; const Percent = Fixed + 1; SpacingMode[SpacingMode["Percent"] = Percent] = "Percent"; const Proportional = Percent + 1; SpacingMode[SpacingMode["Proportional"] = Proportional] = "Proportional";
- })(SpacingMode$2 || (SpacingMode$2 = {}));
- /** Controls how bones are rotated, translated, and scaled to match the path.
- *
- * [Rotate mode](http://esotericsoftware.com/spine-path-constraints#Rotate-mod) in the Spine User Guide.
- * @public
- * */
- var RotateMode$2; (function (RotateMode) {
- const Tangent = 0; RotateMode[RotateMode["Tangent"] = Tangent] = "Tangent"; const Chain = Tangent + 1; RotateMode[RotateMode["Chain"] = Chain] = "Chain"; const ChainScale = Chain + 1; RotateMode[RotateMode["ChainScale"] = ChainScale] = "ChainScale";
- })(RotateMode$2 || (RotateMode$2 = {}));
- /** Stores the current pose for a path constraint. A path constraint adjusts the rotation, translation, and scale of the
- * constrained bones so they follow a {@link PathAttachment}.
- *
- * See [Path constraints](http://esotericsoftware.com/spine-path-constraints) in the Spine User Guide.
- * @public
- * */
- class PathConstraint$2 {
- static __initStatic() {this.NONE = -1;} static __initStatic2() {this.BEFORE = -2;} static __initStatic3() {this.AFTER = -3;}
- static __initStatic4() {this.epsilon = 0.00001;}
- /** The path constraint's setup pose data. */
-
- /** The bones that will be modified by this path constraint. */
-
- /** The slot whose path attachment will be used to constrained the bones. */
-
- /** The position along the path. */
- __init() {this.position = 0;}
- /** The spacing between bones. */
- __init2() {this.spacing = 0;}
- __init3() {this.mixRotate = 0;}
- __init4() {this.mixX = 0;}
- __init5() {this.mixY = 0;}
- __init6() {this.spaces = new Array();} __init7() {this.positions = new Array();}
- __init8() {this.world = new Array();} __init9() {this.curves = new Array();} __init10() {this.lengths = new Array();}
- __init11() {this.segments = new Array();}
- __init12() {this.active = false;}
- constructor (data, skeleton) {PathConstraint$2.prototype.__init.call(this);PathConstraint$2.prototype.__init2.call(this);PathConstraint$2.prototype.__init3.call(this);PathConstraint$2.prototype.__init4.call(this);PathConstraint$2.prototype.__init5.call(this);PathConstraint$2.prototype.__init6.call(this);PathConstraint$2.prototype.__init7.call(this);PathConstraint$2.prototype.__init8.call(this);PathConstraint$2.prototype.__init9.call(this);PathConstraint$2.prototype.__init10.call(this);PathConstraint$2.prototype.__init11.call(this);PathConstraint$2.prototype.__init12.call(this);
- if (data == null) throw new Error("data cannot be null.");
- if (skeleton == null) throw new Error("skeleton cannot be null.");
- this.data = data;
- this.bones = new Array();
- for (let i = 0, n = data.bones.length; i < n; i++)
- this.bones.push(skeleton.findBone(data.bones[i].name));
- this.target = skeleton.findSlot(data.target.name);
- this.position = data.position;
- this.spacing = data.spacing;
- this.mixRotate = data.mixRotate;
- this.mixX = data.mixX;
- this.mixY = data.mixY;
- }
- isActive () {
- return this.active;
- }
- update () {
- let attachment = this.target.getAttachment();
- if (!(attachment instanceof PathAttachment$2)) return;
- let mixRotate = this.mixRotate, mixX = this.mixX, mixY = this.mixY;
- if (mixRotate == 0 && mixX == 0 && mixY == 0) return;
- let data = this.data;
- let tangents = data.rotateMode == RotateMode$2.Tangent, scale = data.rotateMode == RotateMode$2.ChainScale;
- let boneCount = this.bones.length, spacesCount = tangents ? boneCount : boneCount + 1;
- let bones = this.bones;
- let spaces = Utils.setArraySize(this.spaces, spacesCount), lengths = scale ? this.lengths = Utils.setArraySize(this.lengths, boneCount) : null;
- let spacing = this.spacing;
- switch (data.spacingMode) {
- case SpacingMode$2.Percent:
- if (scale) {
- for (let i = 0, n = spacesCount - 1; i < n; i++) {
- let bone = bones[i];
- let setupLength = bone.data.length;
- if (setupLength < PathConstraint$2.epsilon)
- lengths[i] = 0;
- else {
- let x = setupLength * bone.matrix.a, y = setupLength * bone.matrix.b;
- lengths[i] = Math.sqrt(x * x + y * y);
- }
- }
- }
- Utils.arrayFill(spaces, 1, spacesCount, spacing);
- break;
- case SpacingMode$2.Proportional:
- let sum = 0;
- for (let i = 0; i < boneCount;) {
- let bone = bones[i];
- let setupLength = bone.data.length;
- if (setupLength < PathConstraint$2.epsilon) {
- if (scale) lengths[i] = 0;
- spaces[++i] = spacing;
- } else {
- let x = setupLength * bone.matrix.a, y = setupLength * bone.matrix.b;
- let length = Math.sqrt(x * x + y * y);
- if (scale) lengths[i] = length;
- spaces[++i] = length;
- sum += length;
- }
- }
- if (sum > 0) {
- sum = spacesCount / sum * spacing;
- for (let i = 1; i < spacesCount; i++)
- spaces[i] *= sum;
- }
- break;
- default:
- let lengthSpacing = data.spacingMode == SpacingMode$2.Length;
- for (let i = 0, n = spacesCount - 1; i < n;) {
- let bone = bones[i];
- let setupLength = bone.data.length;
- if (setupLength < PathConstraint$2.epsilon) {
- if (scale) lengths[i] = 0;
- spaces[++i] = spacing;
- } else {
- let x = setupLength * bone.matrix.a, y = setupLength * bone.matrix.b;
- let length = Math.sqrt(x * x + y * y);
- if (scale) lengths[i] = length;
- spaces[++i] = (lengthSpacing ? setupLength + spacing : spacing) * length / setupLength;
- }
- }
- }
- let positions = this.computeWorldPositions(attachment, spacesCount, tangents);
- let boneX = positions[0], boneY = positions[1], offsetRotation = data.offsetRotation;
- let tip = false;
- if (offsetRotation == 0)
- tip = data.rotateMode == RotateMode$2.Chain;
- else {
- tip = false;
- let p = this.target.bone.matrix;
- offsetRotation *= p.a * p.d - p.b * p.c > 0 ? MathUtils.degRad : -MathUtils.degRad;
- }
- for (let i = 0, p = 3; i < boneCount; i++, p += 3) {
- let bone = bones[i];
- let mat = bone.matrix;
- mat.tx += (boneX - mat.tx) * mixX;
- mat.ty += (boneY - mat.ty) * mixY;
- let x = positions[p], y = positions[p + 1], dx = x - boneX, dy = y - boneY;
- if (scale) {
- let length = lengths[i];
- if (length != 0) {
- let s = (Math.sqrt(dx * dx + dy * dy) / length - 1) * mixRotate + 1;
- mat.a *= s;
- mat.b *= s;
- }
- }
- boneX = x;
- boneY = y;
- if (mixRotate) {
- let a = mat.a, b = mat.c, c = mat.b, d = mat.d, r = 0, cos = 0, sin = 0;
- if (tangents)
- r = positions[p - 1];
- else if (spaces[i + 1] == 0)
- r = positions[p + 2];
- else
- r = Math.atan2(dy, dx);
- r -= Math.atan2(c, a);
- if (tip) {
- cos = Math.cos(r);
- sin = Math.sin(r);
- let length = bone.data.length;
- boneX += (length * (cos * a - sin * c) - dx) * mixRotate;
- boneY += (length * (sin * a + cos * c) - dy) * mixRotate;
- } else {
- r += offsetRotation;
- }
- if (r > MathUtils.PI)
- r -= MathUtils.PI2;
- else if (r < -MathUtils.PI) //
- r += MathUtils.PI2;
- r *= mixRotate;
- cos = Math.cos(r);
- sin = Math.sin(r);
- mat.a = cos * a - sin * c;
- mat.c = cos * b - sin * d;
- mat.b = sin * a + cos * c;
- mat.d = sin * b + cos * d;
- }
- bone.appliedValid = false;
- }
- }
- computeWorldPositions (path, spacesCount, tangents) {
- let target = this.target;
- let position = this.position;
- let spaces = this.spaces, out = Utils.setArraySize(this.positions, spacesCount * 3 + 2), world = null;
- let closed = path.closed;
- let verticesLength = path.worldVerticesLength, curveCount = verticesLength / 6, prevCurve = PathConstraint$2.NONE;
- if (!path.constantSpeed) {
- let lengths = path.lengths;
- curveCount -= closed ? 1 : 2;
- let pathLength = lengths[curveCount];
- if (this.data.positionMode == PositionMode$2.Percent) position *= pathLength;
- let multiplier;
- switch (this.data.spacingMode) {
- case SpacingMode$2.Percent:
- multiplier = pathLength;
- break;
- case SpacingMode$2.Proportional:
- multiplier = pathLength / spacesCount;
- break;
- default:
- multiplier = 1;
- }
- world = Utils.setArraySize(this.world, 8);
- for (let i = 0, o = 0, curve = 0; i < spacesCount; i++, o += 3) {
- let space = spaces[i] * multiplier;
- position += space;
- let p = position;
- if (closed) {
- p %= pathLength;
- if (p < 0) p += pathLength;
- curve = 0;
- } else if (p < 0) {
- if (prevCurve != PathConstraint$2.BEFORE) {
- prevCurve = PathConstraint$2.BEFORE;
- path.computeWorldVertices(target, 2, 4, world, 0, 2);
- }
- this.addBeforePosition(p, world, 0, out, o);
- continue;
- } else if (p > pathLength) {
- if (prevCurve != PathConstraint$2.AFTER) {
- prevCurve = PathConstraint$2.AFTER;
- path.computeWorldVertices(target, verticesLength - 6, 4, world, 0, 2);
- }
- this.addAfterPosition(p - pathLength, world, 0, out, o);
- continue;
- }
- // Determine curve containing position.
- for (;; curve++) {
- let length = lengths[curve];
- if (p > length) continue;
- if (curve == 0)
- p /= length;
- else {
- let prev = lengths[curve - 1];
- p = (p - prev) / (length - prev);
- }
- break;
- }
- if (curve != prevCurve) {
- prevCurve = curve;
- if (closed && curve == curveCount) {
- path.computeWorldVertices(target, verticesLength - 4, 4, world, 0, 2);
- path.computeWorldVertices(target, 0, 4, world, 4, 2);
- } else
- path.computeWorldVertices(target, curve * 6 + 2, 8, world, 0, 2);
- }
- this.addCurvePosition(p, world[0], world[1], world[2], world[3], world[4], world[5], world[6], world[7], out, o,
- tangents || (i > 0 && space == 0));
- }
- return out;
- }
- // World vertices.
- if (closed) {
- verticesLength += 2;
- world = Utils.setArraySize(this.world, verticesLength);
- path.computeWorldVertices(target, 2, verticesLength - 4, world, 0, 2);
- path.computeWorldVertices(target, 0, 2, world, verticesLength - 4, 2);
- world[verticesLength - 2] = world[0];
- world[verticesLength - 1] = world[1];
- } else {
- curveCount--;
- verticesLength -= 4;
- world = Utils.setArraySize(this.world, verticesLength);
- path.computeWorldVertices(target, 2, verticesLength, world, 0, 2);
- }
- // Curve lengths.
- let curves = Utils.setArraySize(this.curves, curveCount);
- let pathLength = 0;
- let x1 = world[0], y1 = world[1], cx1 = 0, cy1 = 0, cx2 = 0, cy2 = 0, x2 = 0, y2 = 0;
- let tmpx = 0, tmpy = 0, dddfx = 0, dddfy = 0, ddfx = 0, ddfy = 0, dfx = 0, dfy = 0;
- for (let i = 0, w = 2; i < curveCount; i++, w += 6) {
- cx1 = world[w];
- cy1 = world[w + 1];
- cx2 = world[w + 2];
- cy2 = world[w + 3];
- x2 = world[w + 4];
- y2 = world[w + 5];
- tmpx = (x1 - cx1 * 2 + cx2) * 0.1875;
- tmpy = (y1 - cy1 * 2 + cy2) * 0.1875;
- dddfx = ((cx1 - cx2) * 3 - x1 + x2) * 0.09375;
- dddfy = ((cy1 - cy2) * 3 - y1 + y2) * 0.09375;
- ddfx = tmpx * 2 + dddfx;
- ddfy = tmpy * 2 + dddfy;
- dfx = (cx1 - x1) * 0.75 + tmpx + dddfx * 0.16666667;
- dfy = (cy1 - y1) * 0.75 + tmpy + dddfy * 0.16666667;
- pathLength += Math.sqrt(dfx * dfx + dfy * dfy);
- dfx += ddfx;
- dfy += ddfy;
- ddfx += dddfx;
- ddfy += dddfy;
- pathLength += Math.sqrt(dfx * dfx + dfy * dfy);
- dfx += ddfx;
- dfy += ddfy;
- pathLength += Math.sqrt(dfx * dfx + dfy * dfy);
- dfx += ddfx + dddfx;
- dfy += ddfy + dddfy;
- pathLength += Math.sqrt(dfx * dfx + dfy * dfy);
- curves[i] = pathLength;
- x1 = x2;
- y1 = y2;
- }
- if (this.data.positionMode == PositionMode$2.Percent) position *= pathLength;
- let multiplier = 0;
- switch (this.data.spacingMode) {
- case SpacingMode$2.Percent:
- multiplier = pathLength;
- break;
- case SpacingMode$2.Proportional:
- multiplier = pathLength / spacesCount;
- break;
- default:
- multiplier = 1;
- }
- let segments = this.segments;
- let curveLength = 0;
- for (let i = 0, o = 0, curve = 0, segment = 0; i < spacesCount; i++, o += 3) {
- let space = spaces[i] * multiplier;
- position += space;
- let p = position;
- if (closed) {
- p %= pathLength;
- if (p < 0) p += pathLength;
- curve = 0;
- } else if (p < 0) {
- this.addBeforePosition(p, world, 0, out, o);
- continue;
- } else if (p > pathLength) {
- this.addAfterPosition(p - pathLength, world, verticesLength - 4, out, o);
- continue;
- }
- // Determine curve containing position.
- for (;; curve++) {
- let length = curves[curve];
- if (p > length) continue;
- if (curve == 0)
- p /= length;
- else {
- let prev = curves[curve - 1];
- p = (p - prev) / (length - prev);
- }
- break;
- }
- // Curve segment lengths.
- if (curve != prevCurve) {
- prevCurve = curve;
- let ii = curve * 6;
- x1 = world[ii];
- y1 = world[ii + 1];
- cx1 = world[ii + 2];
- cy1 = world[ii + 3];
- cx2 = world[ii + 4];
- cy2 = world[ii + 5];
- x2 = world[ii + 6];
- y2 = world[ii + 7];
- tmpx = (x1 - cx1 * 2 + cx2) * 0.03;
- tmpy = (y1 - cy1 * 2 + cy2) * 0.03;
- dddfx = ((cx1 - cx2) * 3 - x1 + x2) * 0.006;
- dddfy = ((cy1 - cy2) * 3 - y1 + y2) * 0.006;
- ddfx = tmpx * 2 + dddfx;
- ddfy = tmpy * 2 + dddfy;
- dfx = (cx1 - x1) * 0.3 + tmpx + dddfx * 0.16666667;
- dfy = (cy1 - y1) * 0.3 + tmpy + dddfy * 0.16666667;
- curveLength = Math.sqrt(dfx * dfx + dfy * dfy);
- segments[0] = curveLength;
- for (ii = 1; ii < 8; ii++) {
- dfx += ddfx;
- dfy += ddfy;
- ddfx += dddfx;
- ddfy += dddfy;
- curveLength += Math.sqrt(dfx * dfx + dfy * dfy);
- segments[ii] = curveLength;
- }
- dfx += ddfx;
- dfy += ddfy;
- curveLength += Math.sqrt(dfx * dfx + dfy * dfy);
- segments[8] = curveLength;
- dfx += ddfx + dddfx;
- dfy += ddfy + dddfy;
- curveLength += Math.sqrt(dfx * dfx + dfy * dfy);
- segments[9] = curveLength;
- segment = 0;
- }
- // Weight by segment length.
- p *= curveLength;
- for (;; segment++) {
- let length = segments[segment];
- if (p > length) continue;
- if (segment == 0)
- p /= length;
- else {
- let prev = segments[segment - 1];
- p = segment + (p - prev) / (length - prev);
- }
- break;
- }
- this.addCurvePosition(p * 0.1, x1, y1, cx1, cy1, cx2, cy2, x2, y2, out, o, tangents || (i > 0 && space == 0));
- }
- return out;
- }
- addBeforePosition (p, temp, i, out, o) {
- let x1 = temp[i], y1 = temp[i + 1], dx = temp[i + 2] - x1, dy = temp[i + 3] - y1, r = Math.atan2(dy, dx);
- out[o] = x1 + p * Math.cos(r);
- out[o + 1] = y1 + p * Math.sin(r);
- out[o + 2] = r;
- }
- addAfterPosition (p, temp, i, out, o) {
- let x1 = temp[i + 2], y1 = temp[i + 3], dx = x1 - temp[i], dy = y1 - temp[i + 1], r = Math.atan2(dy, dx);
- out[o] = x1 + p * Math.cos(r);
- out[o + 1] = y1 + p * Math.sin(r);
- out[o + 2] = r;
- }
- addCurvePosition (p, x1, y1, cx1, cy1, cx2, cy2, x2, y2,
- out, o, tangents) {
- if (p == 0 || isNaN(p)) {
- out[o] = x1;
- out[o + 1] = y1;
- out[o + 2] = Math.atan2(cy1 - y1, cx1 - x1);
- return;
- }
- let tt = p * p, ttt = tt * p, u = 1 - p, uu = u * u, uuu = uu * u;
- let ut = u * p, ut3 = ut * 3, uut3 = u * ut3, utt3 = ut3 * p;
- let x = x1 * uuu + cx1 * uut3 + cx2 * utt3 + x2 * ttt, y = y1 * uuu + cy1 * uut3 + cy2 * utt3 + y2 * ttt;
- out[o] = x;
- out[o + 1] = y;
- if (tangents) {
- if (p < 0.001)
- out[o + 2] = Math.atan2(cy1 - y1, cx1 - x1);
- else
- out[o + 2] = Math.atan2(y - (y1 * uu + cy1 * ut * 2 + cy2 * tt), x - (x1 * uu + cx1 * ut * 2 + cx2 * tt));
- }
- }
- } PathConstraint$2.__initStatic(); PathConstraint$2.__initStatic2(); PathConstraint$2.__initStatic3(); PathConstraint$2.__initStatic4();
- /** Stores a slot's current pose. Slots organize attachments for {@link Skeleton#drawOrder} purposes and provide a place to store
- * state for an attachment. State cannot be stored in an attachment itself because attachments are stateless and may be shared
- * across multiple skeletons.
- * @public
- * */
- class Slot$2 {
- //this is canon
-
- /** The slot's setup pose data. */
-
- /** The bone this slot belongs to. */
-
- /** The color used to tint the slot's attachment. If {@link #getDarkColor()} is set, this is used as the light color for two
- * color tinting. */
-
- /** The dark color used to tint the slot's attachment for two color tinting, or null if two color tinting is not used. The dark
- * color's alpha is not used. */
-
-
-
-
- /** Values to deform the slot's attachment. For an unweighted mesh, the entries are local positions for each vertex. For a
- * weighted mesh, the entries are an offset for each vertex which will be added to the mesh's local vertex positions.
- *
- * See {@link VertexAttachment#computeWorldVertices()} and {@link DeformTimeline}. */
- __init() {this.deform = new Array();}
- constructor (data, bone) {Slot$2.prototype.__init.call(this);
- if (data == null) throw new Error("data cannot be null.");
- if (bone == null) throw new Error("bone cannot be null.");
- this.data = data;
- this.bone = bone;
- this.color = new Color();
- this.darkColor = data.darkColor == null ? null : new Color();
- this.setToSetupPose();
- this.blendMode = this.data.blendMode;
- }
- /** The skeleton this slot belongs to. */
- getSkeleton () {
- return this.bone.skeleton;
- }
- /** The current attachment for the slot, or null if the slot has no attachment. */
- getAttachment () {
- return this.attachment;
- }
- /** Sets the slot's attachment and, if the attachment changed, resets {@link #attachmentTime} and clears {@link #deform}.
- * @param attachment May be null. */
- setAttachment (attachment) {
- if (this.attachment == attachment) return;
- this.attachment = attachment;
- this.attachmentTime = this.bone.skeleton.time;
- this.deform.length = 0;
- }
- setAttachmentTime (time) {
- this.attachmentTime = this.bone.skeleton.time - time;
- }
- /** The time that has elapsed since the last time the attachment was set or cleared. Relies on Skeleton
- * {@link Skeleton#time}. */
- getAttachmentTime () {
- return this.bone.skeleton.time - this.attachmentTime;
- }
- /** Sets this slot to the setup pose. */
- setToSetupPose () {
- this.color.setFromColor(this.data.color);
- if (this.darkColor != null) this.darkColor.setFromColor(this.data.darkColor);
- if (this.data.attachmentName == null)
- this.attachment = null;
- else {
- this.attachment = null;
- this.setAttachment(this.bone.skeleton.getAttachment(this.data.index, this.data.attachmentName));
- }
- }
- }
- /** Stores the current pose for a transform constraint. A transform constraint adjusts the world transform of the constrained
- * bones to match that of the target bone.
- *
- * See [Transform constraints](http://esotericsoftware.com/spine-transform-constraints) in the Spine User Guide.
- * @public
- * */
- class TransformConstraint$2 {
- /** The transform constraint's setup pose data. */
-
- /** The bones that will be modified by this transform constraint. */
-
- /** The target bone whose world transform will be copied to the constrained bones. */
-
- __init() {this.mixRotate = 0;} __init2() {this.mixX = 0;} __init3() {this.mixY = 0;} __init4() {this.mixScaleX = 0;} __init5() {this.mixScaleY = 0;} __init6() {this.mixShearY = 0;}
- __init7() {this.temp = new Vector2();}
- __init8() {this.active = false;}
- constructor (data, skeleton) {TransformConstraint$2.prototype.__init.call(this);TransformConstraint$2.prototype.__init2.call(this);TransformConstraint$2.prototype.__init3.call(this);TransformConstraint$2.prototype.__init4.call(this);TransformConstraint$2.prototype.__init5.call(this);TransformConstraint$2.prototype.__init6.call(this);TransformConstraint$2.prototype.__init7.call(this);TransformConstraint$2.prototype.__init8.call(this);
- if (data == null) throw new Error("data cannot be null.");
- if (skeleton == null) throw new Error("skeleton cannot be null.");
- this.data = data;
- this.mixRotate = data.mixRotate;
- this.mixX = data.mixX;
- this.mixY = data.mixY;
- this.mixScaleX = data.mixScaleX;
- this.mixScaleY = data.mixScaleY;
- this.mixShearY = data.mixShearY;
- this.bones = new Array();
- for (let i = 0; i < data.bones.length; i++)
- this.bones.push(skeleton.findBone(data.bones[i].name));
- this.target = skeleton.findBone(data.target.name);
- }
- isActive () {
- return this.active;
- }
- update () {
- if (this.mixRotate == 0 && this.mixX == 0 && this.mixY == 0 && this.mixScaleX == 0 && this.mixScaleX == 0 && this.mixShearY == 0) return;
- if (this.data.local) {
- if (this.data.relative)
- this.applyRelativeLocal();
- else
- this.applyAbsoluteLocal();
- } else {
- if (this.data.relative)
- this.applyRelativeWorld();
- else
- this.applyAbsoluteWorld();
- }
- }
- applyAbsoluteWorld () {
- let mixRotate = this.mixRotate, mixX = this.mixX, mixY = this.mixY, mixScaleX = this.mixScaleX,
- mixScaleY = this.mixScaleY, mixShearY = this.mixShearY;
- let translate = mixX != 0 || mixY != 0;
- let target = this.target;
- const targetMat = target.matrix;
- let ta = targetMat.a, tb = targetMat.c, tc = targetMat.b, td = targetMat.d;
- let degRadReflect = ta * td - tb * tc > 0 ? MathUtils.degRad : -MathUtils.degRad;
- let offsetRotation = this.data.offsetRotation * degRadReflect;
- let offsetShearY = this.data.offsetShearY * degRadReflect;
- let bones = this.bones;
- for (let i = 0, n = bones.length; i < n; i++) {
- let bone = bones[i];
- const mat = bone.matrix;
- if (mixRotate != 0) {
- let a = mat.a, b = mat.c, c = mat.b, d = mat.d;
- let r = Math.atan2(tc, ta) - Math.atan2(c, a) + offsetRotation;
- if (r > MathUtils.PI)
- r -= MathUtils.PI2;
- else if (r < -MathUtils.PI) //
- r += MathUtils.PI2;
- r *= mixRotate;
- let cos = Math.cos(r), sin = Math.sin(r);
- mat.a = cos * a - sin * c;
- mat.c = cos * b - sin * d;
- mat.b = sin * a + cos * c;
- mat.d = sin * b + cos * d;
- }
- if (translate) {
- let temp = this.temp;
- target.localToWorld(temp.set(this.data.offsetX, this.data.offsetY));
- mat.tx += (temp.x - mat.tx) * mixX;
- mat.ty += (temp.y - mat.tx) * mixY;
- }
- if (mixScaleX != 0) {
- let s = Math.sqrt(mat.a * mat.a + mat.b * mat.b);
- if (s != 0) s = (s + (Math.sqrt(ta * ta + tc * tc) - s + this.data.offsetScaleX) * mixScaleX) / s;
- mat.a *= s;
- mat.b *= s;
- }
- if (mixScaleY != 0) {
- let s = Math.sqrt(mat.c * mat.c + mat.d * mat.d);
- if (s != 0) s = (s + (Math.sqrt(tb * tb + td * td) - s + this.data.offsetScaleY) * mixScaleY) / s;
- mat.c *= s;
- mat.d *= s;
- }
- if (mixShearY > 0) {
- let b = mat.c, d = mat.d;
- let by = Math.atan2(d, b);
- let r = Math.atan2(td, tb) - Math.atan2(tc, ta) - (by - Math.atan2(mat.b, mat.a));
- if (r > MathUtils.PI)
- r -= MathUtils.PI2;
- else if (r < -MathUtils.PI) //
- r += MathUtils.PI2;
- r = by + (r + offsetShearY) * mixShearY;
- let s = Math.sqrt(b * b + d * d);
- mat.c = Math.cos(r) * s;
- mat.d = Math.sin(r) * s;
- }
- bone.appliedValid = false;
- }
- }
- applyRelativeWorld () {
- let mixRotate = this.mixRotate, mixX = this.mixX, mixY = this.mixY, mixScaleX = this.mixScaleX,
- mixScaleY = this.mixScaleY, mixShearY = this.mixShearY;
- let translate = mixX != 0 || mixY != 0;
- let target = this.target;
- let targetMat = target.matrix;
- let ta = targetMat.a, tb = targetMat.c, tc = targetMat.b, td = targetMat.d;
- let degRadReflect = ta * td - tb * tc > 0 ? MathUtils.degRad : -MathUtils.degRad;
- let offsetRotation = this.data.offsetRotation * degRadReflect, offsetShearY = this.data.offsetShearY * degRadReflect;
- let bones = this.bones;
- for (let i = 0, n = bones.length; i < n; i++) {
- let bone = bones[i];
- const mat = bone.matrix;
- if (mixRotate != 0) {
- let a = mat.a, b = mat.c, c = mat.b, d = mat.d;
- let r = Math.atan2(tc, ta) + offsetRotation;
- if (r > MathUtils.PI)
- r -= MathUtils.PI2;
- else if (r < -MathUtils.PI) //
- r += MathUtils.PI2;
- r *= mixRotate;
- let cos = Math.cos(r), sin = Math.sin(r);
- mat.a = cos * a - sin * c;
- mat.c = cos * b - sin * d;
- mat.b = sin * a + cos * c;
- mat.d = sin * b + cos * d;
- }
- if (translate) {
- let temp = this.temp;
- target.localToWorld(temp.set(this.data.offsetX, this.data.offsetY));
- mat.tx += temp.x * mixX;
- mat.ty += temp.y * mixY;
- }
- if (mixScaleX != 0) {
- let s = (Math.sqrt(ta * ta + tc * tc) - 1 + this.data.offsetScaleX) * mixScaleX + 1;
- mat.a *= s;
- mat.b *= s;
- }
- if (mixScaleY != 0) {
- let s = (Math.sqrt(tb * tb + td * td) - 1 + this.data.offsetScaleY) * mixScaleY + 1;
- mat.c *= s;
- mat.d *= s;
- }
- if (mixShearY > 0) {
- let r = Math.atan2(td, tb) - Math.atan2(tc, ta);
- if (r > MathUtils.PI)
- r -= MathUtils.PI2;
- else if (r < -MathUtils.PI) //
- r += MathUtils.PI2;
- let b = mat.c, d = mat.d;
- r = Math.atan2(d, b) + (r - MathUtils.PI / 2 + offsetShearY) * mixShearY;
- let s = Math.sqrt(b * b + d * d);
- mat.c = Math.cos(r) * s;
- mat.d = Math.sin(r) * s;
- }
- bone.appliedValid = false;
- }
- }
- applyAbsoluteLocal () {
- let mixRotate = this.mixRotate, mixX = this.mixX, mixY = this.mixY, mixScaleX = this.mixScaleX,
- mixScaleY = this.mixScaleY, mixShearY = this.mixShearY;
- let target = this.target;
- if (!target.appliedValid) target.updateAppliedTransform();
- let bones = this.bones;
- for (let i = 0, n = bones.length; i < n; i++) {
- let bone = bones[i];
- if (!bone.appliedValid) bone.updateAppliedTransform();
- let rotation = bone.arotation;
- if (mixRotate != 0) {
- let r = target.arotation - rotation + this.data.offsetRotation;
- r -= (16384 - ((16384.499999999996 - r / 360) | 0)) * 360;
- rotation += r * mixRotate;
- }
- let x = bone.ax, y = bone.ay;
- x += (target.ax - x + this.data.offsetX) * mixX;
- y += (target.ay - y + this.data.offsetY) * mixY;
- let scaleX = bone.ascaleX, scaleY = bone.ascaleY;
- if (mixScaleX != 0 && scaleX != 0)
- scaleX = (scaleX + (target.ascaleX - scaleX + this.data.offsetScaleX) * mixScaleX) / scaleX;
- if (mixScaleY != 0 && scaleY != 0)
- scaleY = (scaleY + (target.ascaleY - scaleY + this.data.offsetScaleY) * mixScaleY) / scaleY;
- let shearY = bone.ashearY;
- if (mixShearY != 0) {
- let r = target.ashearY - shearY + this.data.offsetShearY;
- r -= (16384 - ((16384.499999999996 - r / 360) | 0)) * 360;
- // TODO: check this place in 3.8
- shearY += r * mixShearY;
- }
- bone.updateWorldTransformWith(x, y, rotation, scaleX, scaleY, bone.ashearX, shearY);
- }
- }
- applyRelativeLocal () {
- let mixRotate = this.mixRotate, mixX = this.mixX, mixY = this.mixY, mixScaleX = this.mixScaleX,
- mixScaleY = this.mixScaleY, mixShearY = this.mixShearY;
- let target = this.target;
- if (!target.appliedValid) target.updateAppliedTransform();
- let bones = this.bones;
- for (let i = 0, n = bones.length; i < n; i++) {
- let bone = bones[i];
- if (!bone.appliedValid) bone.updateAppliedTransform();
- let rotation = bone.arotation + (target.arotation + this.data.offsetRotation) * mixRotate;
- let x = bone.ax + (target.ax + this.data.offsetX) * mixX;
- let y = bone.ay + (target.ay + this.data.offsetY) * mixY;
- let scaleX = (bone.ascaleX * ((target.ascaleX - 1 + this.data.offsetScaleX) * mixScaleX) + 1);
- let scaleY = (bone.ascaleY * ((target.ascaleY - 1 + this.data.offsetScaleY) * mixScaleY) + 1);
- let shearY = bone.ashearY + (target.ashearY + this.data.offsetShearY) * mixShearY;
- bone.updateWorldTransformWith(x, y, rotation, scaleX, scaleY, bone.ashearX, shearY);
- }
- }
- }
- /** Stores the current pose for a skeleton.
- *
- * See [Instance objects](http://esotericsoftware.com/spine-runtime-architecture#Instance-objects) in the Spine Runtimes Guide.
- * @public
- * */
- class Skeleton$2 {
- /** The skeleton's setup pose data. */
-
- /** The skeleton's bones, sorted parent first. The root bone is always the first bone. */
-
- /** The skeleton's slots. */
-
- /** The skeleton's slots in the order they should be drawn. The returned array may be modified to change the draw order. */
-
- /** The skeleton's IK constraints. */
-
- /** The skeleton's transform constraints. */
-
- /** The skeleton's path constraints. */
-
- /** The list of bones and constraints, sorted in the order they should be updated, as computed by {@link #updateCache()}. */
- __init() {this._updateCache = new Array();}
- /** The skeleton's current skin. May be null. */
-
- /** The color to tint all the skeleton's attachments. */
-
- /** Returns the skeleton's time. This can be used for tracking, such as with Slot {@link Slot#attachmentTime}.
- * <p>
- * See {@link #update()}. */
- __init2() {this.time = 0;}
- /** Scales the entire skeleton on the X axis. This affects all bones, even if the bone's transform mode disallows scale
- * inheritance. */
- __init3() {this.scaleX = 1;}
- /** Scales the entire skeleton on the Y axis. This affects all bones, even if the bone's transform mode disallows scale
- * inheritance. */
- __init4() {this.scaleY = 1;}
- /** Sets the skeleton X position, which is added to the root bone worldX position. */
- __init5() {this.x = 0;}
- /** Sets the skeleton Y position, which is added to the root bone worldY position. */
- __init6() {this.y = 0;}
- constructor (data) {Skeleton$2.prototype.__init.call(this);Skeleton$2.prototype.__init2.call(this);Skeleton$2.prototype.__init3.call(this);Skeleton$2.prototype.__init4.call(this);Skeleton$2.prototype.__init5.call(this);Skeleton$2.prototype.__init6.call(this);
- if (data == null) throw new Error("data cannot be null.");
- this.data = data;
- this.bones = new Array();
- for (let i = 0; i < data.bones.length; i++) {
- let boneData = data.bones[i];
- let bone;
- if (boneData.parent == null)
- bone = new Bone$2(boneData, this, null);
- else {
- let parent = this.bones[boneData.parent.index];
- bone = new Bone$2(boneData, this, parent);
- parent.children.push(bone);
- }
- this.bones.push(bone);
- }
- this.slots = new Array();
- this.drawOrder = new Array();
- for (let i = 0; i < data.slots.length; i++) {
- let slotData = data.slots[i];
- let bone = this.bones[slotData.boneData.index];
- let slot = new Slot$2(slotData, bone);
- this.slots.push(slot);
- this.drawOrder.push(slot);
- }
- this.ikConstraints = new Array();
- for (let i = 0; i < data.ikConstraints.length; i++) {
- let ikConstraintData = data.ikConstraints[i];
- this.ikConstraints.push(new IkConstraint$2(ikConstraintData, this));
- }
- this.transformConstraints = new Array();
- for (let i = 0; i < data.transformConstraints.length; i++) {
- let transformConstraintData = data.transformConstraints[i];
- this.transformConstraints.push(new TransformConstraint$2(transformConstraintData, this));
- }
- this.pathConstraints = new Array();
- for (let i = 0; i < data.pathConstraints.length; i++) {
- let pathConstraintData = data.pathConstraints[i];
- this.pathConstraints.push(new PathConstraint$2(pathConstraintData, this));
- }
- this.color = new Color(1, 1, 1, 1);
- this.updateCache();
- }
- /** Caches information about bones and constraints. Must be called if the {@link #getSkin()} is modified or if bones,
- * constraints, or weighted path attachments are added or removed. */
- updateCache () {
- let updateCache = this._updateCache;
- updateCache.length = 0;
- let bones = this.bones;
- for (let i = 0, n = bones.length; i < n; i++) {
- let bone = bones[i];
- bone.sorted = bone.data.skinRequired;
- bone.active = !bone.sorted;
- }
- if (this.skin != null) {
- let skinBones = this.skin.bones;
- for (let i = 0, n = this.skin.bones.length; i < n; i++) {
- let bone = this.bones[skinBones[i].index];
- do {
- bone.sorted = false;
- bone.active = true;
- bone = bone.parent;
- } while (bone != null);
- }
- }
- // IK first, lowest hierarchy depth first.
- let ikConstraints = this.ikConstraints;
- let transformConstraints = this.transformConstraints;
- let pathConstraints = this.pathConstraints;
- let ikCount = ikConstraints.length, transformCount = transformConstraints.length, pathCount = pathConstraints.length;
- let constraintCount = ikCount + transformCount + pathCount;
- outer:
- for (let i = 0; i < constraintCount; i++) {
- for (let ii = 0; ii < ikCount; ii++) {
- let constraint = ikConstraints[ii];
- if (constraint.data.order == i) {
- this.sortIkConstraint(constraint);
- continue outer;
- }
- }
- for (let ii = 0; ii < transformCount; ii++) {
- let constraint = transformConstraints[ii];
- if (constraint.data.order == i) {
- this.sortTransformConstraint(constraint);
- continue outer;
- }
- }
- for (let ii = 0; ii < pathCount; ii++) {
- let constraint = pathConstraints[ii];
- if (constraint.data.order == i) {
- this.sortPathConstraint(constraint);
- continue outer;
- }
- }
- }
- for (let i = 0, n = bones.length; i < n; i++)
- this.sortBone(bones[i]);
- }
- sortIkConstraint (constraint) {
- constraint.active = constraint.target.isActive() && (!constraint.data.skinRequired || (this.skin != null && Utils.contains(this.skin.constraints, constraint.data, true)));
- if (!constraint.active) return;
- let target = constraint.target;
- this.sortBone(target);
- let constrained = constraint.bones;
- let parent = constrained[0];
- this.sortBone(parent);
- if (constrained.length == 1) {
- this._updateCache.push(constraint);
- this.sortReset(parent.children);
- } else {
- let child = constrained[constrained.length - 1];
- this.sortBone(child);
- this._updateCache.push(constraint);
- this.sortReset(parent.children);
- child.sorted = true;
- }
- }
- sortPathConstraint (constraint) {
- constraint.active = constraint.target.bone.isActive() && (!constraint.data.skinRequired || (this.skin != null && Utils.contains(this.skin.constraints, constraint.data, true)));
- if (!constraint.active) return;
- let slot = constraint.target;
- let slotIndex = slot.data.index;
- let slotBone = slot.bone;
- if (this.skin != null) this.sortPathConstraintAttachment(this.skin, slotIndex, slotBone);
- if (this.data.defaultSkin != null && this.data.defaultSkin != this.skin)
- this.sortPathConstraintAttachment(this.data.defaultSkin, slotIndex, slotBone);
- for (let i = 0, n = this.data.skins.length; i < n; i++)
- this.sortPathConstraintAttachment(this.data.skins[i], slotIndex, slotBone);
- let attachment = slot.getAttachment();
- if (attachment instanceof PathAttachment$2) this.sortPathConstraintAttachmentWith(attachment, slotBone);
- let constrained = constraint.bones;
- let boneCount = constrained.length;
- for (let i = 0; i < boneCount; i++)
- this.sortBone(constrained[i]);
- this._updateCache.push(constraint);
- for (let i = 0; i < boneCount; i++)
- this.sortReset(constrained[i].children);
- for (let i = 0; i < boneCount; i++)
- constrained[i].sorted = true;
- }
- sortTransformConstraint (constraint) {
- constraint.active = constraint.target.isActive() && (!constraint.data.skinRequired || (this.skin != null && Utils.contains(this.skin.constraints, constraint.data, true)));
- if (!constraint.active) return;
- this.sortBone(constraint.target);
- let constrained = constraint.bones;
- let boneCount = constrained.length;
- if (constraint.data.local) {
- for (let i = 0; i < boneCount; i++) {
- let child = constrained[i];
- this.sortBone(child.parent);
- this.sortBone(child);
- }
- } else {
- for (let i = 0; i < boneCount; i++) {
- this.sortBone(constrained[i]);
- }
- }
- this._updateCache.push(constraint);
- for (let i = 0; i < boneCount; i++)
- this.sortReset(constrained[i].children);
- for (let i = 0; i < boneCount; i++)
- constrained[i].sorted = true;
- }
- sortPathConstraintAttachment (skin, slotIndex, slotBone) {
- let attachments = skin.attachments[slotIndex];
- if (!attachments) return;
- for (let key in attachments) {
- this.sortPathConstraintAttachmentWith(attachments[key], slotBone);
- }
- }
- sortPathConstraintAttachmentWith (attachment, slotBone) {
- if (!(attachment instanceof PathAttachment$2)) return;
- let pathBones = (attachment).bones;
- if (pathBones == null)
- this.sortBone(slotBone);
- else {
- let bones = this.bones;
- for (let i = 0, n = pathBones.length; i < n;) {
- let nn = pathBones[i++];
- nn += i;
- while (i < nn)
- this.sortBone(bones[pathBones[i++]]);
- }
- }
- }
- sortBone (bone) {
- if (bone.sorted) return;
- let parent = bone.parent;
- if (parent != null) this.sortBone(parent);
- bone.sorted = true;
- this._updateCache.push(bone);
- }
- sortReset (bones) {
- for (let i = 0, n = bones.length; i < n; i++) {
- let bone = bones[i];
- if (!bone.active) continue;
- if (bone.sorted) this.sortReset(bone.children);
- bone.sorted = false;
- }
- }
- /** Updates the world transform for each bone and applies all constraints.
- *
- * See [World transforms](http://esotericsoftware.com/spine-runtime-skeletons#World-transforms) in the Spine
- * Runtimes Guide. */
- updateWorldTransform () {
- let updateCache = this._updateCache;
- for (let i = 0, n = updateCache.length; i < n; i++)
- updateCache[i].update();
- }
- updateWorldTransformWith (parent) {
- // Apply the parent bone transform to the root bone. The root bone always inherits scale, rotation and reflection.
- let rootBone = this.getRootBone();
- let pa = parent.matrix.a, pb = parent.matrix.c, pc = parent.matrix.b, pd = parent.matrix.d;
- rootBone.matrix.tx = pa * this.x + pb * this.y + parent.worldX;
- rootBone.matrix.ty = pc * this.x + pd * this.y + parent.worldY;
- let rotationY = rootBone.rotation + 90 + rootBone.shearY;
- let la = MathUtils.cosDeg(rootBone.rotation + rootBone.shearX) * rootBone.scaleX;
- let lb = MathUtils.cosDeg(rotationY) * rootBone.scaleY;
- let lc = MathUtils.sinDeg(rootBone.rotation + rootBone.shearX) * rootBone.scaleX;
- let ld = MathUtils.sinDeg(rotationY) * rootBone.scaleY;
- const sx = this.scaleX;
- const sy = settings.yDown? -this.scaleY : this.scaleY;
- rootBone.matrix.a = (pa * la + pb * lc) * sx;
- rootBone.matrix.b = (pa * lb + pb * ld) * sx;
- rootBone.matrix.c = (pc * la + pd * lc) * sy;
- rootBone.matrix.d = (pc * lb + pd * ld) * sy;
- // Update everything except root bone.
- let updateCache = this._updateCache;
- for (let i = 0, n = updateCache.length; i < n; i++) {
- let updatable = updateCache[i];
- if (updatable != rootBone) updatable.update();
- }
- }
- /** Sets the bones, constraints, and slots to their setup pose values. */
- setToSetupPose () {
- this.setBonesToSetupPose();
- this.setSlotsToSetupPose();
- }
- /** Sets the bones and constraints to their setup pose values. */
- setBonesToSetupPose () {
- let bones = this.bones;
- for (let i = 0, n = bones.length; i < n; i++)
- bones[i].setToSetupPose();
- let ikConstraints = this.ikConstraints;
- for (let i = 0, n = ikConstraints.length; i < n; i++) {
- let constraint = ikConstraints[i];
- constraint.mix = constraint.data.mix;
- constraint.softness = constraint.data.softness;
- constraint.bendDirection = constraint.data.bendDirection;
- constraint.compress = constraint.data.compress;
- constraint.stretch = constraint.data.stretch;
- }
- let transformConstraints = this.transformConstraints;
- for (let i = 0, n = transformConstraints.length; i < n; i++) {
- let constraint = transformConstraints[i];
- let data = constraint.data;
- constraint.mixRotate = data.mixRotate;
- constraint.mixX = data.mixX;
- constraint.mixY = data.mixY;
- constraint.mixScaleX = data.mixScaleX;
- constraint.mixScaleY = data.mixScaleY;
- constraint.mixShearY = data.mixShearY;
- }
- let pathConstraints = this.pathConstraints;
- for (let i = 0, n = pathConstraints.length; i < n; i++) {
- let constraint = pathConstraints[i];
- let data = constraint.data;
- constraint.position = data.position;
- constraint.spacing = data.spacing;
- constraint.mixRotate = data.mixRotate;
- constraint.mixX = data.mixX;
- constraint.mixY = data.mixY;
- }
- }
- /** Sets the slots and draw order to their setup pose values. */
- setSlotsToSetupPose () {
- let slots = this.slots;
- Utils.arrayCopy(slots, 0, this.drawOrder, 0, slots.length);
- for (let i = 0, n = slots.length; i < n; i++)
- slots[i].setToSetupPose();
- }
- /** @returns May return null. */
- getRootBone () {
- if (this.bones.length == 0) return null;
- return this.bones[0];
- }
- /** @returns May be null. */
- findBone (boneName) {
- if (boneName == null) throw new Error("boneName cannot be null.");
- let bones = this.bones;
- for (let i = 0, n = bones.length; i < n; i++) {
- let bone = bones[i];
- if (bone.data.name == boneName) return bone;
- }
- return null;
- }
- /** @returns -1 if the bone was not found. */
- findBoneIndex (boneName) {
- if (boneName == null) throw new Error("boneName cannot be null.");
- let bones = this.bones;
- for (let i = 0, n = bones.length; i < n; i++)
- if (bones[i].data.name == boneName) return i;
- return -1;
- }
- /** Finds a slot by comparing each slot's name. It is more efficient to cache the results of this method than to call it
- * repeatedly.
- * @returns May be null. */
- findSlot (slotName) {
- if (slotName == null) throw new Error("slotName cannot be null.");
- let slots = this.slots;
- for (let i = 0, n = slots.length; i < n; i++) {
- let slot = slots[i];
- if (slot.data.name == slotName) return slot;
- }
- return null;
- }
- /** @returns -1 if the bone was not found. */
- findSlotIndex (slotName) {
- if (slotName == null) throw new Error("slotName cannot be null.");
- let slots = this.slots;
- for (let i = 0, n = slots.length; i < n; i++)
- if (slots[i].data.name == slotName) return i;
- return -1;
- }
- /** Sets a skin by name.
- *
- * See {@link #setSkin()}. */
- setSkinByName (skinName) {
- let skin = this.data.findSkin(skinName);
- if (skin == null) throw new Error("Skin not found: " + skinName);
- this.setSkin(skin);
- }
- /** Sets the skin used to look up attachments before looking in the {@link SkeletonData#defaultSkin default skin}. If the
- * skin is changed, {@link #updateCache()} is called.
- *
- * Attachments from the new skin are attached if the corresponding attachment from the old skin was attached. If there was no
- * old skin, each slot's setup mode attachment is attached from the new skin.
- *
- * After changing the skin, the visible attachments can be reset to those attached in the setup pose by calling
- * {@link #setSlotsToSetupPose()}. Also, often {@link AnimationState#apply()} is called before the next time the
- * skeleton is rendered to allow any attachment keys in the current animation(s) to hide or show attachments from the new skin.
- * @param newSkin May be null. */
- setSkin (newSkin) {
- if (newSkin == this.skin) return;
- if (newSkin != null) {
- if (this.skin != null)
- newSkin.attachAll(this, this.skin);
- else {
- let slots = this.slots;
- for (let i = 0, n = slots.length; i < n; i++) {
- let slot = slots[i];
- let name = slot.data.attachmentName;
- if (name != null) {
- let attachment = newSkin.getAttachment(i, name);
- if (attachment != null) slot.setAttachment(attachment);
- }
- }
- }
- }
- this.skin = newSkin;
- this.updateCache();
- }
- /** Finds an attachment by looking in the {@link #skin} and {@link SkeletonData#defaultSkin} using the slot name and attachment
- * name.
- *
- * See {@link #getAttachment()}.
- * @returns May be null. */
- getAttachmentByName (slotName, attachmentName) {
- return this.getAttachment(this.data.findSlotIndex(slotName), attachmentName);
- }
- /** Finds an attachment by looking in the {@link #skin} and {@link SkeletonData#defaultSkin} using the slot index and
- * attachment name. First the skin is checked and if the attachment was not found, the default skin is checked.
- *
- * See [Runtime skins](http://esotericsoftware.com/spine-runtime-skins) in the Spine Runtimes Guide.
- * @returns May be null. */
- getAttachment (slotIndex, attachmentName) {
- if (attachmentName == null) throw new Error("attachmentName cannot be null.");
- if (this.skin != null) {
- let attachment = this.skin.getAttachment(slotIndex, attachmentName);
- if (attachment != null) return attachment;
- }
- if (this.data.defaultSkin != null) return this.data.defaultSkin.getAttachment(slotIndex, attachmentName);
- return null;
- }
- /** A convenience method to set an attachment by finding the slot with {@link #findSlot()}, finding the attachment with
- * {@link #getAttachment()}, then setting the slot's {@link Slot#attachment}.
- * @param attachmentName May be null to clear the slot's attachment. */
- setAttachment (slotName, attachmentName) {
- if (slotName == null) throw new Error("slotName cannot be null.");
- let slots = this.slots;
- for (let i = 0, n = slots.length; i < n; i++) {
- let slot = slots[i];
- if (slot.data.name == slotName) {
- let attachment = null;
- if (attachmentName != null) {
- attachment = this.getAttachment(i, attachmentName);
- if (attachment == null)
- throw new Error("Attachment not found: " + attachmentName + ", for slot: " + slotName);
- }
- slot.setAttachment(attachment);
- return;
- }
- }
- throw new Error("Slot not found: " + slotName);
- }
- /** Finds an IK constraint by comparing each IK constraint's name. It is more efficient to cache the results of this method
- * than to call it repeatedly.
- * @return May be null. */
- findIkConstraint (constraintName) {
- if (constraintName == null) throw new Error("constraintName cannot be null.");
- let ikConstraints = this.ikConstraints;
- for (let i = 0, n = ikConstraints.length; i < n; i++) {
- let ikConstraint = ikConstraints[i];
- if (ikConstraint.data.name == constraintName) return ikConstraint;
- }
- return null;
- }
- /** Finds a transform constraint by comparing each transform constraint's name. It is more efficient to cache the results of
- * this method than to call it repeatedly.
- * @return May be null. */
- findTransformConstraint (constraintName) {
- if (constraintName == null) throw new Error("constraintName cannot be null.");
- let transformConstraints = this.transformConstraints;
- for (let i = 0, n = transformConstraints.length; i < n; i++) {
- let constraint = transformConstraints[i];
- if (constraint.data.name == constraintName) return constraint;
- }
- return null;
- }
- /** Finds a path constraint by comparing each path constraint's name. It is more efficient to cache the results of this method
- * than to call it repeatedly.
- * @return May be null. */
- findPathConstraint (constraintName) {
- if (constraintName == null) throw new Error("constraintName cannot be null.");
- let pathConstraints = this.pathConstraints;
- for (let i = 0, n = pathConstraints.length; i < n; i++) {
- let constraint = pathConstraints[i];
- if (constraint.data.name == constraintName) return constraint;
- }
- return null;
- }
- /** Returns the axis aligned bounding box (AABB) of the region and mesh attachments for the current pose.
- * @param offset An output value, the distance from the skeleton origin to the bottom left corner of the AABB.
- * @param size An output value, the width and height of the AABB.
- * @param temp Working memory to temporarily store attachments' computed world vertices. */
- getBounds (offset, size, temp = new Array(2)) {
- if (offset == null) throw new Error("offset cannot be null.");
- if (size == null) throw new Error("size cannot be null.");
- let drawOrder = this.drawOrder;
- let minX = Number.POSITIVE_INFINITY, minY = Number.POSITIVE_INFINITY, maxX = Number.NEGATIVE_INFINITY, maxY = Number.NEGATIVE_INFINITY;
- for (let i = 0, n = drawOrder.length; i < n; i++) {
- let slot = drawOrder[i];
- if (!slot.bone.active) continue;
- let verticesLength = 0;
- let vertices = null;
- let attachment = slot.getAttachment();
- if (attachment instanceof RegionAttachment$2) {
- verticesLength = 8;
- vertices = Utils.setArraySize(temp, verticesLength, 0);
- (attachment).computeWorldVertices(slot.bone, vertices, 0, 2);
- } else if (attachment instanceof MeshAttachment$2) {
- let mesh = (attachment);
- verticesLength = mesh.worldVerticesLength;
- vertices = Utils.setArraySize(temp, verticesLength, 0);
- mesh.computeWorldVertices(slot, 0, verticesLength, vertices, 0, 2);
- }
- if (vertices != null) {
- for (let ii = 0, nn = vertices.length; ii < nn; ii += 2) {
- let x = vertices[ii], y = vertices[ii + 1];
- minX = Math.min(minX, x);
- minY = Math.min(minY, y);
- maxX = Math.max(maxX, x);
- maxY = Math.max(maxY, y);
- }
- }
- }
- offset.set(minX, minY);
- size.set(maxX - minX, maxY - minY);
- }
- /** Increments the skeleton's {@link #time}. */
- update (delta) {
- this.time += delta;
- }
- get flipX() {
- return this.scaleX == -1;
- }
- set flipX(value) {
- if (!Skeleton$2.deprecatedWarning1) {
- Skeleton$2.deprecatedWarning1 = true;
- console.warn("Spine Deprecation Warning: `Skeleton.flipX/flipY` was deprecated, please use scaleX/scaleY");
- }
- this.scaleX = value ? 1.0 : -1.0;
- }
- get flipY() {
- return this.scaleY == -1;
- }
- set flipY(value) {
- if (!Skeleton$2.deprecatedWarning1) {
- Skeleton$2.deprecatedWarning1 = true;
- console.warn("Spine Deprecation Warning: `Skeleton.flipX/flipY` was deprecated, please use scaleX/scaleY");
- }
- this.scaleY = value ? 1.0 : -1.0;
- }
- static __initStatic() {this.deprecatedWarning1 = false;}
- } Skeleton$2.__initStatic();
- /** Stores the setup pose and all of the stateless data for a skeleton.
- *
- * See [Data objects](http://esotericsoftware.com/spine-runtime-architecture#Data-objects) in the Spine Runtimes
- * Guide.
- * @public
- * */
- class SkeletonData$2 {constructor() { SkeletonData$2.prototype.__init.call(this);SkeletonData$2.prototype.__init2.call(this);SkeletonData$2.prototype.__init3.call(this);SkeletonData$2.prototype.__init4.call(this);SkeletonData$2.prototype.__init5.call(this);SkeletonData$2.prototype.__init6.call(this);SkeletonData$2.prototype.__init7.call(this);SkeletonData$2.prototype.__init8.call(this);SkeletonData$2.prototype.__init9.call(this); }
- /** The skeleton's name, which by default is the name of the skeleton data file, if possible. May be null. */
-
- /** The skeleton's bones, sorted parent first. The root bone is always the first bone. */
- __init() {this.bones = new Array();} // Ordered parents first.
- /** The skeleton's slots. */
- __init2() {this.slots = new Array();} // Setup pose draw order.
- __init3() {this.skins = new Array();}
- /** The skeleton's default skin. By default this skin contains all attachments that were not in a skin in Spine.
- *
- * See {@link Skeleton#getAttachmentByName()}.
- * May be null. */
-
- /** The skeleton's events. */
- __init4() {this.events = new Array();}
- /** The skeleton's animations. */
- __init5() {this.animations = new Array();}
- /** The skeleton's IK constraints. */
- __init6() {this.ikConstraints = new Array();}
- /** The skeleton's transform constraints. */
- __init7() {this.transformConstraints = new Array();}
- /** The skeleton's path constraints. */
- __init8() {this.pathConstraints = new Array();}
- /** The X coordinate of the skeleton's axis aligned bounding box in the setup pose. */
-
- /** The Y coordinate of the skeleton's axis aligned bounding box in the setup pose. */
-
- /** The width of the skeleton's axis aligned bounding box in the setup pose. */
-
- /** The height of the skeleton's axis aligned bounding box in the setup pose. */
-
- /** The Spine version used to export the skeleton data, or null. */
-
- /** The skeleton data hash. This value will change if any of the skeleton data has changed. May be null. */
-
- // Nonessential
- /** The dopesheet FPS in Spine. Available only when nonessential data was exported. */
- __init9() {this.fps = 0;}
- /** The path to the images directory as defined in Spine. Available only when nonessential data was exported. May be null. */
-
- /** The path to the audio directory as defined in Spine. Available only when nonessential data was exported. May be null. */
-
- /** Finds a bone by comparing each bone's name. It is more efficient to cache the results of this method than to call it
- * multiple times.
- * @returns May be null. */
- findBone (boneName) {
- if (boneName == null) throw new Error("boneName cannot be null.");
- let bones = this.bones;
- for (let i = 0, n = bones.length; i < n; i++) {
- let bone = bones[i];
- if (bone.name == boneName) return bone;
- }
- return null;
- }
- findBoneIndex (boneName) {
- if (boneName == null) throw new Error("boneName cannot be null.");
- let bones = this.bones;
- for (let i = 0, n = bones.length; i < n; i++)
- if (bones[i].name == boneName) return i;
- return -1;
- }
- /** Finds a slot by comparing each slot's name. It is more efficient to cache the results of this method than to call it
- * multiple times.
- * @returns May be null. */
- findSlot (slotName) {
- if (slotName == null) throw new Error("slotName cannot be null.");
- let slots = this.slots;
- for (let i = 0, n = slots.length; i < n; i++) {
- let slot = slots[i];
- if (slot.name == slotName) return slot;
- }
- return null;
- }
- findSlotIndex (slotName) {
- if (slotName == null) throw new Error("slotName cannot be null.");
- let slots = this.slots;
- for (let i = 0, n = slots.length; i < n; i++)
- if (slots[i].name == slotName) return i;
- return -1;
- }
- /** Finds a skin by comparing each skin's name. It is more efficient to cache the results of this method than to call it
- * multiple times.
- * @returns May be null. */
- findSkin (skinName) {
- if (skinName == null) throw new Error("skinName cannot be null.");
- let skins = this.skins;
- for (let i = 0, n = skins.length; i < n; i++) {
- let skin = skins[i];
- if (skin.name == skinName) return skin;
- }
- return null;
- }
- /** Finds an event by comparing each events's name. It is more efficient to cache the results of this method than to call it
- * multiple times.
- * @returns May be null. */
- findEvent (eventDataName) {
- if (eventDataName == null) throw new Error("eventDataName cannot be null.");
- let events = this.events;
- for (let i = 0, n = events.length; i < n; i++) {
- let event = events[i];
- if (event.name == eventDataName) return event;
- }
- return null;
- }
- /** Finds an animation by comparing each animation's name. It is more efficient to cache the results of this method than to
- * call it multiple times.
- * @returns May be null. */
- findAnimation (animationName) {
- if (animationName == null) throw new Error("animationName cannot be null.");
- let animations = this.animations;
- for (let i = 0, n = animations.length; i < n; i++) {
- let animation = animations[i];
- if (animation.name == animationName) return animation;
- }
- return null;
- }
- /** Finds an IK constraint by comparing each IK constraint's name. It is more efficient to cache the results of this method
- * than to call it multiple times.
- * @return May be null. */
- findIkConstraint (constraintName) {
- if (constraintName == null) throw new Error("constraintName cannot be null.");
- let ikConstraints = this.ikConstraints;
- for (let i = 0, n = ikConstraints.length; i < n; i++) {
- let constraint = ikConstraints[i];
- if (constraint.name == constraintName) return constraint;
- }
- return null;
- }
- /** Finds a transform constraint by comparing each transform constraint's name. It is more efficient to cache the results of
- * this method than to call it multiple times.
- * @return May be null. */
- findTransformConstraint (constraintName) {
- if (constraintName == null) throw new Error("constraintName cannot be null.");
- let transformConstraints = this.transformConstraints;
- for (let i = 0, n = transformConstraints.length; i < n; i++) {
- let constraint = transformConstraints[i];
- if (constraint.name == constraintName) return constraint;
- }
- return null;
- }
- /** Finds a path constraint by comparing each path constraint's name. It is more efficient to cache the results of this method
- * than to call it multiple times.
- * @return May be null. */
- findPathConstraint (constraintName) {
- if (constraintName == null) throw new Error("constraintName cannot be null.");
- let pathConstraints = this.pathConstraints;
- for (let i = 0, n = pathConstraints.length; i < n; i++) {
- let constraint = pathConstraints[i];
- if (constraint.name == constraintName) return constraint;
- }
- return null;
- }
- findPathConstraintIndex (pathConstraintName) {
- if (pathConstraintName == null) throw new Error("pathConstraintName cannot be null.");
- let pathConstraints = this.pathConstraints;
- for (let i = 0, n = pathConstraints.length; i < n; i++)
- if (pathConstraints[i].name == pathConstraintName) return i;
- return -1;
- }
- }
- /** Stores the setup pose for a {@link Slot}.
- * @public
- * */
- class SlotData$2 {
- /** The index of the slot in {@link Skeleton#getSlots()}. */
-
- /** The name of the slot, which is unique across all slots in the skeleton. */
-
- /** The bone this slot belongs to. */
-
- /** The color used to tint the slot's attachment. If {@link #getDarkColor()} is set, this is used as the light color for two
- * color tinting. */
- __init() {this.color = new Color(1, 1, 1, 1);}
- /** The dark color used to tint the slot's attachment for two color tinting, or null if two color tinting is not used. The dark
- * color's alpha is not used. */
-
- /** The name of the attachment that is visible for this slot in the setup pose, or null if no attachment is visible. */
-
- /** The blend mode for drawing the slot's attachment. */
-
- constructor (index, name, boneData) {SlotData$2.prototype.__init.call(this);
- if (index < 0) throw new Error("index must be >= 0.");
- if (name == null) throw new Error("name cannot be null.");
- if (boneData == null) throw new Error("boneData cannot be null.");
- this.index = index;
- this.name = name;
- this.boneData = boneData;
- }
- }
- /** Stores the setup pose for a {@link TransformConstraint}.
- *
- * See [Transform constraints](http://esotericsoftware.com/spine-transform-constraints) in the Spine User Guide.
- * @public
- * */
- class TransformConstraintData$2 extends ConstraintData$1 {
- /** The bones that will be modified by this transform constraint. */
- __init() {this.bones = new Array();}
- /** The target bone whose world transform will be copied to the constrained bones. */
-
- __init2() {this.mixRotate = 0;}
- __init3() {this.mixX = 0;}
- __init4() {this.mixY = 0;}
- __init5() {this.mixScaleX = 0;}
- __init6() {this.mixScaleY = 0;}
- __init7() {this.mixShearY = 0;}
- /** An offset added to the constrained bone rotation. */
- __init8() {this.offsetRotation = 0;}
- /** An offset added to the constrained bone X translation. */
- __init9() {this.offsetX = 0;}
- /** An offset added to the constrained bone Y translation. */
- __init10() {this.offsetY = 0;}
- /** An offset added to the constrained bone scaleX. */
- __init11() {this.offsetScaleX = 0;}
- /** An offset added to the constrained bone scaleY. */
- __init12() {this.offsetScaleY = 0;}
- /** An offset added to the constrained bone shearY. */
- __init13() {this.offsetShearY = 0;}
- __init14() {this.relative = false;}
- __init15() {this.local = false;}
- constructor (name) {
- super(name, 0, false);TransformConstraintData$2.prototype.__init.call(this);TransformConstraintData$2.prototype.__init2.call(this);TransformConstraintData$2.prototype.__init3.call(this);TransformConstraintData$2.prototype.__init4.call(this);TransformConstraintData$2.prototype.__init5.call(this);TransformConstraintData$2.prototype.__init6.call(this);TransformConstraintData$2.prototype.__init7.call(this);TransformConstraintData$2.prototype.__init8.call(this);TransformConstraintData$2.prototype.__init9.call(this);TransformConstraintData$2.prototype.__init10.call(this);TransformConstraintData$2.prototype.__init11.call(this);TransformConstraintData$2.prototype.__init12.call(this);TransformConstraintData$2.prototype.__init13.call(this);TransformConstraintData$2.prototype.__init14.call(this);TransformConstraintData$2.prototype.__init15.call(this); }
- }
- /** Stores an entry in the skin consisting of the slot index, name, and attachment
- * @public
- * **/
- class SkinEntry$1 {
- constructor( slotIndex, name, attachment) {this.slotIndex = slotIndex;this.name = name;this.attachment = attachment; }
- }
- /** Stores attachments by slot index and attachment name.
- *
- * See SkeletonData {@link SkeletonData#defaultSkin}, Skeleton {@link Skeleton#skin}, and
- * [Runtime skins](http://esotericsoftware.com/spine-runtime-skins) in the Spine Runtimes Guide.
- * @public
- * */
- class Skin$2 {
- /** The skin's name, which is unique across all skins in the skeleton. */
-
- __init() {this.attachments = new Array();}
- __init2() {this.bones = Array();}
- __init3() {this.constraints = new Array();}
- constructor (name) {Skin$2.prototype.__init.call(this);Skin$2.prototype.__init2.call(this);Skin$2.prototype.__init3.call(this);
- if (name == null) throw new Error("name cannot be null.");
- this.name = name;
- }
- /** Adds an attachment to the skin for the specified slot index and name. */
- setAttachment (slotIndex, name, attachment) {
- if (attachment == null) throw new Error("attachment cannot be null.");
- let attachments = this.attachments;
- if (slotIndex >= attachments.length) attachments.length = slotIndex + 1;
- if (!attachments[slotIndex]) attachments[slotIndex] = { };
- attachments[slotIndex][name] = attachment;
- }
- /** Adds all attachments, bones, and constraints from the specified skin to this skin. */
- addSkin (skin) {
- for(let i = 0; i < skin.bones.length; i++) {
- let bone = skin.bones[i];
- let contained = false;
- for (let j = 0; j < this.bones.length; j++) {
- if (this.bones[j] == bone) {
- contained = true;
- break;
- }
- }
- if (!contained) this.bones.push(bone);
- }
- for(let i = 0; i < skin.constraints.length; i++) {
- let constraint = skin.constraints[i];
- let contained = false;
- for (let j = 0; j < this.constraints.length; j++) {
- if (this.constraints[j] == constraint) {
- contained = true;
- break;
- }
- }
- if (!contained) this.constraints.push(constraint);
- }
- let attachments = skin.getAttachments();
- for (let i = 0; i < attachments.length; i++) {
- var attachment = attachments[i];
- this.setAttachment(attachment.slotIndex, attachment.name, attachment.attachment);
- }
- }
- /** Adds all bones and constraints and copies of all attachments from the specified skin to this skin. Mesh attachments are not
- * copied, instead a new linked mesh is created. The attachment copies can be modified without affecting the originals. */
- copySkin (skin) {
- for(let i = 0; i < skin.bones.length; i++) {
- let bone = skin.bones[i];
- let contained = false;
- for (let j = 0; j < this.bones.length; j++) {
- if (this.bones[j] == bone) {
- contained = true;
- break;
- }
- }
- if (!contained) this.bones.push(bone);
- }
- for(let i = 0; i < skin.constraints.length; i++) {
- let constraint = skin.constraints[i];
- let contained = false;
- for (let j = 0; j < this.constraints.length; j++) {
- if (this.constraints[j] == constraint) {
- contained = true;
- break;
- }
- }
- if (!contained) this.constraints.push(constraint);
- }
- let attachments = skin.getAttachments();
- for (let i = 0; i < attachments.length; i++) {
- var attachment = attachments[i];
- if (attachment.attachment == null) continue;
- if (attachment.attachment instanceof MeshAttachment$2) {
- attachment.attachment = attachment.attachment.newLinkedMesh();
- this.setAttachment(attachment.slotIndex, attachment.name, attachment.attachment);
- } else {
- attachment.attachment = attachment.attachment.copy();
- this.setAttachment(attachment.slotIndex, attachment.name, attachment.attachment);
- }
- }
- }
- /** Returns the attachment for the specified slot index and name, or null. */
- getAttachment (slotIndex, name) {
- let dictionary = this.attachments[slotIndex];
- return dictionary ? dictionary[name] : null;
- }
- /** Removes the attachment in the skin for the specified slot index and name, if any. */
- removeAttachment (slotIndex, name) {
- let dictionary = this.attachments[slotIndex];
- if (dictionary) dictionary[name] = null;
- }
- /** Returns all attachments in this skin. */
- getAttachments () {
- let entries = new Array();
- for (var i = 0; i < this.attachments.length; i++) {
- let slotAttachments = this.attachments[i];
- if (slotAttachments) {
- for (let name in slotAttachments) {
- let attachment = slotAttachments[name];
- if (attachment) entries.push(new SkinEntry$1(i, name, attachment));
- }
- }
- }
- return entries;
- }
- /** Returns all attachments in this skin for the specified slot index. */
- getAttachmentsForSlot (slotIndex, attachments) {
- let slotAttachments = this.attachments[slotIndex];
- if (slotAttachments) {
- for (let name in slotAttachments) {
- let attachment = slotAttachments[name];
- if (attachment) attachments.push(new SkinEntry$1(slotIndex, name, attachment));
- }
- }
- }
- /** Clears all attachments, bones, and constraints. */
- clear () {
- this.attachments.length = 0;
- this.bones.length = 0;
- this.constraints.length = 0;
- }
- /** Attach each attachment in this skin if the corresponding attachment in the old skin is currently attached. */
- attachAll (skeleton, oldSkin) {
- let slotIndex = 0;
- for (let i = 0; i < skeleton.slots.length; i++) {
- let slot = skeleton.slots[i];
- let slotAttachment = slot.getAttachment();
- if (slotAttachment && slotIndex < oldSkin.attachments.length) {
- let dictionary = oldSkin.attachments[slotIndex];
- for (let key in dictionary) {
- let skinAttachment = dictionary[key];
- if (slotAttachment == skinAttachment) {
- let attachment = this.getAttachment(slotIndex, key);
- if (attachment != null) slot.setAttachment(attachment);
- break;
- }
- }
- }
- slotIndex++;
- }
- }
- }
- /** Loads skeleton data in the Spine binary format.
- *
- * See [Spine binary format](http://esotericsoftware.com/spine-binary-format) and
- * [JSON and binary data](http://esotericsoftware.com/spine-loading-skeleton-data#JSON-and-binary-data) in the Spine
- * Runtimes Guide.
- * @public
- * */
- class SkeletonBinary$1 {
- static __initStatic() {this.AttachmentTypeValues = [ 0 /*AttachmentType.Region*/, 1/*AttachmentType.BoundingBox*/, 2/*AttachmentType.Mesh*/, 3/*AttachmentType.LinkedMesh*/, 4/*AttachmentType.Path*/, 5/*AttachmentType.Point*/, 6/*AttachmentType.Clipping*/ ];}
- static __initStatic2() {this.TransformModeValues = [TransformMode$2.Normal, TransformMode$2.OnlyTranslation, TransformMode$2.NoRotationOrReflection, TransformMode$2.NoScale, TransformMode$2.NoScaleOrReflection];}
- static __initStatic3() {this.PositionModeValues = [ PositionMode$2.Fixed, PositionMode$2.Percent ];}
- static __initStatic4() {this.SpacingModeValues = [ SpacingMode$2.Length, SpacingMode$2.Fixed, SpacingMode$2.Percent];}
- static __initStatic5() {this.RotateModeValues = [ RotateMode$2.Tangent, RotateMode$2.Chain, RotateMode$2.ChainScale ];}
- static __initStatic6() {this.BlendModeValues = [ constants.BLEND_MODES.NORMAL, constants.BLEND_MODES.ADD, constants.BLEND_MODES.MULTIPLY, constants.BLEND_MODES.SCREEN];}
- static __initStatic7() {this.BONE_ROTATE = 0;}
- static __initStatic8() {this.BONE_TRANSLATE = 1;}
- static __initStatic9() {this.BONE_TRANSLATEX = 2;}
- static __initStatic10() {this.BONE_TRANSLATEY = 3;}
- static __initStatic11() {this.BONE_SCALE = 4;}
- static __initStatic12() {this.BONE_SCALEX = 5;}
- static __initStatic13() {this.BONE_SCALEY = 6;}
- static __initStatic14() {this.BONE_SHEAR = 7;}
- static __initStatic15() {this.BONE_SHEARX = 8;}
- static __initStatic16() {this.BONE_SHEARY = 9;}
- static __initStatic17() {this.SLOT_ATTACHMENT = 0;}
- static __initStatic18() {this.SLOT_RGBA = 1;}
- static __initStatic19() {this.SLOT_RGB = 2;}
- static __initStatic20() {this.SLOT_RGBA2 = 3;}
- static __initStatic21() {this.SLOT_RGB2 = 4;}
- static __initStatic22() {this.SLOT_ALPHA = 5;}
- static __initStatic23() {this.PATH_POSITION = 0;}
- static __initStatic24() {this.PATH_SPACING = 1;}
- static __initStatic25() {this.PATH_MIX = 2;}
- static __initStatic26() {this.CURVE_LINEAR = 0;}
- static __initStatic27() {this.CURVE_STEPPED = 1;}
- static __initStatic28() {this.CURVE_BEZIER = 2;}
- /** Scales bone positions, image sizes, and translations as they are loaded. This allows different size images to be used at
- * runtime than were used in Spine.
- *
- * See [Scaling](http://esotericsoftware.com/spine-loading-skeleton-data#Scaling) in the Spine Runtimes Guide. */
- __init() {this.scale = 1;}
-
- __init2() {this.linkedMeshes = new Array();}
- constructor (attachmentLoader) {SkeletonBinary$1.prototype.__init.call(this);SkeletonBinary$1.prototype.__init2.call(this);
- this.attachmentLoader = attachmentLoader;
- }
- readSkeletonData (binary) {
- let scale = this.scale;
- let skeletonData = new SkeletonData$2();
- skeletonData.name = ""; // BOZO
- let input = new BinaryInput(binary);
- let lowHash = input.readInt32();
- let highHash = input.readInt32();
- skeletonData.hash = highHash == 0 && lowHash == 0 ? null : highHash.toString(16) + lowHash.toString(16);
- skeletonData.version = input.readString();
- if (skeletonData.version.substr(0, 3) !== '4.0')
- {
- let error = `Spine 4.0 loader cant load version ${skeletonData.version}. Please configure your pixi-spine bundle`;
- console.error(error);
- }
- skeletonData.x = input.readFloat();
- skeletonData.y = input.readFloat();
- skeletonData.width = input.readFloat();
- skeletonData.height = input.readFloat();
- let nonessential = input.readBoolean();
- if (nonessential) {
- skeletonData.fps = input.readFloat();
- skeletonData.imagesPath = input.readString();
- skeletonData.audioPath = input.readString();
- }
- let n = 0;
- // Strings.
- n = input.readInt(true);
- for (let i = 0; i < n; i++)
- input.strings.push(input.readString());
- // Bones.
- n = input.readInt(true);
- for (let i = 0; i < n; i++) {
- let name = input.readString();
- let parent = i == 0 ? null : skeletonData.bones[input.readInt(true)];
- let data = new BoneData$2(i, name, parent);
- data.rotation = input.readFloat();
- data.x = input.readFloat() * scale;
- data.y = input.readFloat() * scale;
- data.scaleX = input.readFloat();
- data.scaleY = input.readFloat();
- data.shearX = input.readFloat();
- data.shearY = input.readFloat();
- data.length = input.readFloat() * scale;
- data.transformMode = SkeletonBinary$1.TransformModeValues[input.readInt(true)];
- data.skinRequired = input.readBoolean();
- if (nonessential) Color.rgba8888ToColor(data.color, input.readInt32());
- skeletonData.bones.push(data);
- }
- // Slots.
- n = input.readInt(true);
- for (let i = 0; i < n; i++) {
- let slotName = input.readString();
- let boneData = skeletonData.bones[input.readInt(true)];
- let data = new SlotData$2(i, slotName, boneData);
- Color.rgba8888ToColor(data.color, input.readInt32());
- let darkColor = input.readInt32();
- if (darkColor != -1) Color.rgb888ToColor(data.darkColor = new Color(), darkColor);
- data.attachmentName = input.readStringRef();
- data.blendMode = SkeletonBinary$1.BlendModeValues[input.readInt(true)];
- skeletonData.slots.push(data);
- }
- // IK constraints.
- n = input.readInt(true);
- for (let i = 0, nn; i < n; i++) {
- let data = new IkConstraintData$2(input.readString());
- data.order = input.readInt(true);
- data.skinRequired = input.readBoolean();
- nn = input.readInt(true);
- for (let ii = 0; ii < nn; ii++)
- data.bones.push(skeletonData.bones[input.readInt(true)]);
- data.target = skeletonData.bones[input.readInt(true)];
- data.mix = input.readFloat();
- data.softness = input.readFloat() * scale;
- data.bendDirection = input.readByte();
- data.compress = input.readBoolean();
- data.stretch = input.readBoolean();
- data.uniform = input.readBoolean();
- skeletonData.ikConstraints.push(data);
- }
- // Transform constraints.
- n = input.readInt(true);
- for (let i = 0, nn; i < n; i++) {
- let data = new TransformConstraintData$2(input.readString());
- data.order = input.readInt(true);
- data.skinRequired = input.readBoolean();
- nn = input.readInt(true);
- for (let ii = 0; ii < nn; ii++)
- data.bones.push(skeletonData.bones[input.readInt(true)]);
- data.target = skeletonData.bones[input.readInt(true)];
- data.local = input.readBoolean();
- data.relative = input.readBoolean();
- data.offsetRotation = input.readFloat();
- data.offsetX = input.readFloat() * scale;
- data.offsetY = input.readFloat() * scale;
- data.offsetScaleX = input.readFloat();
- data.offsetScaleY = input.readFloat();
- data.offsetShearY = input.readFloat();
- data.mixRotate = input.readFloat();
- data.mixX = input.readFloat();
- data.mixY = input.readFloat();
- data.mixScaleX = input.readFloat();
- data.mixScaleY = input.readFloat();
- data.mixShearY = input.readFloat();
- skeletonData.transformConstraints.push(data);
- }
- // Path constraints.
- n = input.readInt(true);
- for (let i = 0, nn; i < n; i++) {
- let data = new PathConstraintData$2(input.readString());
- data.order = input.readInt(true);
- data.skinRequired = input.readBoolean();
- nn = input.readInt(true);
- for (let ii = 0; ii < nn; ii++)
- data.bones.push(skeletonData.bones[input.readInt(true)]);
- data.target = skeletonData.slots[input.readInt(true)];
- data.positionMode = SkeletonBinary$1.PositionModeValues[input.readInt(true)];
- data.spacingMode = SkeletonBinary$1.SpacingModeValues[input.readInt(true)];
- data.rotateMode = SkeletonBinary$1.RotateModeValues[input.readInt(true)];
- data.offsetRotation = input.readFloat();
- data.position = input.readFloat();
- if (data.positionMode == PositionMode$2.Fixed) data.position *= scale;
- data.spacing = input.readFloat();
- if (data.spacingMode == SpacingMode$2.Length || data.spacingMode == SpacingMode$2.Fixed) data.spacing *= scale;
- data.mixRotate = input.readFloat();
- data.mixX = input.readFloat();
- data.mixY = input.readFloat();
- skeletonData.pathConstraints.push(data);
- }
- // Default skin.
- let defaultSkin = this.readSkin(input, skeletonData, true, nonessential);
- if (defaultSkin != null) {
- skeletonData.defaultSkin = defaultSkin;
- skeletonData.skins.push(defaultSkin);
- }
- // Skins.
- {
- let i = skeletonData.skins.length;
- Utils.setArraySize(skeletonData.skins, n = i + input.readInt(true));
- for (; i < n; i++)
- skeletonData.skins[i] = this.readSkin(input, skeletonData, false, nonessential);
- }
- // Linked meshes.
- n = this.linkedMeshes.length;
- for (let i = 0; i < n; i++) {
- let linkedMesh = this.linkedMeshes[i];
- let skin = linkedMesh.skin == null ? skeletonData.defaultSkin : skeletonData.findSkin(linkedMesh.skin);
- if (skin == null) throw new Error("Skin not found: " + linkedMesh.skin);
- let parent = skin.getAttachment(linkedMesh.slotIndex, linkedMesh.parent);
- if (parent == null) throw new Error("Parent mesh not found: " + linkedMesh.parent);
- linkedMesh.mesh.deformAttachment = linkedMesh.inheritDeform ? parent : linkedMesh.mesh;
- linkedMesh.mesh.setParentMesh(parent );
- // linkedMesh.mesh.updateUVs();
- }
- this.linkedMeshes.length = 0;
- // Events.
- n = input.readInt(true);
- for (let i = 0; i < n; i++) {
- let data = new EventData$2(input.readStringRef());
- data.intValue = input.readInt(false);
- data.floatValue = input.readFloat();
- data.stringValue = input.readString();
- data.audioPath = input.readString();
- if (data.audioPath != null) {
- data.volume = input.readFloat();
- data.balance = input.readFloat();
- }
- skeletonData.events.push(data);
- }
- // Animations.
- n = input.readInt(true);
- for (let i = 0; i < n; i++)
- skeletonData.animations.push(this.readAnimation(input, input.readString(), skeletonData));
- return skeletonData;
- }
- readSkin (input, skeletonData, defaultSkin, nonessential) {
- let skin = null;
- let slotCount = 0;
- if (defaultSkin) {
- slotCount = input.readInt(true);
- if (slotCount == 0) return null;
- skin = new Skin$2("default");
- } else {
- skin = new Skin$2(input.readStringRef());
- skin.bones.length = input.readInt(true);
- for (let i = 0, n = skin.bones.length; i < n; i++)
- skin.bones[i] = skeletonData.bones[input.readInt(true)];
- for (let i = 0, n = input.readInt(true); i < n; i++)
- skin.constraints.push(skeletonData.ikConstraints[input.readInt(true)]);
- for (let i = 0, n = input.readInt(true); i < n; i++)
- skin.constraints.push(skeletonData.transformConstraints[input.readInt(true)]);
- for (let i = 0, n = input.readInt(true); i < n; i++)
- skin.constraints.push(skeletonData.pathConstraints[input.readInt(true)]);
- slotCount = input.readInt(true);
- }
- for (let i = 0; i < slotCount; i++) {
- let slotIndex = input.readInt(true);
- for (let ii = 0, nn = input.readInt(true); ii < nn; ii++) {
- let name = input.readStringRef();
- let attachment = this.readAttachment(input, skeletonData, skin, slotIndex, name, nonessential);
- if (attachment != null) skin.setAttachment(slotIndex, name, attachment);
- }
- }
- return skin;
- }
- readAttachment(input, skeletonData, skin, slotIndex, attachmentName, nonessential) {
- let scale = this.scale;
- let name = input.readStringRef();
- if (name == null) name = attachmentName;
- let typeIndex = input.readByte();
- switch (SkeletonBinary$1.AttachmentTypeValues[typeIndex]) {
- case exports.AttachmentType.Region: {
- let path = input.readStringRef();
- let rotation = input.readFloat();
- let x = input.readFloat();
- let y = input.readFloat();
- let scaleX = input.readFloat();
- let scaleY = input.readFloat();
- let width = input.readFloat();
- let height = input.readFloat();
- let color = input.readInt32();
- if (path == null) path = name;
- let region = this.attachmentLoader.newRegionAttachment(skin, name, path);
- if (region == null) return null;
- region.path = path;
- region.x = x * scale;
- region.y = y * scale;
- region.scaleX = scaleX;
- region.scaleY = scaleY;
- region.rotation = rotation;
- region.width = width * scale;
- region.height = height * scale;
- Color.rgba8888ToColor(region.color, color);
- // region.updateOffset();
- return region;
- }
- case exports.AttachmentType.BoundingBox: {
- let vertexCount = input.readInt(true);
- let vertices = this.readVertices(input, vertexCount);
- let color = nonessential ? input.readInt32() : 0;
- let box = this.attachmentLoader.newBoundingBoxAttachment(skin, name);
- if (box == null) return null;
- box.worldVerticesLength = vertexCount << 1;
- box.vertices = vertices.vertices;
- box.bones = vertices.bones;
- if (nonessential) Color.rgba8888ToColor(box.color, color);
- return box;
- }
- case exports.AttachmentType.Mesh: {
- let path = input.readStringRef();
- let color = input.readInt32();
- let vertexCount = input.readInt(true);
- let uvs = this.readFloatArray(input, vertexCount << 1, 1);
- let triangles = this.readShortArray(input);
- let vertices = this.readVertices(input, vertexCount);
- let hullLength = input.readInt(true);
- let edges = null;
- let width = 0, height = 0;
- if (nonessential) {
- edges = this.readShortArray(input);
- width = input.readFloat();
- height = input.readFloat();
- }
- if (path == null) path = name;
- let mesh = this.attachmentLoader.newMeshAttachment(skin, name, path);
- if (mesh == null) return null;
- mesh.path = path;
- Color.rgba8888ToColor(mesh.color, color);
- mesh.bones = vertices.bones;
- mesh.vertices = vertices.vertices;
- mesh.worldVerticesLength = vertexCount << 1;
- mesh.triangles = triangles;
- mesh.regionUVs = new Float32Array(uvs);
- // mesh.updateUVs();
- mesh.hullLength = hullLength << 1;
- if (nonessential) {
- mesh.edges = edges;
- mesh.width = width * scale;
- mesh.height = height * scale;
- }
- return mesh;
- }
- case exports.AttachmentType.LinkedMesh: {
- let path = input.readStringRef();
- let color = input.readInt32();
- let skinName = input.readStringRef();
- let parent = input.readStringRef();
- let inheritDeform = input.readBoolean();
- let width = 0, height = 0;
- if (nonessential) {
- width = input.readFloat();
- height = input.readFloat();
- }
- if (path == null) path = name;
- let mesh = this.attachmentLoader.newMeshAttachment(skin, name, path);
- if (mesh == null) return null;
- mesh.path = path;
- Color.rgba8888ToColor(mesh.color, color);
- if (nonessential) {
- mesh.width = width * scale;
- mesh.height = height * scale;
- }
- this.linkedMeshes.push(new LinkedMesh$3(mesh, skinName, slotIndex, parent, inheritDeform));
- return mesh;
- }
- case exports.AttachmentType.Path: {
- let closed = input.readBoolean();
- let constantSpeed = input.readBoolean();
- let vertexCount = input.readInt(true);
- let vertices = this.readVertices(input, vertexCount);
- let lengths = Utils.newArray(vertexCount / 3, 0);
- for (let i = 0, n = lengths.length; i < n; i++)
- lengths[i] = input.readFloat() * scale;
- let color = nonessential ? input.readInt32() : 0;
- let path = this.attachmentLoader.newPathAttachment(skin, name);
- if (path == null) return null;
- path.closed = closed;
- path.constantSpeed = constantSpeed;
- path.worldVerticesLength = vertexCount << 1;
- path.vertices = vertices.vertices;
- path.bones = vertices.bones;
- path.lengths = lengths;
- if (nonessential) Color.rgba8888ToColor(path.color, color);
- return path;
- }
- case exports.AttachmentType.Point: {
- let rotation = input.readFloat();
- let x = input.readFloat();
- let y = input.readFloat();
- let color = nonessential ? input.readInt32() : 0;
- let point = this.attachmentLoader.newPointAttachment(skin, name);
- if (point == null) return null;
- point.x = x * scale;
- point.y = y * scale;
- point.rotation = rotation;
- if (nonessential) Color.rgba8888ToColor(point.color, color);
- return point;
- }
- case exports.AttachmentType.Clipping: {
- let endSlotIndex = input.readInt(true);
- let vertexCount = input.readInt(true);
- let vertices = this.readVertices(input, vertexCount);
- let color = nonessential ? input.readInt32() : 0;
- let clip = this.attachmentLoader.newClippingAttachment(skin, name);
- if (clip == null) return null;
- clip.endSlot = skeletonData.slots[endSlotIndex];
- clip.worldVerticesLength = vertexCount << 1;
- clip.vertices = vertices.vertices;
- clip.bones = vertices.bones;
- if (nonessential) Color.rgba8888ToColor(clip.color, color);
- return clip;
- }
- }
- return null;
- }
- readVertices (input, vertexCount) {
- let scale = this.scale;
- let verticesLength = vertexCount << 1;
- let vertices = new Vertices$1();
- if (!input.readBoolean()) {
- vertices.vertices = this.readFloatArray(input, verticesLength, scale);
- return vertices;
- }
- let weights = new Array();
- let bonesArray = new Array();
- for (let i = 0; i < vertexCount; i++) {
- let boneCount = input.readInt(true);
- bonesArray.push(boneCount);
- for (let ii = 0; ii < boneCount; ii++) {
- bonesArray.push(input.readInt(true));
- weights.push(input.readFloat() * scale);
- weights.push(input.readFloat() * scale);
- weights.push(input.readFloat());
- }
- }
- vertices.vertices = Utils.toFloatArray(weights);
- vertices.bones = bonesArray;
- return vertices;
- }
- readFloatArray (input, n, scale) {
- let array = new Array(n);
- if (scale == 1) {
- for (let i = 0; i < n; i++)
- array[i] = input.readFloat();
- } else {
- for (let i = 0; i < n; i++)
- array[i] = input.readFloat() * scale;
- }
- return array;
- }
- readShortArray (input) {
- let n = input.readInt(true);
- let array = new Array(n);
- for (let i = 0; i < n; i++)
- array[i] = input.readShort();
- return array;
- }
- readAnimation (input, name, skeletonData) {
- // @ts-ignore
- let numTimelines = input.readInt(true);
- let timelines = new Array();
- let scale = this.scale;
- // Slot timelines.
- for (let i = 0, n = input.readInt(true); i < n; i++) {
- let slotIndex = input.readInt(true);
- for (let ii = 0, nn = input.readInt(true); ii < nn; ii++) {
- let timelineType = input.readByte();
- let frameCount = input.readInt(true);
- let frameLast = frameCount - 1;
- switch (timelineType) {
- case SkeletonBinary$1.SLOT_ATTACHMENT: {
- let timeline = new AttachmentTimeline$2(frameCount, slotIndex);
- for (let frame = 0; frame < frameCount; frame++)
- timeline.setFrame(frame, input.readFloat(), input.readStringRef());
- timelines.push(timeline);
- break;
- }
- case SkeletonBinary$1.SLOT_RGBA: {
- let bezierCount = input.readInt(true);
- let timeline = new RGBATimeline(frameCount, bezierCount, slotIndex);
- let time = input.readFloat();
- let r = input.readUnsignedByte() / 255.0;
- let g = input.readUnsignedByte() / 255.0;
- let b = input.readUnsignedByte() / 255.0;
- let a = input.readUnsignedByte() / 255.0;
- for (let frame = 0, bezier = 0;; frame++) {
- timeline.setFrame(frame, time, r, g, b, a);
- if (frame == frameLast) break;
- let time2 = input.readFloat();
- let r2 = input.readUnsignedByte() / 255.0;
- let g2 = input.readUnsignedByte() / 255.0;
- let b2 = input.readUnsignedByte() / 255.0;
- let a2 = input.readUnsignedByte() / 255.0;
- switch (input.readByte()) {
- case SkeletonBinary$1.CURVE_STEPPED:
- timeline.setStepped(frame);
- break;
- case SkeletonBinary$1.CURVE_BEZIER:
- SkeletonBinary$1.setBezier(input, timeline, bezier++, frame, 0, time, time2, r, r2, 1);
- SkeletonBinary$1.setBezier(input, timeline, bezier++, frame, 1, time, time2, g, g2, 1);
- SkeletonBinary$1.setBezier(input, timeline, bezier++, frame, 2, time, time2, b, b2, 1);
- SkeletonBinary$1.setBezier(input, timeline, bezier++, frame, 3, time, time2, a, a2, 1);
- }
- time = time2;
- r = r2;
- g = g2;
- b = b2;
- a = a2;
- }
- timelines.push(timeline);
- break;
- }
- case SkeletonBinary$1.SLOT_RGB: {
- let bezierCount = input.readInt(true);
- let timeline = new RGBTimeline(frameCount, bezierCount, slotIndex);
- let time = input.readFloat();
- let r = input.readUnsignedByte() / 255.0;
- let g = input.readUnsignedByte() / 255.0;
- let b = input.readUnsignedByte() / 255.0;
- for (let frame = 0, bezier = 0;; frame++) {
- timeline.setFrame(frame, time, r, g, b);
- if (frame == frameLast) break;
- let time2 = input.readFloat();
- let r2 = input.readUnsignedByte() / 255.0;
- let g2 = input.readUnsignedByte() / 255.0;
- let b2 = input.readUnsignedByte() / 255.0;
- switch (input.readByte()) {
- case SkeletonBinary$1.CURVE_STEPPED:
- timeline.setStepped(frame);
- break;
- case SkeletonBinary$1.CURVE_BEZIER:
- SkeletonBinary$1.setBezier(input, timeline, bezier++, frame, 0, time, time2, r, r2, 1);
- SkeletonBinary$1.setBezier(input, timeline, bezier++, frame, 1, time, time2, g, g2, 1);
- SkeletonBinary$1.setBezier(input, timeline, bezier++, frame, 2, time, time2, b, b2, 1);
- }
- time = time2;
- r = r2;
- g = g2;
- b = b2;
- }
- timelines.push(timeline);
- break;
- }
- case SkeletonBinary$1.SLOT_RGBA2: {
- let bezierCount = input.readInt(true);
- let timeline = new RGBA2Timeline(frameCount, bezierCount, slotIndex);
- let time = input.readFloat();
- let r = input.readUnsignedByte() / 255.0;
- let g = input.readUnsignedByte() / 255.0;
- let b = input.readUnsignedByte() / 255.0;
- let a = input.readUnsignedByte() / 255.0;
- let r2 = input.readUnsignedByte() / 255.0;
- let g2 = input.readUnsignedByte() / 255.0;
- let b2 = input.readUnsignedByte() / 255.0;
- for (let frame = 0, bezier = 0;; frame++) {
- timeline.setFrame(frame, time, r, g, b, a, r2, g2, b2);
- if (frame == frameLast) break;
- let time2 = input.readFloat();
- let nr = input.readUnsignedByte() / 255.0;
- let ng = input.readUnsignedByte() / 255.0;
- let nb = input.readUnsignedByte() / 255.0;
- let na = input.readUnsignedByte() / 255.0;
- let nr2 = input.readUnsignedByte() / 255.0;
- let ng2 = input.readUnsignedByte() / 255.0;
- let nb2 = input.readUnsignedByte() / 255.0;
- switch (input.readByte()) {
- case SkeletonBinary$1.CURVE_STEPPED:
- timeline.setStepped(frame);
- break;
- case SkeletonBinary$1.CURVE_BEZIER:
- SkeletonBinary$1.setBezier(input, timeline, bezier++, frame, 0, time, time2, r, nr, 1);
- SkeletonBinary$1.setBezier(input, timeline, bezier++, frame, 1, time, time2, g, ng, 1);
- SkeletonBinary$1.setBezier(input, timeline, bezier++, frame, 2, time, time2, b, nb, 1);
- SkeletonBinary$1.setBezier(input, timeline, bezier++, frame, 3, time, time2, a, na, 1);
- SkeletonBinary$1.setBezier(input, timeline, bezier++, frame, 4, time, time2, r2, nr2, 1);
- SkeletonBinary$1.setBezier(input, timeline, bezier++, frame, 5, time, time2, g2, ng2, 1);
- SkeletonBinary$1.setBezier(input, timeline, bezier++, frame, 6, time, time2, b2, nb2, 1);
- }
- time = time2;
- r = nr;
- g = ng;
- b = nb;
- a = na;
- r2 = nr2;
- g2 = ng2;
- b2 = nb2;
- }
- timelines.push(timeline);
- break;
- }
- case SkeletonBinary$1.SLOT_RGB2: {
- let bezierCount = input.readInt(true);
- let timeline = new RGB2Timeline(frameCount, bezierCount, slotIndex);
- let time = input.readFloat();
- let r = input.readUnsignedByte() / 255.0;
- let g = input.readUnsignedByte() / 255.0;
- let b = input.readUnsignedByte() / 255.0;
- let r2 = input.readUnsignedByte() / 255.0;
- let g2 = input.readUnsignedByte() / 255.0;
- let b2 = input.readUnsignedByte() / 255.0;
- for (let frame = 0, bezier = 0;; frame++) {
- timeline.setFrame(frame, time, r, g, b, r2, g2, b2);
- if (frame == frameLast) break;
- let time2 = input.readFloat();
- let nr = input.readUnsignedByte() / 255.0;
- let ng = input.readUnsignedByte() / 255.0;
- let nb = input.readUnsignedByte() / 255.0;
- let nr2 = input.readUnsignedByte() / 255.0;
- let ng2 = input.readUnsignedByte() / 255.0;
- let nb2 = input.readUnsignedByte() / 255.0;
- switch (input.readByte()) {
- case SkeletonBinary$1.CURVE_STEPPED:
- timeline.setStepped(frame);
- break;
- case SkeletonBinary$1.CURVE_BEZIER:
- SkeletonBinary$1.setBezier(input, timeline, bezier++, frame, 0, time, time2, r, nr, 1);
- SkeletonBinary$1.setBezier(input, timeline, bezier++, frame, 1, time, time2, g, ng, 1);
- SkeletonBinary$1.setBezier(input, timeline, bezier++, frame, 2, time, time2, b, nb, 1);
- SkeletonBinary$1.setBezier(input, timeline, bezier++, frame, 3, time, time2, r2, nr2, 1);
- SkeletonBinary$1.setBezier(input, timeline, bezier++, frame, 4, time, time2, g2, ng2, 1);
- SkeletonBinary$1.setBezier(input, timeline, bezier++, frame, 5, time, time2, b2, nb2, 1);
- }
- time = time2;
- r = nr;
- g = ng;
- b = nb;
- r2 = nr2;
- g2 = ng2;
- b2 = nb2;
- }
- timelines.push(timeline);
- break;
- }
- case SkeletonBinary$1.SLOT_ALPHA: {
- let timeline = new AlphaTimeline(frameCount, input.readInt(true), slotIndex);
- let time = input.readFloat(), a = input.readUnsignedByte() / 255;
- for (let frame = 0, bezier = 0;; frame++) {
- timeline.setFrame(frame, time, a);
- if (frame == frameLast) break;
- let time2 = input.readFloat();
- let a2 = input.readUnsignedByte() / 255;
- switch (input.readByte()) {
- case SkeletonBinary$1.CURVE_STEPPED:
- timeline.setStepped(frame);
- break;
- case SkeletonBinary$1.CURVE_BEZIER:
- SkeletonBinary$1.setBezier(input, timeline, bezier++, frame, 0, time, time2, a, a2, 1);
- }
- time = time2;
- a = a2;
- }
- timelines.push(timeline);
- break;
- }
- }
- }
- }
- // Bone timelines.
- for (let i = 0, n = input.readInt(true); i < n; i++) {
- let boneIndex = input.readInt(true);
- for (let ii = 0, nn = input.readInt(true); ii < nn; ii++) {
- let type = input.readByte(), frameCount = input.readInt(true), bezierCount = input.readInt(true);
- switch (type) {
- case SkeletonBinary$1.BONE_ROTATE:
- timelines.push(SkeletonBinary$1.readTimeline(input, new RotateTimeline$2(frameCount, bezierCount, boneIndex), 1));
- break;
- case SkeletonBinary$1.BONE_TRANSLATE:
- timelines.push(SkeletonBinary$1.readTimeline2(input, new TranslateTimeline$2(frameCount, bezierCount, boneIndex), scale));
- break;
- case SkeletonBinary$1.BONE_TRANSLATEX:
- timelines.push(SkeletonBinary$1.readTimeline(input, new TranslateXTimeline(frameCount, bezierCount, boneIndex), scale));
- break;
- case SkeletonBinary$1.BONE_TRANSLATEY:
- timelines.push(SkeletonBinary$1.readTimeline(input, new TranslateYTimeline(frameCount, bezierCount, boneIndex), scale));
- break;
- case SkeletonBinary$1.BONE_SCALE:
- timelines.push(SkeletonBinary$1.readTimeline2(input, new ScaleTimeline$2(frameCount, bezierCount, boneIndex), 1));
- break;
- case SkeletonBinary$1.BONE_SCALEX:
- timelines.push(SkeletonBinary$1.readTimeline(input, new ScaleXTimeline(frameCount, bezierCount, boneIndex), 1));
- break;
- case SkeletonBinary$1.BONE_SCALEY:
- timelines.push(SkeletonBinary$1.readTimeline(input, new ScaleYTimeline(frameCount, bezierCount, boneIndex), 1));
- break;
- case SkeletonBinary$1.BONE_SHEAR:
- timelines.push(SkeletonBinary$1.readTimeline2(input, new ShearTimeline$2(frameCount, bezierCount, boneIndex), 1));
- break;
- case SkeletonBinary$1.BONE_SHEARX:
- timelines.push(SkeletonBinary$1.readTimeline(input, new ShearXTimeline(frameCount, bezierCount, boneIndex), 1));
- break;
- case SkeletonBinary$1.BONE_SHEARY:
- timelines.push(SkeletonBinary$1.readTimeline(input, new ShearYTimeline(frameCount, bezierCount, boneIndex), 1));
- }
- }
- }
- // IK constraint timelines.
- for (let i = 0, n = input.readInt(true); i < n; i++) {
- let index = input.readInt(true), frameCount = input.readInt(true), frameLast = frameCount - 1;
- let timeline = new IkConstraintTimeline$2(frameCount, input.readInt(true), index);
- let time = input.readFloat(), mix = input.readFloat(), softness = input.readFloat() * scale;
- for (let frame = 0, bezier = 0;; frame++) {
- timeline.setFrame(frame, time, mix, softness, input.readByte(), input.readBoolean(), input.readBoolean());
- if (frame == frameLast) break;
- let time2 = input.readFloat(), mix2 = input.readFloat(), softness2 = input.readFloat() * scale;
- switch (input.readByte()) {
- case SkeletonBinary$1.CURVE_STEPPED:
- timeline.setStepped(frame);
- break;
- case SkeletonBinary$1.CURVE_BEZIER:
- SkeletonBinary$1.setBezier(input, timeline, bezier++, frame, 0, time, time2, mix, mix2, 1);
- SkeletonBinary$1.setBezier(input, timeline, bezier++, frame, 1, time, time2, softness, softness2, scale);
- }
- time = time2;
- mix = mix2;
- softness = softness2;
- }
- timelines.push(timeline);
- }
- // Transform constraint timelines.
- for (let i = 0, n = input.readInt(true); i < n; i++) {
- let index = input.readInt(true), frameCount = input.readInt(true), frameLast = frameCount - 1;
- let timeline = new TransformConstraintTimeline$2(frameCount, input.readInt(true), index);
- let time = input.readFloat(), mixRotate = input.readFloat(), mixX = input.readFloat(), mixY = input.readFloat(),
- mixScaleX = input.readFloat(), mixScaleY = input.readFloat(), mixShearY = input.readFloat();
- for (let frame = 0, bezier = 0;; frame++) {
- timeline.setFrame(frame, time, mixRotate, mixX, mixY, mixScaleX, mixScaleY, mixShearY);
- if (frame == frameLast) break;
- let time2 = input.readFloat(), mixRotate2 = input.readFloat(), mixX2 = input.readFloat(), mixY2 = input.readFloat(),
- mixScaleX2 = input.readFloat(), mixScaleY2 = input.readFloat(), mixShearY2 = input.readFloat();
- switch (input.readByte()) {
- case SkeletonBinary$1.CURVE_STEPPED:
- timeline.setStepped(frame);
- break;
- case SkeletonBinary$1.CURVE_BEZIER:
- SkeletonBinary$1.setBezier(input, timeline, bezier++, frame, 0, time, time2, mixRotate, mixRotate2, 1);
- SkeletonBinary$1.setBezier(input, timeline, bezier++, frame, 1, time, time2, mixX, mixX2, 1);
- SkeletonBinary$1.setBezier(input, timeline, bezier++, frame, 2, time, time2, mixY, mixY2, 1);
- SkeletonBinary$1.setBezier(input, timeline, bezier++, frame, 3, time, time2, mixScaleX, mixScaleX2, 1);
- SkeletonBinary$1.setBezier(input, timeline, bezier++, frame, 4, time, time2, mixScaleY, mixScaleY2, 1);
- SkeletonBinary$1.setBezier(input, timeline, bezier++, frame, 5, time, time2, mixShearY, mixShearY2, 1);
- }
- time = time2;
- mixRotate = mixRotate2;
- mixX = mixX2;
- mixY = mixY2;
- mixScaleX = mixScaleX2;
- mixScaleY = mixScaleY2;
- mixShearY = mixShearY2;
- }
- timelines.push(timeline);
- }
- // Path constraint timelines.
- for (let i = 0, n = input.readInt(true); i < n; i++) {
- let index = input.readInt(true);
- let data = skeletonData.pathConstraints[index];
- for (let ii = 0, nn = input.readInt(true); ii < nn; ii++) {
- switch (input.readByte()) {
- case SkeletonBinary$1.PATH_POSITION:
- timelines
- .push(SkeletonBinary$1.readTimeline(input, new PathConstraintPositionTimeline$2(input.readInt(true), input.readInt(true), index),
- data.positionMode == PositionMode$2.Fixed ? scale : 1));
- break;
- case SkeletonBinary$1.PATH_SPACING:
- timelines
- .push(SkeletonBinary$1.readTimeline(input, new PathConstraintSpacingTimeline$2(input.readInt(true), input.readInt(true), index),
- data.spacingMode == SpacingMode$2.Length || data.spacingMode == SpacingMode$2.Fixed ? scale : 1));
- break;
- case SkeletonBinary$1.PATH_MIX:
- let timeline = new PathConstraintMixTimeline$2(input.readInt(true), input.readInt(true),
- index);
- let time = input.readFloat(), mixRotate = input.readFloat(), mixX = input.readFloat(), mixY = input.readFloat();
- for (let frame = 0, bezier = 0, frameLast = timeline.getFrameCount() - 1;; frame++) {
- timeline.setFrame(frame, time, mixRotate, mixX, mixY);
- if (frame == frameLast) break;
- let time2 = input.readFloat(), mixRotate2 = input.readFloat(), mixX2 = input.readFloat(),
- mixY2 = input.readFloat();
- switch (input.readByte()) {
- case SkeletonBinary$1.CURVE_STEPPED:
- timeline.setStepped(frame);
- break;
- case SkeletonBinary$1.CURVE_BEZIER:
- SkeletonBinary$1.setBezier(input, timeline, bezier++, frame, 0, time, time2, mixRotate, mixRotate2, 1);
- SkeletonBinary$1.setBezier(input, timeline, bezier++, frame, 1, time, time2, mixX, mixX2, 1);
- SkeletonBinary$1.setBezier(input, timeline, bezier++, frame, 2, time, time2, mixY, mixY2, 1);
- }
- time = time2;
- mixRotate = mixRotate2;
- mixX = mixX2;
- mixY = mixY2;
- }
- timelines.push(timeline);
- }
- }
- }
- // Deform timelines.
- for (let i = 0, n = input.readInt(true); i < n; i++) {
- let skin = skeletonData.skins[input.readInt(true)];
- for (let ii = 0, nn = input.readInt(true); ii < nn; ii++) {
- let slotIndex = input.readInt(true);
- for (let iii = 0, nnn = input.readInt(true); iii < nnn; iii++) {
- let attachmentName = input.readStringRef();
- let attachment = skin.getAttachment(slotIndex, attachmentName) ;
- if (attachment == null) throw Error("Vertex attachment not found: " + attachmentName);
- let weighted = attachment.bones != null;
- let vertices = attachment.vertices;
- let deformLength = weighted ? vertices.length / 3 * 2 : vertices.length;
- let frameCount = input.readInt(true);
- let frameLast = frameCount - 1;
- let bezierCount = input.readInt(true);
- let timeline = new DeformTimeline$2(frameCount, bezierCount, slotIndex, attachment);
- let time = input.readFloat();
- for (let frame = 0, bezier = 0;; frame++) {
- let deform;
- let end = input.readInt(true);
- if (end == 0)
- deform = weighted ? Utils.newFloatArray(deformLength) : vertices;
- else {
- deform = Utils.newFloatArray(deformLength);
- let start = input.readInt(true);
- end += start;
- if (scale == 1) {
- for (let v = start; v < end; v++)
- deform[v] = input.readFloat();
- } else {
- for (let v = start; v < end; v++)
- deform[v] = input.readFloat() * scale;
- }
- if (!weighted) {
- for (let v = 0, vn = deform.length; v < vn; v++)
- deform[v] += vertices[v];
- }
- }
- timeline.setFrame(frame, time, deform);
- if (frame == frameLast) break;
- let time2 = input.readFloat();
- switch(input.readByte()) {
- case SkeletonBinary$1.CURVE_STEPPED:
- timeline.setStepped(frame);
- break;
- case SkeletonBinary$1.CURVE_BEZIER:
- SkeletonBinary$1.setBezier(input, timeline, bezier++, frame, 0, time, time2, 0, 1, 1);
- }
- time = time2;
- }
- timelines.push(timeline);
- }
- }
- }
- // Draw order timeline.
- let drawOrderCount = input.readInt(true);
- if (drawOrderCount > 0) {
- let timeline = new DrawOrderTimeline$2(drawOrderCount);
- let slotCount = skeletonData.slots.length;
- for (let i = 0; i < drawOrderCount; i++) {
- let time = input.readFloat();
- let offsetCount = input.readInt(true);
- let drawOrder = Utils.newArray(slotCount, 0);
- for (let ii = slotCount - 1; ii >= 0; ii--)
- drawOrder[ii] = -1;
- let unchanged = Utils.newArray(slotCount - offsetCount, 0);
- let originalIndex = 0, unchangedIndex = 0;
- for (let ii = 0; ii < offsetCount; ii++) {
- let slotIndex = input.readInt(true);
- // Collect unchanged items.
- while (originalIndex != slotIndex)
- unchanged[unchangedIndex++] = originalIndex++;
- // Set changed items.
- drawOrder[originalIndex + input.readInt(true)] = originalIndex++;
- }
- // Collect remaining unchanged items.
- while (originalIndex < slotCount)
- unchanged[unchangedIndex++] = originalIndex++;
- // Fill in unchanged items.
- for (let ii = slotCount - 1; ii >= 0; ii--)
- if (drawOrder[ii] == -1) drawOrder[ii] = unchanged[--unchangedIndex];
- timeline.setFrame(i, time, drawOrder);
- }
- timelines.push(timeline);
- }
- // Event timeline.
- let eventCount = input.readInt(true);
- if (eventCount > 0) {
- let timeline = new EventTimeline$2(eventCount);
- for (let i = 0; i < eventCount; i++) {
- let time = input.readFloat();
- let eventData = skeletonData.events[input.readInt(true)];
- let event = new Event$2(time, eventData);
- event.intValue = input.readInt(false);
- event.floatValue = input.readFloat();
- event.stringValue = input.readBoolean() ? input.readString() : eventData.stringValue;
- if (event.data.audioPath != null) {
- event.volume = input.readFloat();
- event.balance = input.readFloat();
- }
- timeline.setFrame(i, event);
- }
- timelines.push(timeline);
- }
- let duration = 0;
- for (let i = 0, n = timelines.length; i < n; i++)
- duration = Math.max(duration, (timelines[i]).getDuration());
- return new Animation$2(name, timelines, duration);
- }
- static readTimeline (input, timeline, scale) {
- let time = input.readFloat(), value = input.readFloat() * scale;
- for (let frame = 0, bezier = 0, frameLast = timeline.getFrameCount() - 1;; frame++) {
- timeline.setFrame(frame, time, value);
- if (frame == frameLast) break;
- let time2 = input.readFloat(), value2 = input.readFloat() * scale;
- switch (input.readByte()) {
- case SkeletonBinary$1.CURVE_STEPPED:
- timeline.setStepped(frame);
- break;
- case SkeletonBinary$1.CURVE_BEZIER:
- SkeletonBinary$1.setBezier(input, timeline, bezier++, frame, 0, time, time2, value, value2, 1);
- }
- time = time2;
- value = value2;
- }
- return timeline;
- }
- static readTimeline2 (input, timeline, scale) {
- let time = input.readFloat(), value1 = input.readFloat() * scale, value2 = input.readFloat() * scale;
- for (let frame = 0, bezier = 0, frameLast = timeline.getFrameCount() - 1;; frame++) {
- timeline.setFrame(frame, time, value1, value2);
- if (frame == frameLast) break;
- let time2 = input.readFloat(), nvalue1 = input.readFloat() * scale, nvalue2 = input.readFloat() * scale;
- switch (input.readByte()) {
- case SkeletonBinary$1.CURVE_STEPPED:
- timeline.setStepped(frame);
- break;
- case SkeletonBinary$1.CURVE_BEZIER:
- this.setBezier(input, timeline, bezier++, frame, 0, time, time2, value1, nvalue1, scale);
- this.setBezier(input, timeline, bezier++, frame, 1, time, time2, value2, nvalue2, scale);
- }
- time = time2;
- value1 = nvalue1;
- value2 = nvalue2;
- }
- return timeline;
- }
- static setBezier (input, timeline, bezier, frame, value, time1, time2, value1, value2, scale) {
- timeline.setBezier(bezier, frame, value, time1, value1, input.readFloat(), input.readFloat() * scale, input.readFloat(), input.readFloat() * scale, time2, value2);
- }
- } SkeletonBinary$1.__initStatic(); SkeletonBinary$1.__initStatic2(); SkeletonBinary$1.__initStatic3(); SkeletonBinary$1.__initStatic4(); SkeletonBinary$1.__initStatic5(); SkeletonBinary$1.__initStatic6(); SkeletonBinary$1.__initStatic7(); SkeletonBinary$1.__initStatic8(); SkeletonBinary$1.__initStatic9(); SkeletonBinary$1.__initStatic10(); SkeletonBinary$1.__initStatic11(); SkeletonBinary$1.__initStatic12(); SkeletonBinary$1.__initStatic13(); SkeletonBinary$1.__initStatic14(); SkeletonBinary$1.__initStatic15(); SkeletonBinary$1.__initStatic16(); SkeletonBinary$1.__initStatic17(); SkeletonBinary$1.__initStatic18(); SkeletonBinary$1.__initStatic19(); SkeletonBinary$1.__initStatic20(); SkeletonBinary$1.__initStatic21(); SkeletonBinary$1.__initStatic22(); SkeletonBinary$1.__initStatic23(); SkeletonBinary$1.__initStatic24(); SkeletonBinary$1.__initStatic25(); SkeletonBinary$1.__initStatic26(); SkeletonBinary$1.__initStatic27(); SkeletonBinary$1.__initStatic28();
- class LinkedMesh$3 {
-
-
-
-
- constructor (mesh, skin, slotIndex, parent, inheritDeform) {
- this.mesh = mesh;
- this.skin = skin;
- this.slotIndex = slotIndex;
- this.parent = parent;
- this.inheritDeform = inheritDeform;
- }
- }
- class Vertices$1 {
- constructor( bones = null, vertices = null) {this.bones = bones;this.vertices = vertices; }
- }
- /** Collects each visible {@link BoundingBoxAttachment} and computes the world vertices for its polygon. The polygon vertices are
- * provided along with convenience methods for doing hit detection.
- * @public
- * */
- class SkeletonBounds$2 {constructor() { SkeletonBounds$2.prototype.__init.call(this);SkeletonBounds$2.prototype.__init2.call(this);SkeletonBounds$2.prototype.__init3.call(this);SkeletonBounds$2.prototype.__init4.call(this);SkeletonBounds$2.prototype.__init5.call(this);SkeletonBounds$2.prototype.__init6.call(this);SkeletonBounds$2.prototype.__init7.call(this); }
- /** The left edge of the axis aligned bounding box. */
- __init() {this.minX = 0;}
- /** The bottom edge of the axis aligned bounding box. */
- __init2() {this.minY = 0;}
- /** The right edge of the axis aligned bounding box. */
- __init3() {this.maxX = 0;}
- /** The top edge of the axis aligned bounding box. */
- __init4() {this.maxY = 0;}
- /** The visible bounding boxes. */
- __init5() {this.boundingBoxes = new Array();}
- /** The world vertices for the bounding box polygons. */
- __init6() {this.polygons = new Array();}
- __init7() {this.polygonPool = new Pool(() => {
- return Utils.newFloatArray(16);
- });}
- /** Clears any previous polygons, finds all visible bounding box attachments, and computes the world vertices for each bounding
- * box's polygon.
- * @param updateAabb If true, the axis aligned bounding box containing all the polygons is computed. If false, the
- * SkeletonBounds AABB methods will always return true. */
- update (skeleton, updateAabb) {
- if (skeleton == null) throw new Error("skeleton cannot be null.");
- let boundingBoxes = this.boundingBoxes;
- let polygons = this.polygons;
- let polygonPool = this.polygonPool;
- let slots = skeleton.slots;
- let slotCount = slots.length;
- boundingBoxes.length = 0;
- polygonPool.freeAll(polygons);
- polygons.length = 0;
- for (let i = 0; i < slotCount; i++) {
- let slot = slots[i];
- if (!slot.bone.active) continue;
- let attachment = slot.getAttachment();
- if (attachment instanceof BoundingBoxAttachment$2) {
- let boundingBox = attachment ;
- boundingBoxes.push(boundingBox);
- let polygon = polygonPool.obtain();
- if (polygon.length != boundingBox.worldVerticesLength) {
- polygon = Utils.newFloatArray(boundingBox.worldVerticesLength);
- }
- polygons.push(polygon);
- boundingBox.computeWorldVertices(slot, 0, boundingBox.worldVerticesLength, polygon, 0, 2);
- }
- }
- if (updateAabb) {
- this.aabbCompute();
- } else {
- this.minX = Number.POSITIVE_INFINITY;
- this.minY = Number.POSITIVE_INFINITY;
- this.maxX = Number.NEGATIVE_INFINITY;
- this.maxY = Number.NEGATIVE_INFINITY;
- }
- }
- aabbCompute () {
- let minX = Number.POSITIVE_INFINITY, minY = Number.POSITIVE_INFINITY, maxX = Number.NEGATIVE_INFINITY, maxY = Number.NEGATIVE_INFINITY;
- let polygons = this.polygons;
- for (let i = 0, n = polygons.length; i < n; i++) {
- let polygon = polygons[i];
- let vertices = polygon;
- for (let ii = 0, nn = polygon.length; ii < nn; ii += 2) {
- let x = vertices[ii];
- let y = vertices[ii + 1];
- minX = Math.min(minX, x);
- minY = Math.min(minY, y);
- maxX = Math.max(maxX, x);
- maxY = Math.max(maxY, y);
- }
- }
- this.minX = minX;
- this.minY = minY;
- this.maxX = maxX;
- this.maxY = maxY;
- }
- /** Returns true if the axis aligned bounding box contains the point. */
- aabbContainsPoint (x, y) {
- return x >= this.minX && x <= this.maxX && y >= this.minY && y <= this.maxY;
- }
- /** Returns true if the axis aligned bounding box intersects the line segment. */
- aabbIntersectsSegment (x1, y1, x2, y2) {
- let minX = this.minX;
- let minY = this.minY;
- let maxX = this.maxX;
- let maxY = this.maxY;
- if ((x1 <= minX && x2 <= minX) || (y1 <= minY && y2 <= minY) || (x1 >= maxX && x2 >= maxX) || (y1 >= maxY && y2 >= maxY))
- return false;
- let m = (y2 - y1) / (x2 - x1);
- let y = m * (minX - x1) + y1;
- if (y > minY && y < maxY) return true;
- y = m * (maxX - x1) + y1;
- if (y > minY && y < maxY) return true;
- let x = (minY - y1) / m + x1;
- if (x > minX && x < maxX) return true;
- x = (maxY - y1) / m + x1;
- if (x > minX && x < maxX) return true;
- return false;
- }
- /** Returns true if the axis aligned bounding box intersects the axis aligned bounding box of the specified bounds. */
- aabbIntersectsSkeleton (bounds) {
- return this.minX < bounds.maxX && this.maxX > bounds.minX && this.minY < bounds.maxY && this.maxY > bounds.minY;
- }
- /** Returns the first bounding box attachment that contains the point, or null. When doing many checks, it is usually more
- * efficient to only call this method if {@link #aabbContainsPoint(float, float)} returns true. */
- containsPoint (x, y) {
- let polygons = this.polygons;
- for (let i = 0, n = polygons.length; i < n; i++)
- if (this.containsPointPolygon(polygons[i], x, y)) return this.boundingBoxes[i];
- return null;
- }
- /** Returns true if the polygon contains the point. */
- containsPointPolygon (polygon, x, y) {
- let vertices = polygon;
- let nn = polygon.length;
- let prevIndex = nn - 2;
- let inside = false;
- for (let ii = 0; ii < nn; ii += 2) {
- let vertexY = vertices[ii + 1];
- let prevY = vertices[prevIndex + 1];
- if ((vertexY < y && prevY >= y) || (prevY < y && vertexY >= y)) {
- let vertexX = vertices[ii];
- if (vertexX + (y - vertexY) / (prevY - vertexY) * (vertices[prevIndex] - vertexX) < x) inside = !inside;
- }
- prevIndex = ii;
- }
- return inside;
- }
- /** Returns the first bounding box attachment that contains any part of the line segment, or null. When doing many checks, it
- * is usually more efficient to only call this method if {@link #aabbIntersectsSegment()} returns
- * true. */
- intersectsSegment (x1, y1, x2, y2) {
- let polygons = this.polygons;
- for (let i = 0, n = polygons.length; i < n; i++)
- if (this.intersectsSegmentPolygon(polygons[i], x1, y1, x2, y2)) return this.boundingBoxes[i];
- return null;
- }
- /** Returns true if the polygon contains any part of the line segment. */
- intersectsSegmentPolygon (polygon, x1, y1, x2, y2) {
- let vertices = polygon;
- let nn = polygon.length;
- let width12 = x1 - x2, height12 = y1 - y2;
- let det1 = x1 * y2 - y1 * x2;
- let x3 = vertices[nn - 2], y3 = vertices[nn - 1];
- for (let ii = 0; ii < nn; ii += 2) {
- let x4 = vertices[ii], y4 = vertices[ii + 1];
- let det2 = x3 * y4 - y3 * x4;
- let width34 = x3 - x4, height34 = y3 - y4;
- let det3 = width12 * height34 - height12 * width34;
- let x = (det1 * width34 - width12 * det2) / det3;
- if (((x >= x3 && x <= x4) || (x >= x4 && x <= x3)) && ((x >= x1 && x <= x2) || (x >= x2 && x <= x1))) {
- let y = (det1 * height34 - height12 * det2) / det3;
- if (((y >= y3 && y <= y4) || (y >= y4 && y <= y3)) && ((y >= y1 && y <= y2) || (y >= y2 && y <= y1))) return true;
- }
- x3 = x4;
- y3 = y4;
- }
- return false;
- }
- /** Returns the polygon for the specified bounding box, or null. */
- getPolygon (boundingBox) {
- if (boundingBox == null) throw new Error("boundingBox cannot be null.");
- let index = this.boundingBoxes.indexOf(boundingBox);
- return index == -1 ? null : this.polygons[index];
- }
- /** The width of the axis aligned bounding box. */
- getWidth () {
- return this.maxX - this.minX;
- }
- /** The height of the axis aligned bounding box. */
- getHeight () {
- return this.maxY - this.minY;
- }
- }
- /** Loads skeleton data in the Spine JSON format.
- *
- * See [Spine JSON format](http://esotericsoftware.com/spine-json-format) and
- * [JSON and binary data](http://esotericsoftware.com/spine-loading-skeleton-data#JSON-and-binary-data) in the Spine
- * Runtimes Guide.
- * @public
- * */
- class SkeletonJson$2 {
-
- /** Scales bone positions, image sizes, and translations as they are loaded. This allows different size images to be used at
- * runtime than were used in Spine.
- *
- * See [Scaling](http://esotericsoftware.com/spine-loading-skeleton-data#Scaling) in the Spine Runtimes Guide. */
- __init() {this.scale = 1;}
- __init2() {this.linkedMeshes = new Array();}
- constructor (attachmentLoader) {SkeletonJson$2.prototype.__init.call(this);SkeletonJson$2.prototype.__init2.call(this);
- this.attachmentLoader = attachmentLoader;
- }
- readSkeletonData (json) {
- let scale = this.scale;
- let skeletonData = new SkeletonData$2();
- let root = typeof(json) === "string" ? JSON.parse(json) : json;
- // Skeleton
- let skeletonMap = root.skeleton;
- if (skeletonMap != null) {
- skeletonData.hash = skeletonMap.hash;
- skeletonData.version = skeletonMap.spine;
- if (skeletonData.version.substr(0, 3) !== '4.0') {
- let error = `Spine 4.0 loader cant load version ${skeletonMap.spine}. Please configure your pixi-spine bundle`;
- console.error(error);
- }
- skeletonData.x = skeletonMap.x;
- skeletonData.y = skeletonMap.y;
- skeletonData.width = skeletonMap.width;
- skeletonData.height = skeletonMap.height;
- skeletonData.fps = skeletonMap.fps;
- skeletonData.imagesPath = skeletonMap.images;
- }
- // Bones
- if (root.bones) {
- for (let i = 0; i < root.bones.length; i++) {
- let boneMap = root.bones[i];
- let parent = null;
- let parentName = this.getValue(boneMap, "parent", null);
- if (parentName != null) {
- parent = skeletonData.findBone(parentName);
- if (parent == null) throw new Error("Parent bone not found: " + parentName);
- }
- let data = new BoneData$2(skeletonData.bones.length, boneMap.name, parent);
- data.length = this.getValue(boneMap, "length", 0) * scale;
- data.x = this.getValue(boneMap, "x", 0) * scale;
- data.y = this.getValue(boneMap, "y", 0) * scale;
- data.rotation = this.getValue(boneMap, "rotation", 0);
- data.scaleX = this.getValue(boneMap, "scaleX", 1);
- data.scaleY = this.getValue(boneMap, "scaleY", 1);
- data.shearX = this.getValue(boneMap, "shearX", 0);
- data.shearY = this.getValue(boneMap, "shearY", 0);
- data.transformMode = SkeletonJson$2.transformModeFromString(this.getValue(boneMap, "transform", "normal"));
- data.skinRequired = this.getValue(boneMap, "skin", false);
- let color = this.getValue(boneMap, "color", null);
- if (color) data.color.setFromString(color);
- skeletonData.bones.push(data);
- }
- }
- // Slots.
- if (root.slots) {
- for (let i = 0; i < root.slots.length; i++) {
- let slotMap = root.slots[i];
- let slotName = slotMap.name;
- let boneName = slotMap.bone;
- let boneData = skeletonData.findBone(boneName);
- if (boneData == null) throw new Error("Slot bone not found: " + boneName);
- let data = new SlotData$2(skeletonData.slots.length, slotName, boneData);
- let color = this.getValue(slotMap, "color", null);
- if (color != null) data.color.setFromString(color);
- let dark = this.getValue(slotMap, "dark", null);
- if (dark != null) {
- data.darkColor = new Color(1, 1, 1, 1);
- data.darkColor.setFromString(dark);
- }
- data.attachmentName = this.getValue(slotMap, "attachment", null);
- data.blendMode = SkeletonJson$2.blendModeFromString(this.getValue(slotMap, "blend", "normal"));
- skeletonData.slots.push(data);
- }
- }
- // IK constraints
- if (root.ik) {
- for (let i = 0; i < root.ik.length; i++) {
- let constraintMap = root.ik[i];
- let data = new IkConstraintData$2(constraintMap.name);
- data.order = this.getValue(constraintMap, "order", 0);
- data.skinRequired = this.getValue(constraintMap, "skin", false);
- for (let j = 0; j < constraintMap.bones.length; j++) {
- let boneName = constraintMap.bones[j];
- let bone = skeletonData.findBone(boneName);
- if (bone == null) throw new Error("IK bone not found: " + boneName);
- data.bones.push(bone);
- }
- let targetName = constraintMap.target;
- data.target = skeletonData.findBone(targetName);
- if (data.target == null) throw new Error("IK target bone not found: " + targetName);
- data.mix = this.getValue(constraintMap, "mix", 1);
- data.softness = this.getValue(constraintMap, "softness", 0) * scale;
- data.bendDirection = this.getValue(constraintMap, "bendPositive", true) ? 1 : -1;
- data.compress = this.getValue(constraintMap, "compress", false);
- data.stretch = this.getValue(constraintMap, "stretch", false);
- data.uniform = this.getValue(constraintMap, "uniform", false);
- skeletonData.ikConstraints.push(data);
- }
- }
- // Transform constraints.
- if (root.transform) {
- for (let i = 0; i < root.transform.length; i++) {
- let constraintMap = root.transform[i];
- let data = new TransformConstraintData$2(constraintMap.name);
- data.order = this.getValue(constraintMap, "order", 0);
- data.skinRequired = this.getValue(constraintMap, "skin", false);
- for (let j = 0; j < constraintMap.bones.length; j++) {
- let boneName = constraintMap.bones[j];
- let bone = skeletonData.findBone(boneName);
- if (bone == null) throw new Error("Transform constraint bone not found: " + boneName);
- data.bones.push(bone);
- }
- let targetName = constraintMap.target;
- data.target = skeletonData.findBone(targetName);
- if (data.target == null) throw new Error("Transform constraint target bone not found: " + targetName);
- data.local = this.getValue(constraintMap, "local", false);
- data.relative = this.getValue(constraintMap, "relative", false);
- data.offsetRotation = this.getValue(constraintMap, "rotation", 0);
- data.offsetX = this.getValue(constraintMap, "x", 0) * scale;
- data.offsetY = this.getValue(constraintMap, "y", 0) * scale;
- data.offsetScaleX = this.getValue(constraintMap, "scaleX", 0);
- data.offsetScaleY = this.getValue(constraintMap, "scaleY", 0);
- data.offsetShearY = this.getValue(constraintMap, "shearY", 0);
- data.mixRotate = this.getValue(constraintMap, "mixRotate", 1);
- data.mixX = this.getValue(constraintMap, "mixX", 1);
- data.mixY = this.getValue(constraintMap, "mixY", data.mixX);
- data.mixScaleX = this.getValue(constraintMap, "mixScaleX", 1);
- data.mixScaleY = this.getValue(constraintMap, "mixScaleY", data.mixScaleX);
- data.mixShearY = this.getValue(constraintMap, "mixShearY", 1);
- skeletonData.transformConstraints.push(data);
- }
- }
- // Path constraints.
- if (root.path) {
- for (let i = 0; i < root.path.length; i++) {
- let constraintMap = root.path[i];
- let data = new PathConstraintData$2(constraintMap.name);
- data.order = this.getValue(constraintMap, "order", 0);
- data.skinRequired = this.getValue(constraintMap, "skin", false);
- for (let j = 0; j < constraintMap.bones.length; j++) {
- let boneName = constraintMap.bones[j];
- let bone = skeletonData.findBone(boneName);
- if (bone == null) throw new Error("Transform constraint bone not found: " + boneName);
- data.bones.push(bone);
- }
- let targetName = constraintMap.target;
- data.target = skeletonData.findSlot(targetName);
- if (data.target == null) throw new Error("Path target slot not found: " + targetName);
- data.positionMode = SkeletonJson$2.positionModeFromString(this.getValue(constraintMap, "positionMode", "percent"));
- data.spacingMode = SkeletonJson$2.spacingModeFromString(this.getValue(constraintMap, "spacingMode", "length"));
- data.rotateMode = SkeletonJson$2.rotateModeFromString(this.getValue(constraintMap, "rotateMode", "tangent"));
- data.offsetRotation = this.getValue(constraintMap, "rotation", 0);
- data.position = this.getValue(constraintMap, "position", 0);
- if (data.positionMode == PositionMode$2.Fixed) data.position *= scale;
- data.spacing = this.getValue(constraintMap, "spacing", 0);
- if (data.spacingMode == SpacingMode$2.Length || data.spacingMode == SpacingMode$2.Fixed) data.spacing *= scale;
- data.mixRotate = this.getValue(constraintMap, "mixRotate", 1);
- data.mixX = this.getValue(constraintMap, "mixX", 1);
- data.mixY = this.getValue(constraintMap, "mixY", 1);
- skeletonData.pathConstraints.push(data);
- }
- }
- // Skins.
- if (root.skins) {
- for (let i = 0; i < root.skins.length; i++) {
- let skinMap = root.skins[i];
- let skin = new Skin$2(skinMap.name);
- if (skinMap.bones) {
- for (let ii = 0; ii < skinMap.bones.length; ii++) {
- let bone = skeletonData.findBone(skinMap.bones[ii]);
- if (bone == null) throw new Error("Skin bone not found: " + skinMap.bones[i]);
- skin.bones.push(bone);
- }
- }
- if (skinMap.ik) {
- for (let ii = 0; ii < skinMap.ik.length; ii++) {
- let constraint = skeletonData.findIkConstraint(skinMap.ik[ii]);
- if (constraint == null) throw new Error("Skin IK constraint not found: " + skinMap.ik[i]);
- skin.constraints.push(constraint);
- }
- }
- if (skinMap.transform) {
- for (let ii = 0; ii < skinMap.transform.length; ii++) {
- let constraint = skeletonData.findTransformConstraint(skinMap.transform[ii]);
- if (constraint == null) throw new Error("Skin transform constraint not found: " + skinMap.transform[i]);
- skin.constraints.push(constraint);
- }
- }
- if (skinMap.path) {
- for (let ii = 0; ii < skinMap.path.length; ii++) {
- let constraint = skeletonData.findPathConstraint(skinMap.path[ii]);
- if (constraint == null) throw new Error("Skin path constraint not found: " + skinMap.path[i]);
- skin.constraints.push(constraint);
- }
- }
- for (let slotName in skinMap.attachments) {
- let slot = skeletonData.findSlot(slotName);
- if (slot == null) throw new Error("Slot not found: " + slotName);
- let slotMap = skinMap.attachments[slotName];
- for (let entryName in slotMap) {
- let attachment = this.readAttachment(slotMap[entryName], skin, slot.index, entryName, skeletonData);
- if (attachment != null) skin.setAttachment(slot.index, entryName, attachment);
- }
- }
- skeletonData.skins.push(skin);
- if (skin.name == "default") skeletonData.defaultSkin = skin;
- }
- }
- // Linked meshes.
- for (let i = 0, n = this.linkedMeshes.length; i < n; i++) {
- let linkedMesh = this.linkedMeshes[i];
- let skin = linkedMesh.skin == null ? skeletonData.defaultSkin : skeletonData.findSkin(linkedMesh.skin);
- if (skin == null) throw new Error("Skin not found: " + linkedMesh.skin);
- let parent = skin.getAttachment(linkedMesh.slotIndex, linkedMesh.parent);
- if (parent == null) throw new Error("Parent mesh not found: " + linkedMesh.parent);
- linkedMesh.mesh.deformAttachment = linkedMesh.inheritDeform ? parent : linkedMesh.mesh;
- linkedMesh.mesh.setParentMesh( parent);
- // linkedMesh.mesh.updateUVs();
- }
- this.linkedMeshes.length = 0;
- // Events.
- if (root.events) {
- for (let eventName in root.events) {
- let eventMap = root.events[eventName];
- let data = new EventData$2(eventName);
- data.intValue = this.getValue(eventMap, "int", 0);
- data.floatValue = this.getValue(eventMap, "float", 0);
- data.stringValue = this.getValue(eventMap, "string", "");
- data.audioPath = this.getValue(eventMap, "audio", null);
- if (data.audioPath != null) {
- data.volume = this.getValue(eventMap, "volume", 1);
- data.balance = this.getValue(eventMap, "balance", 0);
- }
- skeletonData.events.push(data);
- }
- }
- // Animations.
- if (root.animations) {
- for (let animationName in root.animations) {
- let animationMap = root.animations[animationName];
- this.readAnimation(animationMap, animationName, skeletonData);
- }
- }
- return skeletonData;
- }
- readAttachment (map, skin, slotIndex, name, skeletonData) {
- let scale = this.scale;
- name = this.getValue(map, "name", name);
- switch (this.getValue(map, "type", "region")) {
- case "region": {
- let path = this.getValue(map, "path", name);
- let region = this.attachmentLoader.newRegionAttachment(skin, name, path);
- if (region == null) return null;
- region.path = path;
- region.x = this.getValue(map, "x", 0) * scale;
- region.y = this.getValue(map, "y", 0) * scale;
- region.scaleX = this.getValue(map, "scaleX", 1);
- region.scaleY = this.getValue(map, "scaleY", 1);
- region.rotation = this.getValue(map, "rotation", 0);
- region.width = map.width * scale;
- region.height = map.height * scale;
- let color = this.getValue(map, "color", null);
- if (color != null) region.color.setFromString(color);
- // region.updateOffset();
- return region;
- }
- case "boundingbox": {
- let box = this.attachmentLoader.newBoundingBoxAttachment(skin, name);
- if (box == null) return null;
- this.readVertices(map, box, map.vertexCount << 1);
- let color = this.getValue(map, "color", null);
- if (color != null) box.color.setFromString(color);
- return box;
- }
- case "mesh":
- case "linkedmesh": {
- let path = this.getValue(map, "path", name);
- let mesh = this.attachmentLoader.newMeshAttachment(skin, name, path);
- if (mesh == null) return null;
- mesh.path = path;
- let color = this.getValue(map, "color", null);
- if (color != null) mesh.color.setFromString(color);
- mesh.width = this.getValue(map, "width", 0) * scale;
- mesh.height = this.getValue(map, "height", 0) * scale;
- let parent = this.getValue(map, "parent", null);
- if (parent != null) {
- this.linkedMeshes.push(new LinkedMesh$1$1(mesh, this.getValue(map, "skin", null), slotIndex, parent, this.getValue(map, "deform", true)));
- return mesh;
- }
- let uvs = map.uvs;
- this.readVertices(map, mesh, uvs.length);
- mesh.triangles = map.triangles;
- mesh.regionUVs = new Float32Array(uvs);
- // mesh.updateUVs();
- mesh.edges = this.getValue(map, "edges", null);
- mesh.hullLength = this.getValue(map, "hull", 0) * 2;
- return mesh;
- }
- case "path": {
- let path = this.attachmentLoader.newPathAttachment(skin, name);
- if (path == null) return null;
- path.closed = this.getValue(map, "closed", false);
- path.constantSpeed = this.getValue(map, "constantSpeed", true);
- let vertexCount = map.vertexCount;
- this.readVertices(map, path, vertexCount << 1);
- let lengths = Utils.newArray(vertexCount / 3, 0);
- for (let i = 0; i < map.lengths.length; i++)
- lengths[i] = map.lengths[i] * scale;
- path.lengths = lengths;
- let color = this.getValue(map, "color", null);
- if (color != null) path.color.setFromString(color);
- return path;
- }
- case "point": {
- let point = this.attachmentLoader.newPointAttachment(skin, name);
- if (point == null) return null;
- point.x = this.getValue(map, "x", 0) * scale;
- point.y = this.getValue(map, "y", 0) * scale;
- point.rotation = this.getValue(map, "rotation", 0);
- let color = this.getValue(map, "color", null);
- if (color != null) point.color.setFromString(color);
- return point;
- }
- case "clipping": {
- let clip = this.attachmentLoader.newClippingAttachment(skin, name);
- if (clip == null) return null;
- let end = this.getValue(map, "end", null);
- if (end != null) {
- let slot = skeletonData.findSlot(end);
- if (slot == null) throw new Error("Clipping end slot not found: " + end);
- clip.endSlot = slot;
- }
- let vertexCount = map.vertexCount;
- this.readVertices(map, clip, vertexCount << 1);
- let color = this.getValue(map, "color", null);
- if (color != null) clip.color.setFromString(color);
- return clip;
- }
- }
- return null;
- }
- readVertices (map, attachment, verticesLength) {
- let scale = this.scale;
- attachment.worldVerticesLength = verticesLength;
- let vertices = map.vertices;
- if (verticesLength == vertices.length) {
- let scaledVertices = Utils.toFloatArray(vertices);
- if (scale != 1) {
- for (let i = 0, n = vertices.length; i < n; i++)
- scaledVertices[i] *= scale;
- }
- attachment.vertices = scaledVertices;
- return;
- }
- let weights = new Array();
- let bones = new Array();
- for (let i = 0, n = vertices.length; i < n;) {
- let boneCount = vertices[i++];
- bones.push(boneCount);
- for (let nn = i + boneCount * 4; i < nn; i += 4) {
- bones.push(vertices[i]);
- weights.push(vertices[i + 1] * scale);
- weights.push(vertices[i + 2] * scale);
- weights.push(vertices[i + 3]);
- }
- }
- attachment.bones = bones;
- attachment.vertices = Utils.toFloatArray(weights);
- }
- readAnimation (map, name, skeletonData) {
- let scale = this.scale;
- let timelines = new Array();
- // Slot timelines.
- if (map.slots) {
- for (let slotName in map.slots) {
- let slotMap = map.slots[slotName];
- let slotIndex = skeletonData.findSlotIndex(slotName);
- if (slotIndex == -1) throw new Error("Slot not found: " + slotName);
- for (let timelineName in slotMap) {
- let timelineMap = slotMap[timelineName];
- if (!timelineMap) continue;
- if (timelineName == "attachment") {
- let timeline = new AttachmentTimeline$2(timelineMap.length, slotIndex);
- for (let frame = 0; frame < timelineMap.length; frame++) {
- let keyMap = timelineMap[frame];
- timeline.setFrame(frame, this.getValue(keyMap, "time", 0), keyMap.name);
- }
- timelines.push(timeline);
- } else if (timelineName == "rgba") {
- let timeline = new RGBATimeline(timelineMap.length, timelineMap.length << 2, slotIndex);
- let keyMap = timelineMap[0];
- let time = this.getValue(keyMap, "time", 0);
- let color = new Color().setFromString(keyMap.color);
- for (let frame = 0, bezier = 0;; frame++) {
- timeline.setFrame(frame, time, color.r, color.g, color.b, color.a);
- if (timelineMap.length == frame + 1) {
- break;
- }
- let nextMap = timelineMap[frame + 1];
- let time2 = this.getValue(nextMap, "time", 0);
- let newColor = new Color().setFromString(nextMap.color);
- let curve = keyMap.curve;
- if (curve) {
- bezier = this.readCurve(curve, timeline, bezier, frame, 0, time, time2, color.r, newColor.r, 1);
- bezier = this.readCurve(curve, timeline, bezier, frame, 1, time, time2, color.g, newColor.g, 1);
- bezier = this.readCurve(curve, timeline, bezier, frame, 2, time, time2, color.b, newColor.b, 1);
- bezier = this.readCurve(curve, timeline, bezier, frame, 3, time, time2, color.a, newColor.a, 1);
- }
- time = time2;
- color = newColor;
- keyMap = nextMap;
- }
- timelines.push(timeline);
- } else if (timelineName == "rgb") {
- let timeline = new RGBTimeline(timelineMap.length, timelineMap.length * 3, slotIndex);
- let keyMap = timelineMap[0];
- let time = this.getValue(keyMap, "time", 0);
- let color = new Color().setFromString(keyMap.color);
- for (let frame = 0, bezier = 0;; frame++) {
- timeline.setFrame(frame, time, color.r, color.g, color.b);
- if (timelineMap.length == frame + 1) {
- break;
- }
- let nextMap = timelineMap[frame + 1];
- let time2 = this.getValue(nextMap, "time", 0);
- let newColor = new Color().setFromString(nextMap.color);
- let curve = keyMap.curve;
- if (curve) {
- bezier = this.readCurve(curve, timeline, bezier, frame, 0, time, time2, color.r, newColor.r, 1);
- bezier = this.readCurve(curve, timeline, bezier, frame, 1, time, time2, color.g, newColor.g, 1);
- bezier = this.readCurve(curve, timeline, bezier, frame, 2, time, time2, color.b, newColor.b, 1);
- }
- time = time2;
- color = newColor;
- keyMap = nextMap;
- }
- timelines.push(timeline);
- } else if (timelineName == "alpha") {
- timelines.push(this.readTimeline(timelineMap, new AlphaTimeline(timelineMap.length, timelineMap.length, slotIndex), 0, 1));
- } else if (timelineName == "rgba2") {
- let timeline = new RGBA2Timeline(timelineMap.length, timelineMap.length * 7, slotIndex);
- let keyMap = timelineMap[0];
- let time = this.getValue(keyMap, "time", 0);
- let color = new Color().setFromString(keyMap.light);
- let color2 = new Color().setFromString(keyMap.dark);
- for (let frame = 0, bezier = 0;; frame++) {
- timeline.setFrame(frame, time, color.r, color.g, color.b, color.a, color2.r, color2.g, color2.b);
- if (timelineMap.length == frame + 1) {
- break;
- }
- let nextMap = timelineMap[frame + 1];
- let time2 = this.getValue(nextMap, "time", 0);
- let newColor = new Color().setFromString(nextMap.light);
- let newColor2 = new Color().setFromString(nextMap.dark);
- let curve = keyMap.curve;
- if (curve) {
- bezier = this.readCurve(curve, timeline, bezier, frame, 0, time, time2, color.r, newColor.r, 1);
- bezier = this.readCurve(curve, timeline, bezier, frame, 1, time, time2, color.g, newColor.g, 1);
- bezier = this.readCurve(curve, timeline, bezier, frame, 2, time, time2, color.b, newColor.b, 1);
- bezier = this.readCurve(curve, timeline, bezier, frame, 3, time, time2, color.a, newColor.a, 1);
- bezier = this.readCurve(curve, timeline, bezier, frame, 4, time, time2, color2.r, newColor2.r, 1);
- bezier = this.readCurve(curve, timeline, bezier, frame, 5, time, time2, color2.g, newColor2.g, 1);
- bezier = this.readCurve(curve, timeline, bezier, frame, 6, time, time2, color2.b, newColor2.b, 1);
- }
- time = time2;
- color = newColor;
- color2 = newColor2;
- keyMap = nextMap;
- }
- timelines.push(timeline);
- } else if (timelineName == "rgb2") {
- let timeline = new RGB2Timeline(timelineMap.length, timelineMap.length * 6, slotIndex);
- let keyMap = timelineMap[0];
- let time = this.getValue(keyMap, "time", 0);
- let color = new Color().setFromString(keyMap.light);
- let color2 = new Color().setFromString(keyMap.dark);
- for (let frame = 0, bezier = 0;; frame++) {
- timeline.setFrame(frame, time, color.r, color.g, color.b, color2.r, color2.g, color2.b);
- if (timelineMap.length == frame + 1) {
- break;
- }
- let nextMap = timelineMap[frame + 1];
- let time2 = this.getValue(nextMap, "time", 0);
- let newColor = new Color().setFromString(nextMap.light);
- let newColor2 = new Color().setFromString(nextMap.dark);
- let curve = keyMap.curve;
- if (curve) {
- bezier = this.readCurve(curve, timeline, bezier, frame, 0, time, time2, color.r, newColor.r, 1);
- bezier = this.readCurve(curve, timeline, bezier, frame, 1, time, time2, color.g, newColor.g, 1);
- bezier = this.readCurve(curve, timeline, bezier, frame, 2, time, time2, color.b, newColor.b, 1);
- bezier = this.readCurve(curve, timeline, bezier, frame, 3, time, time2, color2.r, newColor2.r, 1);
- bezier = this.readCurve(curve, timeline, bezier, frame, 4, time, time2, color2.g, newColor2.g, 1);
- bezier = this.readCurve(curve, timeline, bezier, frame, 5, time, time2, color2.b, newColor2.b, 1);
- }
- time = time2;
- color = newColor;
- color2 = newColor2;
- keyMap = nextMap;
- }
- timelines.push(timeline);
- } else
- throw new Error("Invalid timeline type for a slot: " + timelineName + " (" + slotName + ")");
- }
- }
- }
- // Bone timelines.
- if (map.bones) {
- for (let boneName in map.bones) {
- let boneMap = map.bones[boneName];
- let boneIndex = skeletonData.findBoneIndex(boneName);
- if (boneIndex == -1) throw new Error("Bone not found: " + boneName);
- for (let timelineName in boneMap) {
- let timelineMap = boneMap[timelineName];
- if (timelineMap.length == 0) continue;
- if (timelineName === "rotate") {
- timelines.push(this.readTimeline(timelineMap, new RotateTimeline$2(timelineMap.length, timelineMap.length, boneIndex), 0, 1));
- } else if (timelineName === "translate") {
- let timeline = new TranslateTimeline$2(timelineMap.length, timelineMap.length << 1, boneIndex);
- timelines.push(this.readTimeline2(timelineMap, timeline, "x", "y", 0, scale));
- } else if (timelineName === "translatex") {
- let timeline = new TranslateXTimeline(timelineMap.length, timelineMap.length, boneIndex);
- timelines.push(this.readTimeline(timelineMap, timeline, 0, scale));
- } else if (timelineName === "translatey") {
- let timeline = new TranslateYTimeline(timelineMap.length, timelineMap.length, boneIndex);
- timelines.push(this.readTimeline(timelineMap, timeline, 0, scale));
- } else if (timelineName === "scale") {
- let timeline = new ScaleTimeline$2(timelineMap.length, timelineMap.length << 1, boneIndex);
- timelines.push(this.readTimeline2(timelineMap, timeline, "x", "y", 1, 1));
- } else if (timelineName === "scalex") {
- let timeline = new ScaleXTimeline(timelineMap.length, timelineMap.length, boneIndex);
- timelines.push(this.readTimeline(timelineMap, timeline, 1, 1));
- } else if (timelineName === "scaley") {
- let timeline = new ScaleYTimeline(timelineMap.length, timelineMap.length, boneIndex);
- timelines.push(this.readTimeline(timelineMap, timeline, 1, 1));
- } else if (timelineName === "shear") {
- let timeline = new ShearTimeline$2(timelineMap.length, timelineMap.length << 1, boneIndex);
- timelines.push(this.readTimeline2(timelineMap, timeline, "x", "y", 0, 1));
- } else if (timelineName === "shearx") {
- let timeline = new ShearXTimeline(timelineMap.length, timelineMap.length, boneIndex);
- timelines.push(this.readTimeline(timelineMap, timeline, 0, 1));
- } else if (timelineName === "sheary") {
- let timeline = new ShearYTimeline(timelineMap.length, timelineMap.length, boneIndex);
- timelines.push(this.readTimeline(timelineMap, timeline, 0, 1));
- } else {
- throw new Error("Invalid timeline type for a bone: " + timelineName + " (" + boneName + ")");
- }
- }
- }
- }
- // IK constraint timelines.
- if (map.ik) {
- for (let constraintName in map.ik) {
- let constraintMap = map.ik[constraintName];
- let keyMap = constraintMap[0];
- if (!keyMap) continue;
- let constraint = skeletonData.findIkConstraint(constraintName);
- let constraintIndex = skeletonData.ikConstraints.indexOf(constraint);
- let timeline = new IkConstraintTimeline$2(constraintMap.length, constraintMap.length << 1, constraintIndex);
- let time = this.getValue(keyMap, "time", 0);
- let mix = this.getValue(keyMap, "mix", 1);
- let softness = this.getValue(keyMap, "softness", 0) * scale;
- for (let frame = 0, bezier = 0;; frame++) {
- timeline.setFrame(frame, time, mix, softness, this.getValue(keyMap, "bendPositive", true) ? 1 : -1, this.getValue(keyMap, "compress", false), this.getValue(keyMap, "stretch", false));
- let nextMap = constraintMap[frame + 1];
- if (!nextMap) {
- break;
- }
- let time2 = this.getValue(nextMap, "time", 0);
- let mix2 = this.getValue(nextMap, "mix", 1);
- let softness2 = this.getValue(nextMap, "softness", 0) * scale;
- let curve = keyMap.curve;
- if (curve) {
- bezier = this.readCurve(curve, timeline, bezier, frame, 0, time, time2, mix, mix2, 1);
- bezier = this.readCurve(curve, timeline, bezier, frame, 1, time, time2, softness, softness2, scale);
- }
- time = time2;
- mix = mix2;
- softness = softness2;
- keyMap = nextMap;
- }
- timelines.push(timeline);
- }
- }
- // Transform constraint timelines.
- if (map.transform) {
- for (let constraintName in map.transform) {
- let timelineMap = map.transform[constraintName];
- let keyMap = timelineMap[0];
- if (!keyMap) continue;
- let constraint = skeletonData.findTransformConstraint(constraintName);
- let constraintIndex = skeletonData.transformConstraints.indexOf(constraint);
- let timeline = new TransformConstraintTimeline$2(timelineMap.length, timelineMap.length << 2, constraintIndex);
- let time = this.getValue(keyMap, "time", 0);
- let mixRotate = this.getValue(keyMap, "mixRotate", 1);
- let mixShearY = this.getValue(keyMap, "mixShearY", 1);
- let mixX = this.getValue(keyMap, "mixX", 1);
- let mixY = this.getValue(keyMap, "mixY", mixX);
- let mixScaleX = this.getValue(keyMap, "mixScaleX", 1);
- let mixScaleY = this.getValue(keyMap, "mixScaleY", mixScaleX);
- for (let frame = 0, bezier = 0;; frame++) {
- timeline.setFrame(frame, time, mixRotate, mixX, mixY, mixScaleX, mixScaleY, mixShearY);
- let nextMap = timelineMap[frame + 1];
- if (!nextMap) {
- break;
- }
- let time2 = this.getValue(nextMap, "time", 0);
- let mixRotate2 = this.getValue(nextMap, "mixRotate", 1);
- let mixShearY2 = this.getValue(nextMap, "mixShearY", 1);
- let mixX2 = this.getValue(nextMap, "mixX", 1);
- let mixY2 = this.getValue(nextMap, "mixY", mixX2);
- let mixScaleX2 = this.getValue(nextMap, "mixScaleX", 1);
- let mixScaleY2 = this.getValue(nextMap, "mixScaleY", mixScaleX2);
- let curve = keyMap.curve;
- if (curve) {
- bezier = this.readCurve(curve, timeline, bezier, frame, 0, time, time2, mixRotate, mixRotate2, 1);
- bezier = this.readCurve(curve, timeline, bezier, frame, 1, time, time2, mixX, mixX2, 1);
- bezier = this.readCurve(curve, timeline, bezier, frame, 2, time, time2, mixY, mixY2, 1);
- bezier = this.readCurve(curve, timeline, bezier, frame, 3, time, time2, mixScaleX, mixScaleX2, 1);
- bezier = this.readCurve(curve, timeline, bezier, frame, 4, time, time2, mixScaleY, mixScaleY2, 1);
- bezier = this.readCurve(curve, timeline, bezier, frame, 5, time, time2, mixShearY, mixShearY2, 1);
- }
- time = time2;
- mixRotate = mixRotate2;
- mixX = mixX2;
- mixY = mixY2;
- mixScaleX = mixScaleX2;
- mixScaleY = mixScaleY2;
- mixScaleX = mixScaleX2;
- keyMap = nextMap;
- }
- timelines.push(timeline);
- }
- }
- // Path constraint timelines.
- if (map.path) {
- for (let constraintName in map.path) {
- let constraintMap = map.path[constraintName];
- let index = skeletonData.findPathConstraintIndex(constraintName);
- if (index == -1) throw new Error("Path constraint not found: " + constraintName);
- let data = skeletonData.pathConstraints[index];
- for (let timelineName in constraintMap) {
- let timelineMap = constraintMap[timelineName];
- let keyMap = timelineMap[0];
- if (!keyMap) continue;
- if (timelineName === "position") {
- let timeline = new PathConstraintPositionTimeline$2(timelineMap.length, timelineMap.length, index);
- timelines.push(this.readTimeline(timelineMap, timeline, 0, data.positionMode == PositionMode$2.Fixed ? scale : 1));
- } else if (timelineName === "spacing") {
- let timeline = new PathConstraintSpacingTimeline$2(timelineMap.length, timelineMap.length, index);
- timelines.push(this.readTimeline(timelineMap, timeline, 0, data.spacingMode == SpacingMode$2.Length || data.spacingMode == SpacingMode$2.Fixed ? scale : 1));
- } else if (timelineName === "mix") {
- let timeline = new PathConstraintMixTimeline$2(timelineMap.size, timelineMap.size * 3, index);
- let time = this.getValue(keyMap, "time", 0);
- let mixRotate = this.getValue(keyMap, "mixRotate", 1);
- let mixX = this.getValue(keyMap, "mixX", 1);
- let mixY = this.getValue(keyMap, "mixY", mixX);
- for (let frame = 0, bezier = 0;; frame++) {
- timeline.setFrame(frame, time, mixRotate, mixX, mixY);
- let nextMap = timelineMap[frame + 1];
- if (!nextMap) {
- break;
- }
- let time2 = this.getValue(nextMap, "time", 0);
- let mixRotate2 = this.getValue(nextMap, "mixRotate", 1);
- let mixX2 = this.getValue(nextMap, "mixX", 1);
- let mixY2 = this.getValue(nextMap, "mixY", mixX2);
- let curve = keyMap.curve;
- if (curve != null) {
- bezier = this.readCurve(curve, timeline, bezier, frame, 0, time, time2, mixRotate, mixRotate2, 1);
- bezier = this.readCurve(curve, timeline, bezier, frame, 1, time, time2, mixX, mixX2, 1);
- bezier = this.readCurve(curve, timeline, bezier, frame, 2, time, time2, mixY, mixY2, 1);
- }
- time = time2;
- mixRotate = mixRotate2;
- mixX = mixX2;
- mixY = mixY2;
- keyMap = nextMap;
- }
- timelines.push(timeline);
- }
- }
- }
- }
- // Deform timelines.
- if (map.deform) {
- for (let deformName in map.deform) {
- let deformMap = map.deform[deformName];
- let skin = skeletonData.findSkin(deformName);
- if (skin == null) {
- if (settings.FAIL_ON_NON_EXISTING_SKIN) {
- throw new Error("Skin not found: " + deformName);
- } else {
- continue;
- }
- }
- for (let slotName in deformMap) {
- let slotMap = deformMap[slotName];
- let slotIndex = skeletonData.findSlotIndex(slotName);
- if (slotIndex == -1) throw new Error("Slot not found: " + slotMap.name);
- for (let timelineName in slotMap) {
- let timelineMap = slotMap[timelineName];
- let keyMap = timelineMap[0];
- if (!keyMap) continue;
- let attachment = skin.getAttachment(slotIndex, timelineName);
- if (attachment == null) throw new Error("Deform attachment not found: " + timelineMap.name);
- let weighted = attachment.bones != null;
- let vertices = attachment.vertices;
- let deformLength = weighted ? vertices.length / 3 * 2 : vertices.length;
- let timeline = new DeformTimeline$2(timelineMap.length, timelineMap.length, slotIndex, attachment);
- let time = this.getValue(keyMap, "time", 0);
- for (let frame = 0, bezier = 0;; frame++) {
- let deform;
- let verticesValue = this.getValue(keyMap, "vertices", null);
- if (verticesValue == null)
- deform = weighted ? Utils.newFloatArray(deformLength) : vertices;
- else {
- deform = Utils.newFloatArray(deformLength);
- let start = this.getValue(keyMap, "offset", 0);
- Utils.arrayCopy(verticesValue, 0, deform, start, verticesValue.length);
- if (scale != 1) {
- for (let i = start, n = i + verticesValue.length; i < n; i++)
- deform[i] *= scale;
- }
- if (!weighted) {
- for (let i = 0; i < deformLength; i++)
- deform[i] += vertices[i];
- }
- }
- timeline.setFrame(frame, time, deform);
- let nextMap = timelineMap[frame + 1];
- if (!nextMap) {
- break;
- }
- let time2 = this.getValue(nextMap, "time", 0);
- let curve = keyMap.curve;
- if (curve) {
- bezier = this.readCurve(curve, timeline, bezier, frame, 0, time, time2, 0, 1, 1);
- }
- time = time2;
- keyMap = nextMap;
- }
- timelines.push(timeline);
- }
- }
- }
- }
- // Draw order timeline.
- let drawOrderNode = map.drawOrder;
- if (drawOrderNode == null) drawOrderNode = map.draworder;
- if (drawOrderNode != null) {
- let timeline = new DrawOrderTimeline$2(drawOrderNode.length);
- let slotCount = skeletonData.slots.length;
- let frame = 0;
- for (let j = 0; j < drawOrderNode.length; j++, frame++) {
- let drawOrderMap = drawOrderNode[j];
- let drawOrder = null;
- let offsets = this.getValue(drawOrderMap, "offsets", null);
- if (offsets != null) {
- drawOrder = Utils.newArray(slotCount, -1);
- let unchanged = Utils.newArray(slotCount - offsets.length, 0);
- let originalIndex = 0, unchangedIndex = 0;
- for (let i = 0; i < offsets.length; i++) {
- let offsetMap = offsets[i];
- let slotIndex = skeletonData.findSlotIndex(offsetMap.slot);
- if (slotIndex == -1) throw new Error("Slot not found: " + offsetMap.slot);
- // Collect unchanged items.
- while (originalIndex != slotIndex)
- unchanged[unchangedIndex++] = originalIndex++;
- // Set changed items.
- drawOrder[originalIndex + offsetMap.offset] = originalIndex++;
- }
- // Collect remaining unchanged items.
- while (originalIndex < slotCount)
- unchanged[unchangedIndex++] = originalIndex++;
- // Fill in unchanged items.
- for (let i = slotCount - 1; i >= 0; i--)
- if (drawOrder[i] == -1) drawOrder[i] = unchanged[--unchangedIndex];
- }
- timeline.setFrame(frame, this.getValue(drawOrderMap, "time", 0), drawOrder);
- }
- timelines.push(timeline);
- }
- // Event timeline.
- if (map.events) {
- let timeline = new EventTimeline$2(map.events.length);
- let frame = 0;
- for (let i = 0; i < map.events.length; i++, frame++) {
- let eventMap = map.events[i];
- let eventData = skeletonData.findEvent(eventMap.name);
- if (eventData == null) throw new Error("Event not found: " + eventMap.name);
- let event = new Event$2(Utils.toSinglePrecision(this.getValue(eventMap, "time", 0)), eventData);
- event.intValue = this.getValue(eventMap, "int", eventData.intValue);
- event.floatValue = this.getValue(eventMap, "float", eventData.floatValue);
- event.stringValue = this.getValue(eventMap, "string", eventData.stringValue);
- if (event.data.audioPath != null) {
- event.volume = this.getValue(eventMap, "volume", 1);
- event.balance = this.getValue(eventMap, "balance", 0);
- }
- timeline.setFrame(frame, event);
- }
- timelines.push(timeline);
- }
- let duration = 0;
- for (let i = 0, n = timelines.length; i < n; i++)
- duration = Math.max(duration, (timelines[i]).getDuration());
- if (isNaN(duration)) {
- throw new Error("Error while parsing animation, duration is NaN");
- }
- skeletonData.animations.push(new Animation$2(name, timelines, duration));
- }
- readTimeline (keys, timeline, defaultValue, scale) {
- let keyMap = keys[0];
- let time = this.getValue(keyMap, "time", 0);
- let value = this.getValue(keyMap, "value", defaultValue) * scale;
- let bezier = 0;
- for (let frame = 0;; frame++) {
- timeline.setFrame(frame, time, value);
- let nextMap = keys[frame + 1];
- if (!nextMap) break;
- let time2 = this.getValue(nextMap, "time", 0);
- let value2 = this.getValue(nextMap, "value", defaultValue) * scale;
- let curve = keyMap.curve;
- if (curve) bezier = this.readCurve(curve, timeline, bezier, frame, 0, time, time2, value, value2, scale);
- time = time2;
- value = value2;
- keyMap = nextMap;
- }
- return timeline;
- }
- readTimeline2 (keys, timeline, name1, name2, defaultValue, scale) {
- let keyMap = keys[0];
- let time = this.getValue(keyMap, "time", 0);
- let value1 = this.getValue(keyMap, name1, defaultValue) * scale;
- let value2 = this.getValue(keyMap, name2, defaultValue) * scale;
- let bezier = 0;
- for (let frame = 0;; frame++) {
- timeline.setFrame(frame, time, value1, value2);
- let nextMap = keys[frame + 1];
- if (!nextMap) break;
- let time2 = this.getValue(nextMap, "time", 0);
- let nvalue1 = this.getValue(nextMap, name1, defaultValue) * scale;
- let nvalue2 = this.getValue(nextMap, name2, defaultValue) * scale;
- let curve = keyMap.curve;
- if (curve != null) {
- bezier = this.readCurve(curve, timeline, bezier, frame, 0, time, time2, value1, nvalue1, scale);
- bezier = this.readCurve(curve, timeline, bezier, frame, 1, time, time2, value2, nvalue2, scale);
- }
- time = time2;
- value1 = nvalue1;
- value2 = nvalue2;
- keyMap = nextMap;
- }
- timeline.shrink(bezier);
- return timeline;
- }
- readCurve (curve, timeline, bezier, frame, value, time1, time2,
- value1, value2, scale) {
- if (curve == "stepped") {
- if (value != 0) timeline.setStepped(frame);
- } else {
- let i = value << 2;
- let cx1 = curve[i++];
- let cy1 = curve[i++] * scale;
- let cx2 = curve[i++];
- let cy2 = curve[i++] * scale;
- this.setBezier(timeline, frame, value, bezier++, time1, value1, cx1, cy1, cx2, cy2, time2, value2);
- }
- return bezier;
- }
- setBezier (timeline, frame, value, bezier, time1, value1, cx1, cy1,
- cx2, cy2, time2, value2) {
- timeline.setBezier(bezier, frame, value, time1, value1, cx1, cy1, cx2, cy2, time2, value2);
- }
- getValue (map, prop, defaultValue) {
- return map[prop] !== undefined ? map[prop] : defaultValue;
- }
- static blendModeFromString (str) {
- str = str.toLowerCase();
- if (str == "normal") return constants.BLEND_MODES.NORMAL;
- if (str == "additive") return constants.BLEND_MODES.ADD;
- if (str == "multiply") return constants.BLEND_MODES.MULTIPLY;
- if (str == "screen") return constants.BLEND_MODES.SCREEN;
- throw new Error(`Unknown blend mode: ${str}`);
- }
- static positionModeFromString (str) {
- str = str.toLowerCase();
- if (str == "fixed") return PositionMode$2.Fixed;
- if (str == "percent") return PositionMode$2.Percent;
- throw new Error(`Unknown position mode: ${str}`);
- }
- static spacingModeFromString (str) {
- str = str.toLowerCase();
- if (str == "length") return SpacingMode$2.Length;
- if (str == "fixed") return SpacingMode$2.Fixed;
- if (str == "percent") return SpacingMode$2.Percent;
- if (str == "proportional") return SpacingMode$2.Proportional;
- throw new Error(`Unknown spacing mode: ${str}`);
- }
- static rotateModeFromString (str) {
- str = str.toLowerCase();
- if (str == "tangent") return RotateMode$2.Tangent;
- if (str == "chain") return RotateMode$2.Chain;
- if (str == "chainscale") return RotateMode$2.ChainScale;
- throw new Error(`Unknown rotate mode: ${str}`);
- }
- static transformModeFromString(str) {
- str = str.toLowerCase();
- if (str == "normal") return TransformMode$2.Normal;
- if (str == "onlytranslation") return TransformMode$2.OnlyTranslation;
- if (str == "norotationorreflection") return TransformMode$2.NoRotationOrReflection;
- if (str == "noscale") return TransformMode$2.NoScale;
- if (str == "noscaleorreflection") return TransformMode$2.NoScaleOrReflection;
- throw new Error(`Unknown transform mode: ${str}`);
- }
- }
- class LinkedMesh$1$1 {
-
-
-
-
- constructor (mesh, skin, slotIndex, parent, inheritDeform) {
- this.mesh = mesh;
- this.skin = skin;
- this.slotIndex = slotIndex;
- this.parent = parent;
- this.inheritDeform = inheritDeform;
- }
- }
- /**
- * @public
- */
- class Spine$2 extends SpineBase {
- createSkeleton(spineData) {
- this.skeleton = new Skeleton$2(spineData);
- this.skeleton.updateWorldTransform();
- this.stateData = new AnimationStateData$2(spineData);
- this.state = new AnimationState$2(this.stateData);
- }
- }
- var spine40 = /*#__PURE__*/Object.freeze({
- __proto__: null,
- AlphaTimeline: AlphaTimeline,
- Animation: Animation$2,
- AnimationState: AnimationState$2,
- AnimationStateAdapter: AnimationStateAdapter$1,
- AnimationStateData: AnimationStateData$2,
- AtlasAttachmentLoader: AtlasAttachmentLoader$2,
- Attachment: Attachment$2,
- AttachmentTimeline: AttachmentTimeline$2,
- Bone: Bone$2,
- BoneData: BoneData$2,
- BoundingBoxAttachment: BoundingBoxAttachment$2,
- ClippingAttachment: ClippingAttachment$2,
- ConstraintData: ConstraintData$1,
- CurveTimeline: CurveTimeline$2,
- CurveTimeline1: CurveTimeline1,
- CurveTimeline2: CurveTimeline2,
- DeformTimeline: DeformTimeline$2,
- DrawOrderTimeline: DrawOrderTimeline$2,
- Event: Event$2,
- EventData: EventData$2,
- EventQueue: EventQueue$2,
- EventTimeline: EventTimeline$2,
- get EventType () { return EventType$2; },
- IkConstraint: IkConstraint$2,
- IkConstraintData: IkConstraintData$2,
- IkConstraintTimeline: IkConstraintTimeline$2,
- JitterEffect: JitterEffect$2,
- MeshAttachment: MeshAttachment$2,
- get MixBlend () { return MixBlend$2; },
- get MixDirection () { return MixDirection$2; },
- PathAttachment: PathAttachment$2,
- PathConstraint: PathConstraint$2,
- PathConstraintData: PathConstraintData$2,
- PathConstraintMixTimeline: PathConstraintMixTimeline$2,
- PathConstraintPositionTimeline: PathConstraintPositionTimeline$2,
- PathConstraintSpacingTimeline: PathConstraintSpacingTimeline$2,
- PointAttachment: PointAttachment$2,
- get PositionMode () { return PositionMode$2; },
- get Property () { return Property; },
- RGB2Timeline: RGB2Timeline,
- RGBA2Timeline: RGBA2Timeline,
- RGBATimeline: RGBATimeline,
- RGBTimeline: RGBTimeline,
- RegionAttachment: RegionAttachment$2,
- get RotateMode () { return RotateMode$2; },
- RotateTimeline: RotateTimeline$2,
- ScaleTimeline: ScaleTimeline$2,
- ScaleXTimeline: ScaleXTimeline,
- ScaleYTimeline: ScaleYTimeline,
- ShearTimeline: ShearTimeline$2,
- ShearXTimeline: ShearXTimeline,
- ShearYTimeline: ShearYTimeline,
- Skeleton: Skeleton$2,
- SkeletonBinary: SkeletonBinary$1,
- SkeletonBounds: SkeletonBounds$2,
- SkeletonData: SkeletonData$2,
- SkeletonJson: SkeletonJson$2,
- Skin: Skin$2,
- SkinEntry: SkinEntry$1,
- Slot: Slot$2,
- SlotData: SlotData$2,
- get SpacingMode () { return SpacingMode$2; },
- Spine: Spine$2,
- SwirlEffect: SwirlEffect$2,
- Timeline: Timeline,
- TrackEntry: TrackEntry$2,
- TransformConstraint: TransformConstraint$2,
- TransformConstraintData: TransformConstraintData$2,
- TransformConstraintTimeline: TransformConstraintTimeline$2,
- get TransformMode () { return TransformMode$2; },
- TranslateTimeline: TranslateTimeline$2,
- TranslateXTimeline: TranslateXTimeline,
- TranslateYTimeline: TranslateYTimeline,
- VertexAttachment: VertexAttachment$2
- });
- /* eslint-disable */
- /**
- * @public
- */
- var SPINE_VERSION; (function (SPINE_VERSION) {
- const UNKNOWN = 0; SPINE_VERSION[SPINE_VERSION["UNKNOWN"] = UNKNOWN] = "UNKNOWN";
- const VER37 = 37; SPINE_VERSION[SPINE_VERSION["VER37"] = VER37] = "VER37";
- const VER38 = 38; SPINE_VERSION[SPINE_VERSION["VER38"] = VER38] = "VER38";
- const VER40 = 40; SPINE_VERSION[SPINE_VERSION["VER40"] = VER40] = "VER40";
- })(SPINE_VERSION || (SPINE_VERSION = {}));
- /**
- * @public
- */
- function detectSpineVersion(version) {
- const ver3 = version.substr(0, 3);
- const verNum = Math.floor(+ver3 * 10 + 1e-3);
- if (ver3 === '3.7') {
- return SPINE_VERSION.VER37;
- }
- if (ver3 === '3.8') {
- return SPINE_VERSION.VER38;
- }
- if (ver3 === '4.0') {
- return SPINE_VERSION.VER40;
- }
- // try parse old versions with 3.7
- if (verNum < SPINE_VERSION.VER37) {
- return SPINE_VERSION.VER37;
- }
- return SPINE_VERSION.UNKNOWN;
- }
- class UniBinaryParser {constructor() { UniBinaryParser.prototype.__init.call(this); }
- __init() {this.scale = 1;}
- readSkeletonData(atlas, dataToParse) {
- let input = new BinaryInput(dataToParse);
- input.readString();
- let version = input.readString();
- let ver = detectSpineVersion(version);
- let parser = null;
- if (ver === SPINE_VERSION.VER38) {
- parser = new SkeletonBinary(new AtlasAttachmentLoader(atlas));
- }
- input = new BinaryInput(dataToParse);
- input.readInt32();
- input.readInt32();
- version = input.readString();
- ver = detectSpineVersion(version);
- if (ver === SPINE_VERSION.VER40) {
- parser = new SkeletonBinary$1(new AtlasAttachmentLoader$2(atlas));
- }
- if (!parser) {
- let error = `Unsupported version of spine model ${version}, please update pixi-spine`;
- console.error(error);
- }
- parser.scale = this.scale;
- return parser.readSkeletonData(dataToParse);
- }
- }
- class UniJsonParser {constructor() { UniJsonParser.prototype.__init2.call(this); }
- __init2() {this.scale = 1;}
- readSkeletonData(atlas, dataToParse) {
- const version = dataToParse.skeleton.spine;
- const ver = detectSpineVersion(version);
- let parser = null;
- if (ver === SPINE_VERSION.VER37) {
- parser = new SkeletonJson$1(new AtlasAttachmentLoader$1(atlas));
- }
- if (ver === SPINE_VERSION.VER38) {
- parser = new SkeletonJson(new AtlasAttachmentLoader(atlas));
- }
- if (ver === SPINE_VERSION.VER40) {
- parser = new SkeletonJson$2(new AtlasAttachmentLoader$2(atlas));
- }
- if (!parser) {
- let error = `Unsupported version of spine model ${version}, please update pixi-spine`;
- console.error(error);
- }
- parser.scale = this.scale;
- return parser.readSkeletonData(dataToParse);
- }
- }
- /**
- * @public
- */
- class SpineParser extends AbstractSpineParser {
- createBinaryParser() {
- return new UniBinaryParser();
- }
- createJsonParser() {
- return new UniJsonParser();
- }
- parseData(resource, parser, atlas, dataToParse) {
- const parserCast = parser ;
- resource.spineData = parserCast.readSkeletonData(atlas, dataToParse);
- resource.spineAtlas = atlas;
- }
- static __initStatic() {this.use = new SpineParser().genMiddleware().use;}
- static registerLoaderPlugin() {
- loaders.Loader.registerPlugin(SpineParser);
- }
- } SpineParser.__initStatic();
- /**
- * @public
- */
- class Spine$3 extends SpineBase
- {
- createSkeleton(spineData) {
- const ver = detectSpineVersion(spineData.version);
- let spine = null;
- if (ver === SPINE_VERSION.VER37) {
- spine = spine37;
- }
- if (ver === SPINE_VERSION.VER38) {
- spine = spine38;
- }
- if (ver === SPINE_VERSION.VER40) {
- spine = spine40;
- }
- if (!spine) {
- let error = `Cant detect version of spine model ${spineData.version}`;
- console.error(error);
- }
- this.skeleton = new spine.Skeleton(spineData);
- this.skeleton.updateWorldTransform();
- this.stateData = new spine.AnimationStateData(spineData);
- this.state = new spine.AnimationState(this.stateData);
- }
- }
- SpineParser.registerLoaderPlugin();
- exports.BinaryInput = BinaryInput;
- exports.Color = Color;
- exports.DebugUtils = DebugUtils;
- exports.IntSet = IntSet;
- exports.Interpolation = Interpolation;
- exports.MathUtils = MathUtils;
- exports.Pool = Pool;
- exports.Pow = Pow;
- exports.PowOut = PowOut;
- exports.Spine = Spine$3;
- exports.SpineBase = SpineBase;
- exports.SpineMesh = SpineMesh;
- exports.SpineParser = SpineParser;
- exports.SpineSprite = SpineSprite;
- exports.StringSet = StringSet;
- exports.TextureAtlas = TextureAtlas;
- exports.TextureAtlasPage = TextureAtlasPage;
- exports.TextureAtlasRegion = TextureAtlasRegion;
- exports.TextureRegion = TextureRegion;
- exports.TimeKeeper = TimeKeeper;
- exports.Utils = Utils;
- exports.Vector2 = Vector2;
- exports.WindowedMean = WindowedMean;
- exports.filterFromString = filterFromString;
- exports.settings = settings;
- exports.wrapFromString = wrapFromString;
- Object.defineProperty(exports, '__esModule', { value: true });
- })));
- if (typeof pixi_spine !== 'undefined') { Object.assign(this.PIXI.spine, pixi_spine); }
- //# sourceMappingURL=pixi-spine.umd.js.map
|