From 0f2d0dae804e162fc3463f59da1378a657487b21 Mon Sep 17 00:00:00 2001 From: MikalDev Date: Wed, 12 Jan 2022 15:25:35 -0800 Subject: [PATCH 1/2] feat (runtime) initial Spine 4.x support Changes required for 4.0 spine-webgl.js: loadTextureAtlas(path, success = null, error = null, px = null) { let index = path.lastIndexOf("/"); let parent = index >= 0 ? path.substring(0, index + 1) : ""; path = this.start(path); this.downloader.downloadText(path, (atlasText) => { try { let atlas = new TextureAtlas(atlasText); let toLoad = atlas.pages.length, abort = false; for (let page of atlas.pages) { this.loadTexture( px == null ? parent + page.name : px[page.name], (imagePath, texture) => { At end to add to global space if (!globalThis.spine) globalThis.spine = spine --- README.md | 17 +- dist/Spine-v2.0.0.c3addon | Bin 0 -> 224137 bytes src/addon.json | 2 +- src/c3runtime/instance.js | 71 +- src/c3runtime/spine-draw.js | 21 +- src/c3runtime/spine-webgl-3-8.js | 10856 ++++++++++++++ src/c3runtime/spine-webgl.js | 22374 +++++++++++++++-------------- src/plugin.js | 2 +- 8 files changed, 22441 insertions(+), 10902 deletions(-) create mode 100644 dist/Spine-v2.0.0.c3addon create mode 100644 src/c3runtime/spine-webgl-3-8.js diff --git a/README.md b/README.md index be5c1e8..f95c5de 100644 --- a/README.md +++ b/README.md @@ -59,8 +59,15 @@ ## Share your C3 and Spine plugin work! - Tweet your work @kindeyegames , @pix2d and #construct3, we'd be happy to see your work! +## Debugging issues +- Make sure all file names are lowercase, including on export from Spine (the png file names are embedded into the atlas data also) +- Check that file names in property match project file names +- Check that animation names include animation 'folder' name also if you use folders for animations. +- If only one skeleton, leave skeleton property blank. +- Check the debug property, during runtime, open the dev console window and check for errors or warnings. + ## Known issues / workarounds -- Clipping on rendering, see above for one solution (add transparent image of size of area to render.) +- Clipping on rendering, consider using bbxo override to set the render area and centering. - Animation finished with animation mix causing another finished trigger see [issue](https://github.com/gritsenko/c3_spine_plugin/issues/44) for workaround. - No render of default skin w/ no bones assigned, instead assign default skin bones. @@ -73,7 +80,15 @@ Add-on based on **Mikal's** sample from this [thread](https://www.construct.net/ [Current Add-on, Release 1.55.1](https://github.com/gritsenko/c3_spine_plugin/releases/download/1.55.1/Spine-v1.55.1.c3addon) [Previous Add-on Releases](https://github.com/gritsenko/c3_spine_plugin/releases) +### Spine 4.0.x compatible Addon (alpha version) +#### New beta version plug-in with Spine 4.0 - there may be bugs, only suggested for experienced plug-in / Spine users. No 4.0 example projects yet. +2.x versions of the addon will support Spine 4.x +[Beta Add-on, Release 2.0.0](https://github.com/gritsenko/c3_spine_plugin/releases/download/2.0.0/Spine-v2.0.0.c3addon) +#### Please support development of the C3 Spine plugin for Spine 4.x +[![paypal](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=T8VV6CJVP3X3S) +#### Please report beta issues to: [Issues](https://github.com/gritsenko/c3_spine_plugin/issues) +### Note sample projects are still Spine 3.8.x [Sample project](https://github.com/gritsenko/c3_spine_plugin/releases/download/1.5.0/SpinePluginTest.c3p) [MixAndMatch project](https://github.com/gritsenko/c3_spine_plugin/releases/download/1.13.0/SpineMixandMatch.c3p) diff --git a/dist/Spine-v2.0.0.c3addon b/dist/Spine-v2.0.0.c3addon new file mode 100644 index 0000000000000000000000000000000000000000..742e423eafba60f38c831cb8a0900bbcc16de821 GIT binary patch literal 224137 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
  • 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%0AVH%1PD}fKFqBU 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%0AS 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%0DY zWD+yvIDdm`;wh|&BxzdGwvEj(6{MnK1>2aIdPs?@d9Z2!lLP4}Tf-5cp@1W6kIsdV z(zW8f47tyPRAkm#PTFA9`+YD~GY7kJCn} z#h~%P(yO-s6ojJ>vgshe0d8A_L_`;+ugY-Y1*{ZUSad6HR)ef^X?D|PZb zJj1|#B50J6#@Wzna4TrWA(XTYU8e=(T#tjk< z27gt~KvQnyLFUu3p6wRy2?ZA(`bFbS>Yd!`dI*IxVy$Ij-Q&l0&htRXi?yyR zyL86gQH;@WX=ui@prce|7(=>8W%Ka^X}mRJi`RBO{|{ay*^KONtXrJmU;#L^&{O(_ z0RHi1Pr&o+E0 zvC}BR)let@o!PH9Q*+jh9lv3M1V?Q1t9n#1F_}UJHa%b|?(q7+1v(sy^;zbY@~Jza zq(KhRk{>NC`C8qB^GGTFYnc_`BNeI5S_YXj*bsTLk-^-Ef!p}sJw{SsYy8s(xXZz- z9&2&N6!aZjN8N?&uec+8SJ`n4-&4yY zfHN~}nUddqM?nmPW1U&kKN_w9$ktzvfP6IF*A8uTvgklDai0@6Aq5CC^co8X&|Q2Nzvitro`UZih2i6?8K-QCD~!Nd9a~%{ z3Eu)j2XROiTuEVO2z%gs^u;f&1|)u(oZZPs$9f*SRWw)lry5NDVL2F*XSO*|Rr%(J z2+FKwZIfk>UzD_2@-<;Fb0HH}UjNI!bTR+}pkS9dKX3*nK2dcCZY7 zH)xKL0+??y^rZnTbw@jlZn9{Z*QbutN4Z*wnnUD>(g=wssZ)4q+y78XX`!xB z!UXr}Z%uvJZ-?Mx^X~jM5tJrqW<6Y@sxYGG($+DGQ+16fgNf%aLCB<)iTHh9HG$iF zre`;K5YOF`P+fAW?$UdZ41YB5*F?XWJ$}qXw3p1-Y{e8>v8=}18^?|6(HE*&%Qyhd zFuPT>p}IL$>r6?ZRV)VOFuZE1s4;-@&W9KV4ICq%DBay3 zlAYTDdh~vB1M3MMc7i{Q(;BAWc4pn$BbqtlBN1ioSBZ@km8w~)VCazHN>=_SO1@b> zN0u33&C!1?Qmu)Q}R1uN5^Y2)U$$szov(F_nGXa)3aRe%*H!U6~wB5Gvz zMZO-4r17Exaaizj{)jtlN!ti`orx%ut}$Nto(L1- z$kmL4Y=*TUlQ{F>BidfmWFm|4LkGnU!xl_SMH6ToEjnw0l|ua_OV7}Szdx?Kq{evF z&mtM&K5_JT*0UG_Q0a|Q7CS=+Z5^y2!-vP9f%D0(l|!$%7OU=L;!e|0r(GndG-`zw zVdKs^Fu4XbJKaX|T)1Y+#zg&DJ>_H>gl{_RcbElOb^MzVBBgUPAd*mB`heMP<*7sZ zp_NCyUYXX)?d+$%uS=WXM&pnmT2zYynR+$7Bu3<}*7OeWue2F^cAm7>w8|NZjgUw| z#AxH(S~XdyshNTx!=J>7S?e{X5mi#QJNYtzQ!CR=*;A?B1zvhZWg$1NiFE5<01@qMOhg&zC-}uR+(I3sB8akrGTfv(}r&2rbi<$Ss-yF_f7`%KD zufRK84tpoBFXg~<-re7B_iy%L*zLIF9mC!{@`VH5n-uc;Hd;Dc2Hm(6^~2tb3-bJ# zm?6r+ylxjSNN+H?AMflgXRd!Vm*E%w_=V9c-phQamoZpzElNGrptw~_iQQiTQyYZV zvG~7UWJ`Uvc%SdUK>cwAdTxlI!P`LWygfJL?8t^e|G9fQQ{L!NyI^>_;_hkK)|z@}|d%f(hG4t;<$&}&FZfa|V*LVz7E=f_9IU!AMx@B9 zH)dFlCdR@OwONTKCc=(cyRPb6tp;oHj-PT^&PqeH$VzD(%x#so97ro)rn1-^uDJHE zX}dEm`%;I+6`BZNe~Z_VhqWJnQ$~nO?@wUP=N{B&O^B@tjTUfneYmfCBP|iM#~{_e zi+SrTB=_;7<2aa6$MlneE>0Yh{}?7v@h3d_JyDrXJyu(Nu+DW1Soy-`GK8BA<%;V_ zyaJDR&}vF*&i;1U6Yqh}C9m1?$NMAiQOXOH&J+|K*up$@8}o+)5CHD2_C>p?T=c0G zT_FF3%QZQ zlCSbCBa#NX`*X637P(c8CZO`!Hp#bhAsxT?cFdDC$2$nUHAg>$fq-2z%D)~}0MvN5 z!7r`KVP4VtaxF|p2+g=Jt;sUnBcH`5kGOQfq|Q#pma-+jR?aVgv6%4ILwtj0v=6HG zS-KDE=pNP6JLVVdhmKRcl2v!o+jGws&r&zkCt|szn06T6^61_@76xK{qd3rGQcZjG z<9!cGv&@Ih^6S(o9x8)!@qSzU-HYC)QX1_$=nP5?Q<0;nGyI9Js-L%e^HG;lHLY85 zI0g!1b^PgF*Zecqr=~K4w;Sw5cT3f(n~o%68;cKjqPYTy_u&uZ-NBQ`;HyqLIu&~} z`c%n^>%`?NFF9KLtdak!-kj@?T7AJ@v_rbxwYKt|MSJLV>cSuTBp&$(H^$&E6;X zjUGBG{nIw*K%ZU&Tb(G@ACj`Ymw?C3>%*KD?GevXKaCW+zn_lev_BeCb@Ug%9?C92 zP9{r$Np^S}0XIW*@8}XfW*_$GX)u>mpS{m(8e%r9x-#st&bE)}At>ZM8Tk*bl{enT(z)l~2M zVt0GJU$1!}3acqR&cnQY#pO@W3Z@F!Wt{I{UzyyGSi5#l?3BKqO@wFCl^IU{@ejc} zZTPvBjkjB%hBK9CjcHBO3*I&eDsdb?8tnRB1KX0f+sie}#+hN&#>nT;L9$37WEg!Z z>YRc5AXCFo9Od@E?S z3!&74w$Z6zP?me9Y?kSwk4J}cp(P8UBJWfoI>6PG3R6zm0zx~!LtEOeWb>RvSs4F~ z@|5s#%14;;1*%f{np~BKvpcaK@y_-_nDW9i<A-eNb(2M9(6a|w02TFXlFe>uje*71Y zWA`QB-0eyKgHCxkKgBcD?%_=By&9zTxzr4)K0}%^bkn}PrBCXRKvfj` zFBXx@4z$X5#Qz7`q9oV<8Owk1_?Ob{$m;qWRk2Kk?L2e3qi5b7;(rh5Ti}Tk-ztKs zF8nXf!W8dlmA*Gu`!8e)<4x?|y0o>fWqi>WdtTMh-;2Ak*U>`o zk|uN3&_L6k_cb?poalY{5cZbFUVjolpx!NkzWpTr_&#&Ksf-BKC-cp|+bQgaZ6S(D zeg3@;iT$*={reok?g3tP_4Vr`I+qRFb$N4T9lJ|e`~mX~f8n0^W7%cCgC+7Gc`hsp zTktb9gs0!$Q0+6!D=#0=G3W*gJLY-U0v9bMu|y)1BeSLZ3wUkgz1Q9%liupPsZxY3 zLJNY26gWaNn&lkdJtOv6m4!m*D9^n^9oH~v_pAXF)#JUL-SPddl(Y=x_%kI%2mEm@u>QcC)8lJvo5E=QJr)Zha}s`{yX`) zpS`jnGge+a(6WCf{7P7;38>}HX7+4&dhQ+m;*HxucbS&4ZBqu20K>P;OVV!;&vSG> z2F|hbsz+aP%$3{#cK#P(@&13GSy5f)^ARD)XQ!z7g46L-x0^cE7jzV*kRPC11)NUL z-WOiyu(AOZx>jTu4SB-@Ws8}s=W6=i`Z6jAPuRy4|H|pR93IIxTi$T4c+L<-ABsL# zuFnw+`{s(y*=e#V={B9@Qo4u{5qW6 z#Dz=VGTotE{?)zL!bo{yqy4I5S^l}Mvt>R^F{y$GpO_12-SO;je$eJ1_*4?$V`voh z?*?zkjv*d>)n{D166$nEAz1V7b3>=I;q&7xX8$8DpJ+d(bK~%x3zcL&W}B+j`!tT0 z`xcgaS&)Ti-`TJn|MvZ(`6mscWU9*>itpwzk1219eu7So#F!21)-u&L{(JW}CO%T9 z-M$Uo;4M@_-}$b0(erH&UpIuu$TYs5^hZY1dQk!sZ*tStJWGFPRRG%tL~4oF=`9Zn zxbCQk!v4F2twhiGzUtM)s7=IPHX_u$f4tfC*7H1s$CKr&rr@NAeh!Ay$@Ty)o#ZwK zl)cdlB+fFe1{70)`R^x;dsL9)J2%cnnUD9#a^<}GP58lA-o+n6)VJ}Y?o}ZP< zpkLYSmoA+Hr;nd(f3!FBVRleGbrY6%|C)P_`2erDTgCcnx%0~dTb?2%y}11>0qdgc zIy+?xb~{M9N@2T={7`8 z^W`6TwXrZF^D{@xYmdnVy1GvIkL?0>Hg}I)%6Iyw1@1$S{Bs^H^1QF}WQ|TRozKl5 zP=O%Hm4Y~tha>r1{@uyjQdiy)+dlsqyJafs-hRxckgJt@L|J%tC7A>3U7Q=a30rv| zv1oqXb7ghaTdME&P5sUZx#N76ju~)*1ojs_MoB-QY^TlO?gNrH({OwOPH?NGzouc8 zan3?0W{DcQti+cAG(3@&gWAzA9?q0j@2-oOWx+58L!5a{ zzSuN6e+_Ium;R8zwUoti_Lu@0pUoPo@0Xuu;u1u!;!V;+CV%9u;u8zG8p{i$Qv&ha zkPG^)GU{?;2ent2)2X~E*7tdg)=zsHZ&KtN9JZZB+&ppOLiu*7`Eb1*pV&O@0RsZPI-r0CpY`ob8gDJR9Bg zw(4oN-@ERD&d2S29ruflZ>qL>=sjN4Myv$XfI^niHsA)U$ZhK>j(j?=yFZ>h`!Gm6 zxuB-@BeOc?#cQy`qm`E(ScPGhvYeY{i-?ZJ(@Jwhy) z_OpRa>Cyh0%}ZDBy3GYYt!-4|0oX5+Ln7d+CTqjLIBqT?Hz}r6zFhbF=6F7%HEmZg zEpDDFZ{mXNbQZk@!^(ojJTy}meYOB;x5@&qXMiD;eVps&+cp8&l&fEDqoqEcmygPK zU$24X30QFHkv-n$UcC8gN>h=T#fTy)SIYv3pwVrMT{Oz`^>2$t)J#lo8PG$>6ta9$HOrgL(d_a4b<<7s_ zdr_1d^C1e{p0C<1u4fT8DU_ZUR!LO;#OoNdEz6$CMgER{54>4s>&Fi8<=Ss;6*zI; zrc)4WujMPt*1Ya7v_Wl+iO)4L@cY1X1#wj+sdi^%-6vFw#_hfno`&wQM->u`TY(y0 zpM@n)Z@QP(3{Py9+wM>AqO9$yFf4cPi{rG#PvGZgh%Rk>z?#wOjE9}{X`akD79a2q z;l}6d+KX_SDSS=XZGz+~MlkF7cdpIe%ws5`&E3L-WaQ$_{+|G^8nU8F7g!E!IA90q z`O?&+L!0WQK-v-qyh>1Q%U{=LsbY_R8NNy%@2ae~5a4t`G4|o3V!e6=ZD;%5zFOT`l+}ujp!{o;tT=Q6=suJ~mwwq=F14e>R?ZQf*) z(B>^?atr+ZRf8Ab@+zR2)PTcOKUQg#v%ERBdUa}~CibE&{A{Qu)Wr04+ptSkyrUx_ zbVcGleFkY;{UB!S(Y^B_1Y09Mb!|dcbCHM(_cpWF8+JI@?}kP{MZ|y)ZBIXsHxJ7t>Yzv>XF@f9P8Mbh~`3d&Tu91rBMpxdJnK_OAEH`pN9D==IDiiWiik z$wAm*5#sVA%I}g&i=Q6~)3>ObgOfHG*GLdmbjStu2~44sYtvbWX)V>7o&X)IMwN|! zMqeSQ1rDGwl=3((*K(@Gkk_Zt`@1)0unz?`uwXXObq-^Ol>+PZXZYQYWi27Gk`?41u>-wFy zy@r!6>H6rvA7Wl3P2#~hYb^bJ z*aSYt(KnoA`Y)@yW@c!uC`6k6JM@1hKEDQqY+p}) zBm4%ycWrgQHo@$2e)+aW6mY*8)X>^=EB|hpk{AgP=?vHsX!jEzTVj)WroFz}Zgsoo zx3NX9wuHs|<}CuVcf;af?(zV%v#4)kR^@XASieUCxqPXvE?<3Wv<5rj%1l-4Y<%GE zJDpvwl7<>wFpM@YH^G|3;VN=BnAt6NQ*1PH29q_c$weBiv1K>PdU>$dPqt0rs(H;j zj=feNb)L(g&v6xAfx(qy-JRbFq~ZmhHXcyk(+xy$p8j}UA$Y)WJl;?mQB+-vyK;n+2!!|U1y;g_!>{88;a zFi!?OQlzg<*XqGgyn%l4H~9l5qVxW)hSF-Cq|>)yTke}b>`JR=y(^I2;^K=Y3({1=DI0Jv4e?YsTQ(m6@+Qw=3_Uxc?$}j_Fz*oAF0wt0Buaxh0 z?9gY3bRN)%cM!)n=mmDM?e=d^xb4d%6gW+H^<`_ObL=oo@TF~*<>4B6VTD4VIca{uXcN#*!{H0}g z|M>g)ClhEIwqYLjVa@1vyvJsDm2u!aQJs^d7VIzcfB-Qp^RTTIj7Kx8K{LB8^;Sgf z4gJ+EhCJ4yq+;6l)iBJLt*<5a!36HZWU?}Tax;qo?jF!3eg@221OgJ{I%fi!~`E%DDjhxk3CwXwcW$tV#{X;M5N5jN)Y>nS^k!#ZQQJHOo_ ztEqF#wMja?S?t?f$!I3>yJd+L?WOC1R#n4gmo;89n*;FrpD$wEZ+^KuPN%Mhc#In2 zAK(J9;1s_^=~iCO*f11WHb30N?o$z>Jegj{#-Nm2vt3gf#xqe%Px+V9XKQ`yTY z50{O$ID!Vw7Rm)_PJ;p~7{((!TSH4^a56TLXN5H$DR7KN;01?J3l4@;^8b#Y{KmW` zbPbnvsR9!h9ld8WY^CwVLSRs)c`f!{WWjiro&6!I7DlT6ISyHh&&WwkwBCt*T9laRyLZY z(Hay@iIv1;LbbU`-7&$5)LafKFif7 zQHwmE#aohy)Y{$r_6XCo3Sp&YtMjc}bV%HOnvN*MW_Gn3;RvD8=ISDQ>N52y#5ygY zWMcBw2JPp~NZF#bxVi1k08@yNL#Pj?9NU`Ja$${x%_;G(n~5!U|4J&b>+6o%;w++n z5xPFrnT&3zQsOCR#lqoIAlPto8*jw|rBUUeJNAd1Z=-)m_h7Q_;eyc)MY-$?_%LE! zYF$5KNkgZybz^6Bx;eXlytNe1vkK1m6qC#Ru~$zSwG~^#D-uS)#2RO6f^88v?w*{N zMLG;O^lA-ST@|Tem$ipK`U|*iPQh_1>1e|~nVwT0+o%J#x|h|O`pu;}fji3ZP$r6Q zG#KQaSM&RG>Vjb&>E_P1d~+;U$sy1$Xs$3IKrw9NSd=;-7xejXe~Y1%9?LlS-_r(6 zg3E+@-)hD;Svb5=tlBH%Ljs=QOc5|>#cDtq(LXlmG%%Gxzb}iVSgL|H4x!VCXUyK7 z-Bw405&>C`n!Jwy)I{&asD29>6|R|2!j{9m53=H4P;*><2?BgEY-?a%02kt)N(p3O zNS^wgb|f`=gW&;`dSo$!yM~Y^S#^XEa%CN7XSIn92#^Z&jSTr?j^&| zs3c(oNXvG%Dd%hdSkQ^09C8eJ0_WuZiBl_%t^QS&iT zgmM5yq5T>k@8;L##ld0&y0nNcjcg9i^6_XFxAzm%QKb{~v4|PsspXHxQ>rMH*=(oU zcizROaAgB@139*jG6Zh4xIjPlWu=B)dl-I4sI()+>PVa7-|SlFppxDOi-NLnS-ghU zP6fdTP1P?1NE^jD4m1&Y0}!nz3cnx7k!aFr;SeAleY{_eP9A$dS4U49=3U4#x@d|} zK%)W%A3W=^pYW3su9V}mC07hnUfefwuqA0-ah0MBmp1BQR+BI%7B6h+)93$=DM`d^xQE1MqMdlrKike8(sN=8xkr)KgSaOz=HOv@x zqtEpBzR+p4gFaCef=)5dp%850b$Gw$oX`BDA=02z>Q!fOGgg``G)`WgtlmDJm$I@@ zl%EnW>*Y`=D}-C&{z=ng`9*hp-xDDotK!?3&pza?P! zrgsd06?)N~3z9mnD{dn6kBwpY3cs;c;i4YL=+ zWQ{4&2Q5^MX(yGJb{FRSQ7GzMQ(_ESRIatC39llkOW)v#4J!!k`k_J^#x|hDvpCp|L(SUM%%q-Zv}QG(gT zSUj7Xyx3|6c4-T~ml`9{N2RX%2L?-Mr;mk|?n;mH4TDpGbLoSc7_578H0jM_h2?#n z^d6gi8MKP`YGp5v26r}({aS#m&6A>@pC%C|8u$7QF4}{5Ze)z_VL-psYO&7EE`M|61*#=z!0BH z=Sj1JV}2`@gatxYXanN7{Ox^D-?f-Y8$fPtRq)Ne^{Vl;kqhPTU47V%``}^5_x8GD z`89BKYH^Fg3xkXO=}rvUR8a=B=ac{haMW^%djuSsVm|J2#SIQE-<)O_m;^+51bEk_ z)h=L4rOju%F{UHTt9=kMT9f#})24%WL368ARj>O@*84n~6xdMfCQ@yiBAf8E*{gnHXwoNF__TVxfC$-0d|L{iE!gQTIa0)I3Zgbc(5RzkC!6?sM?gm z>Y*6N(b5Q`mfp4$4xU5Aty~@Ccu8QUp2#Yt2^R*P!QLBX`9Qb(YNw8EOHcA0^7QfEfu%+k&*Uj4|Sa^)BV5zhrY=?Gf`Y!7~v&H5gkrAa)Tnx~IF#dd4Z z-A<4P=p*PUOSe&bRcKd)WkO5lKab;_br)_1$r@gHhSDVA6)6fnvm>wUe57g?&qDL| z)A5oTh~dxW5gg4bGIMYiNNhs@K-6A0zL)n12i_`$=XNMmn!I=IJjpl%IjhD_)MRl` zD2-L;d%v97n``(&gW7XR9`|kf*NLnB$H&EL?`(w$oViWcjx6H#RZgcH@M&`tL#S{^ zl(R^h9z_9hT1~~g0omMLHMhAfXgq-^<2xisjxn=H%my{9ROV~G!HIBvu34-I`0yL?XG6^z`dW_?;0p;T# zl}pS;si4-Mmosywzy?jfN117tV96TKu5{q8yrbThMtO3k+!6~(%_Qymhl%vFNdq)~ zSEiJRJ?Kvk37x*48Zhnxvn(S^5%kHE4ve@uJ}qg>9d%7fvVc0QMPW#-)+~0Y%^0)i z8WC1AJb}}P3k@pqQsx{lutL-v=y zxCcqS`^`N#y95g4(n(e4rV+4@F|t&F>bJ5dzqIw#O#`+;$gw|58SDM1QI4cpCR9@} zRA`u%jD~V*Cf@>G=zGS z`q**FK>S_@55o!nd!u}T6B&VtBb}j~U)vynqDak?;xxP1RUS{&Y-DDzLxA(Log}3cGg`D#fPa^bACQ z`eA|=^kPkyHdgruOR5`gG?p`OgP@e@av5of&~QYlwlGPScaG*rczK5|zH3LR|JS>!DZ*BhuuJBf7UUgQ7E$I@%TIa2PyQV<$)b&F_6`wxM?5q=36N zZ`!0`fN%PPc53P#{Cb||xo?|SX&C=(os8Eten9sR?pG#J>6hvb_l6;w=K7*63fT3LHO>RIKN=}XGIH1Z<3OMgT< z42K%aGlQg$To}JO@ci619d*9hM^}WqX zL4tqR&ox+755=lA<16Un!Fl9a>gw|AF5Xm+J*7+?ZWw087RAHp~MYW5BbA10odemb}6>v=%P*OEX)>5 zDi+Rjcrs`L2yc}J&Yu^8HuP*r<`>7A_nsql+58xUF#__`tk?jv-N|czErV>Qr~pUL zx))XaYpx!``QI8L_~~uPl1;(mbh5Nw^zDcn#sH}H7^)L@Xa1QA*0ZC8XlFIllJ>1egpmt`ts2$23BJ>L${U3 zbrQ2cwHR4r=Li%pN!9;&w>U$u(rF|*o)j&? zvJeS~Ug^>Y0^i1lr>@IIKVe#4>FLvlrvwuT&w?@l!qa5qcvkda};pyOGQ@?sxh8`6+A!* zSgQ+Z3K(VMe@=_Ft7B$4fy_SIH=bnJU{{&zjpX%vgNZh|j}n?iCB)Ioct<*~b=)GN zpY-cWM!7ogin^pv$g@kGulFI6MQBqhX9&t>MS4+4GVJXX{Oty$PXzPC6#Q&&R{gu} z5$cSSA87!iDX!9J;|N9?Y8+=Xs?ng@Tv!97x8MIvW|32T3p_e;XI;LX%rCdwq|emo zU@homROV(d6${9hUnY_i62W8_g(rhG;qHOj#X;+}a8&J?KiNWv$i^%dhY=1+P)2NP zsz$2}vYsrkcb^(x8*VW+N$y9IG!nk4G=2D3D(`wWID#F_q!<@|qjLP&pyAi&M?1?r zSnFKxMIj~l{b~8!_Wn=gP-wj?>@s5t&nfg+RF%!+X|i8^z=60jlBxme7+t@1-yYr+E|{YPUUM3cVcJ7pvlR~%?_BA`eOK}~b-Ni!W*Pz@}i z``3iU3d<*QGA296`2Vr>jX|3BP?T+Z+O{=q+qP}nc-ywEY1_7K+qN~`z4PtX)>iFq zRr35ye&k7V?#(^tY#oV33R-FQJAFZ<}3i@Sr z+%)8QzTaO=XP2FP{h1We7%V~BnxJ^;1KG~JKNg#PRaK`a9(x<(&ay71XVRJx#UAN* zn^TqRXQXk~XW(g#8rfheyvl}Ij6ypzFPvUnE{OX#4 z%=dX-ruvt^Lnh1x3>;=xc58+>*hO(|i7gy2F(x$_>t%+oYD~0(JTNe7nIbg6D5Cw5 zPuw@D0nnTTVJwqrMRm@+hEfgpS7VnDzOv$!+>Mt88b&5T>?wp65uhPI0hP2IUgNnH zytcIiK*9#$k*1Vgj^uo0kAV^Lj$ujb-UvZg9lKfchNRqX`(g))9dx@U?D`24DdsYF zlFS?eAjU4>D4f47!h0S-#nw3tsVy8~X?ALc={1~nkJNXfAktRE-BY|Z*osdhu2T9= z&z-~OoSMad?g;blpR75E0VzlKPBj6>06IXk5FeE!MK*ppkl6);*YuG*v}xuwG=#mIKL~=gtUU^(WbWU?;32N>HIqD{FEc( zmm{se2ypAqS8C2Imo4E5s}?sB37Z?6M+l;A>UO#K=Y`VVL!lglMt{gS z)>C|yfpIQ5u=I;4qD)%qZeEG9BBVmbTs<*32}mhlm8w?PGz8TOaM65*=jKA|mh80G zqhbnTr!Yn_&7KOVj$El~^;uThQ~1L0OIwBGk`TdGD|{POq0Qm znT2}_@qQvV9G`rj(noNj6+7Pp@~+IUcErVE`Q8NR)?$vRX*U}2!zNjkotLk*f;`y@ zp`iVNn4s?oc$V?~_s4Lg{VOFrc@&-_kyJFvx>W)3A!?OaqVD3{6 zyKADjC3C$jo=zh9L(&3CFaBr3TYKtDWWy zGjehI{NA6B{ol~?B3f#Z){ci%GiA|%Y<~G;gOB{fOx4By9@L`V6B5y`tan2pbc^%Z z!p;$)YImwVcwaUSxf2U{4Gk|$;I?SbQ$G=bq(3BNVAuAlOy!W_vz>dzm=(wP4kWkt zuCE6Qr4Lm!#A4O4l-zs=-krYngVYJzV(w&oZYeIB&v=u6v>wJKv@tC}%f&)JS+z0A z6f5}~s|(RiXk4wB_mV0!hX#s{Ep1~K38Iq<#GG0Mc=NX5lqU5UFDbOKC_K^@MX5{B z1>gS&ybl!k2r7^ZIUpy`!Y0q+O`L+65*uL%a#AVC;Z8scW~@0aVARaQXseh8H7#;! z%j13j&HKSUUmfN_96cI!-+Gla^PA5+|9$j?QebKrmhH*5myTtz8mwaZ-eZ~;jh>lz zA$#V;GKr3{URVuNeVEuunb_F|-2O=1{wQ_iLFZ2+Fhb8Shhmdfzj5ldg_56^RF4+i zBC;#qNf$R-rGFft%YE+EQpDmteq515U%UQT`!pfWElbwgtN;krTivg0kiS?mb-QI~wqDe$_i2psi@=xj zzBB$TZ~ns9!q&OaR*}w&&+==7Ga z*Wc=t?raJCr_Asd2E;C;w^{;-ueV(-Z1!YKzlAtT)PgA&wi%06MVkdJYFegAR@q`$ zNdPPV(*mzNnl28^993$DX#v$pR`4Ri{GSWcSsM#aB}DE>uJm9d-<~CpizQgPt|)dK z3%tS+7g$d-6j)36t^!ODRMX`ib!-r#^k{$B>){>-H-Z@{KDX<~OuO}MM{Duu%k?E- zsY>n;u++6)c8=mv1)aaKY88Kri_*MN*nK%ywv2z>B1}@pYsVG#wtHb(9_>Wms+jdo zRj8>^x}-%7F=g`d5ugDJK(@|rrZZ0ULiba7TPoHmTK<=AU>#+WSZpJ>zrnyFjp1$^gUZHQG3FRuad~Jn;qvTCJs-l>ut^KtFpj#`Rq*zx$AhM#faDgQg)4;jG*4!xb<8K(Z6hli zZO!UrJUxu(kf=S2>00se%+0?YqQBl%G+JHUOjXD|hHnTpz;#f4GNnTqN2VMvQFmGr z9D59ci$^~Ekz?MNcJ$J)n4|Weq_|;ub-g)j=202P zUDrGISLfT4=iHOWWxNq$4&%Jvo_M@TI>jT0d7UFgR}MWX&Bo?-mugul_imO(T8F%4 zST`VPV-==@fVV!9nq_of|4{L%?9obQIR>9shH|G_F^7M(qqs#*aRflf137m z0}2>s|0$f^KlU7+`kH@rRc3pvw4Lk&q@#;zZ*$Y~($k*b@&8LXQ6g4zzT*#0|yFh6q4rUl&&})iudja*X8On?W_;o+@eh>B3FpS>VFy*CL*Qx>m7#FSr zxh}d!^X}9rmJ{7qKaQJ&Z8zL$zLZcVN?YlVbve;$abLtE>MF-T2g;z#54!!+6sjjp z+KPHs5|_bCkbi=tLfbk&!x*h(;kW*2#NH_H>%!e`iSK;~r!BlB|JUeK7fz%jc#DT} zl@5%k9Eq}&Eu|y%{U&bLtnDPAy^6WW7i00{x4CmW+#_9Y<1?xrE}k@>EPwS6aRpJ? zc6+I+ZDc-6r>dz=dnJiB7yRRX8g0ICG&f|>$&41uz`16k|1=e^d4Tq>o&GR4ju6^{ zoAOu=QW#5rm(k`0@IY$Olfrou%IY%@EOy`OWcHbrl@@d?pt31LZ-y~>?#*+DAH)6= zTH2+@Ek%$5s-?csH#d`Jf&5EfOWh6aJD8gJ4c0sU#*{%YlY3bgNZpg)c8fSBFyiq~ z5p05v)cJNO2`m=Um%vuQAqjpSutn^gIwM-xrx(q4K0vOTTJQU~wHcN>eqm>nm0~yy z&hjFXfd8Ggcq-8(lS`z{mMg1Ci=g^j9ie-Zw6KP#h%H5wAs%sp!|~RK>xf>pnKb)e z3>_<9C;!2`uk0YLK2s4ak~*7aaic51mvV1GoZZsKNaQ<+)0IKaNLI|a>`^7Py?h{l*R-C@7#yj5%B5^nQka?D7qmZY&kt#O(X>TD_#&S zxtrrUL^Tlx;Fd}NPc25zuqWI>GOXqcd~}l2hfieUYJ=(cAu>YH$GpW z>tCJ69ld9V4qf+f_qjtAbR!M(o6#;b`S4Sa1_eU}0s?{p!uFt5DW@@Ou7UvqBB28U z!T`brGG=yiwR5qwHDz#iu(UI!GjTF>r?+xeRe=TqEz;dJto_$rJz#-=!JdJEfd1z| z+t}958xjxPy+#KWLrQ_*9C6e1mrDUb-8B!D{%;2pCzM3+`7!YvydK$yKRvvNlFWt3 zBkejD)HT~c%wIRTxi_iU@K151d=6%7?@F7}#?c3)57{QQx|N(gc%v3|cOYBMzsy5# zkp3=@@ylTX{SzWJG)X^;tx4z=1BLG~AfPbx=K-n*g&d`XRtyHk5a-lkdNi^=0@piO z?|CJ-`a{A}|Ak3|^qayhb&*TR{S}3qc;|CW&k288cb34&N}0q<%QbVB!s92hAbeoRiI-|U?K0AFccFAlhwG5kl++Ur#4E9=Ma z5W+DZ+jMtixdloEqkP}IAee$OAy{n?A$&?|kDmSjW9W1r=G%#Su^!l^D2c^MIXAEm z5RZFSV-itY=p2WnAlYNe+m?3U2vxXIgj6>jab(K<>3T``NLs;fY}$U0MW6v*{o?na zVQeVY=fV1GL}>PoA>0g5?_Va#I)=pbMLrH~q$0{MvYZ++Mr&sJ8?1_R%5}r{(mmix z$iIJe$%&*Jw*=ep543a&dRz}n!Uf#^K@+3F>4H9wB~>y;5!>1^i7+TeZdIg5WaLaF zZ50UjJGejh%mb%7QnzM7V}fSZ4G@2Mkd;Wah$zIABfMfqJMKBn==Z1l4Rie}*(yPa9imD-~$rLGt!x{XNHL+7c)8bOe=1WmO>LPL+WM!f-`7 zLIJR#fUx=-b?_4rEk7Nk&z}VkTU$@!Aap{J|IV3IDx^q4@pA)(rzMO07vHc>s2M~Z z7B@S$aK|7ErPE>n>I*u#r;>{S&DH9dB&k3xJ$F9O-i}Ls>JmZ3HBgWgYE=$(9jDNw z7DkFRm~g1pD<~T?SiwGL&wtGNs(;2p5<1RC$P+d8XF$Pn3`TiA?;)xh*P-es$Lr{0Bm)42@JSurL&zPNd_&AYH9mooT6OK)%LVvXZ7yYs9%LTobnEuL3hnwiSy| z?P;WxRsi7<1@PV@UQ7cJ7CMx|2kXA8tSHt{y%t<|XjWUBfV<$Cn%?!*`@Us((f3*r zP^a+&pP9Ft?Lb(fO(r4DF+sZte}_8hok%T{>{EX4#DD?EG9t9)xeH4XZ@!}tggt^^ z9gL1ofxN?@i==KvA?JokXLBnZGGrdN{2sf=!W|q|8MEd11Eqj&mSrwv`>8A9DS}#- ziaf-1j{UTi?b3|=l{0)$)nMYjP#u4PEkqx{<<-yU7i^J@R*iku>K0<7&NCK6yWtn? zGB7^Tqc+Z-Jd;F3PJuXr{Ih_!8&4WVkeKfN&WyGjfLT_ zyk=ErhgKC6**tFujI!j&Y;9KyKhiZbo^i&>qy@k3WIJ9SJ#brQdNQQN6qj-;cRYy&7*yG3`=Ec5~C@lyS1XiheYww(!L@b>rMZ3beI0`TmgkhX%S z2yOC;C3Ucp0d`%B`|;xX@Gdf{zmmOZVK&J!;_P-%=C7~th3z{_gs)AEf21+a=^WB?Kz_G^|^pbV^2O@RzJIYYJ z9iswNku?PdGd?0(?|84={tiz8;tjBhbyM+T?fD4|!l-=KkdN^BP=yZRiOYji_u_ZX z4_h3$GVTJ{Y2iIqhr@QsAb13GQPW9D_V|d_Ben^p5`U#PcE**h@!sn8uup!ILJ%Fv zE%XsNsHgEdF^->}9b7#O8nB!Z#BrUj`nk9qIC?ulLXUd8y!FTtNM>HcwZODzeHJX< zy4#6okYK(HYIHyDh~7GJEErwFN!1?Gc0WiU=cebQI>A_-V-9X#(K%{vsx@b$m5e_S z{~RfJF{$cgZ9b8d2Fz-YHxhrSIH;9LubdP_eSxCnLn7%P!B99KbK>o2kqr!hrBRox zh-bfFUsr>{MDv5;gI#Vh7uDb9J3IQy@htoB6nwc1!MEy*SHmzrSr)1zaPwiTxCIn% z6|=E(S)(R)YxQQ1Y3Xh0#L;sNeq*`Fds;U%eW6-~F{xhPhvAO-h(qozIX@W!PrFZ$ zc6vMq*foxgH&;4P6I5v%^E`tH&)JAWb4P{r3RV$|V8#|J&jc?p?ikha!esV#9O3t>`{;QU7<);`ec~E{I_N8E*x{ z?`CNvaCMn8`cYpFR3-ZO@=$ji`vZBY9O$92Adtp!L!f!`#lKSB08vziO2hcc6enXLH>JsP~9phuV2T7k10Hj zTI8pRX2Ij}!8QU4)R1(i1z@Xsm8YASmIEY!>4;n#1ad^>%V6R;#}luy(l$ z&f^=eccY!QzGQU}7SD_T6#&5`vYtoso@Rol{OI5jv4fVG(RZ*XL0W*b0Hh%NoB7iA zX0v@&&QGh>v9;UN_YGZbw_Dhrz$tI!pNc^SNgm%sLK#ug8br1*weeJrZg1yiCx7Rr zwmrbIdBQThfk#C9(H9zznkrEP7hVmqg4q8e< z&D}4Ue^P+1J$1k05MDDxjxBw_-M=ry`onZ?Uj0D-5BTM9pj8>HncDnK2n;0f2LcH5 z{{w#AO^wWL{x|xal;1TJ(ffbU@70&LHx6eFA;M4hBNg>J?_-kjdcD*QDPHTMyxn$E zW4mqkO$2)uyLjq^Tuv%k3@Nu#$>X*@NEa}vhHB!qix;`4*#|-B)y%Wri#BXj z;-W2i&009?-`!Vve&Y?!DSyAe@;LyUc=9SMQH4MBACI;v`2s}M=`(5G2zO2FU)SGP z>mCklA|j7FPeth@Y+=KsEsdAAyBH8JUfiFhLce)vZp;yQue(NT7q8;xAtv}C-+h2?fm zyL-!icDl;3TA%AVxUhDzWk1;`=kqmeX3a~WsmEE2O0@20XBAf1Dn*$#O9WrTk`TLB zk1c&1FqRmFx7GNFC!ppYXOL z9i^i*YX0_H!FiUG04Jpj^_t5l zZx75(6*t#&2r>bo2@;DhT=&_a5qF*t&9x$&Ejblk+ox6ZzYO=s17^Y?a)y5|+6Mpch2*CBjg};3IJ{3=Q@3k?TO?m*6t3lqP)t zIj!QL!2~Kn3Xg|LmDo>B0um!T`+aYo^4x^S#QB%>lEaVYjOxbWp|Pow24iMPfq*g1vEy7GddT1i z3hP#54qjFzV52Ek{&KBptMr(y`f{;@y!!Com9{5#bhZAC3;$oG<)w!YUKGRYo74aO zslB{+rR%8~U2T5rz}H_rxb*VTjY2G4?%$0n%**RhdQ|+a3I{<}8|n{Q<6p0FLXiI9 z1WoU!Meim_@1xZaxel3D2>4v`P}(ntXwcbHxiFY&o%B_aOVL3tFS5kG7j(2*E}4{r0d>c9k~bCYjkM>ljDb7J;_9oM(Z3 zo;L@$STf8&f$mA4c741H;y0w0aF%_dtoZ`Vfkfqlr^X3Kbp|tEo+<4 zY3FBbn&A0zVA84(Gi1^dCy7oQXhU1BuoCR75^x2BDREw6(+8&?&L~bGOI+#@jv-AH zo#U}mJ~f&SvgrY^B!1k^-|+wTj&=JxTf5fyqM%G7ZS=)OSogf=tb3$96Qgq-b9nRl zzdbhU#C7EM-w!#F=*NLC51H@~%Y@6L3sV>3|1Pj91mth|dr8`qO)@?nU)VZ_s{ayK z?V!|2BAb;qp+7M89Dj313GSLB2-EByRavtS@c& zFKOTzndJ`nCbqEd7OxqS(~kU>XH&qYK3!!x5*WA1|%oIgFyn`Y4&Lijf2ebvUEjRySn8Ya9QjAcLQ z!ND;{=a!;bW!G5(254$bK)kKs*u6lPQMV`FFMn2$AXY(4Ib5rDDHS^XoG1zR+9 z2}7h+(3zvsEk5cRA|cDFFZYy3@>L4y7q|iJFi{c0L_rH4NpSC2t>o2Y+Gw^^0E0F`s+G9{JTXYRG}OHvKn!CKslce z73O*O`a5jr>AS0#%fOGn^P9icoZsl->Pq5StFkd+JLI-I{z1~7izeC39@$_y?Olxf za%*GE&g|WNS5!6$=2$f(7A3^366RTEG8#n1_$1a!MVwVc$dx95x?dTy1P!GbD{9G% zRynI)!ImwJI_ana!qlSTM-ZO0My&);W~N!tgbUuA<_dN-EHxKPwma`KHXTcGRrw(98gx(pW|mp|vS@ z<~#HHr1jRNXLr55aAddJ`?bM`9Z6XCEEw%#t7H3ot3i}_d|5PBBSCxj82vjI3ZdF{ zjyerEBu2NgJf@6KGv=ajM1_C?wcuQ%j`jI!d1Ed1xrA|by<9FWP~~s^*K04Y=hvD> zErhXnImTBnJmTxceIb+;!q@rpcz9ZSD~-l2 zkv+EEBF>nBV`qgH9Bpr2dMxo(+Pa4=`8t6Ze+iko-y*dcC2&g=3)R#LH9{x^%ezG| zi;qT8E$GNZS2k@HDHyf%$G{A@0jDTsllorOzK$qAC#6uU3C7H|iK4J^F}T|dtHJn$ zZc_SfComWf_|ONAS)2Bsx+WAAFMh0Q9D{+{Djd~>p*0cm8h<8}jlsu21zeQu2!Zxn zp*xGRfRxKp-({%UVh)tgmNowUW<_;QyG-}ppYNKDS=ME8w7u&Y|N2Z zOXFA0QX4jIsTJ>(Ho#1~M!H2unaDYxNwwXE2KB1(3bHs4C~F4vnI&ER1f*{amZpebK8eB~2-< z*z!}pa>onN-t(!)r_XqDO1SjaIs zA!>@sGKzPwPd4QM-~|--6L;7NRV!kFPZJ6Aq^e%=2e(})o4@;U#K0^cMh1Nq>`|ec@q^b5LA=RIkzAKm&L0jJ{ z`o^dHdgt@~DRaArJCy!%y_s(x5xgQPv6wU9)F!+`QX)Vfehv~7eVcAG z?2{Qi*H1>KQWLph7s4@C{+-!BgA8Mc=(ck*sbyDil0V(K8ceh@H7C_s;$1|gy1uxf zUcC=7?09R#@x$sCFtTG?WG9c(nnP+0ZEUIPJ^fa3@omX*GcEZQ?H39U+1uswez1HQ z^jeFk&j)z={;pJiMMNa#6B0(!X2;kFy0l^7hvy)C^pEfjNx!~QeQC@`Ma6<77+IV& z4prLC(e{&4n;I3NMdDx^qG>BA$&|o^OYM}@%#K4`qW0G4%0~ZkDuIg&7SvL%*V~ra z#|;*BU@r&oql@>ZJZf{l2Q?-gI^DM#K{Yxe)=)MzlB^*&E<@7D9GbFI7tARubJIXx z#3{*{r4gs|Y=sKgzH)Ad;I-M){BsArGA(*x%tqnm7CoNJ9GoHCL5XmOQbE_l@a%lF z^XB_D{e$^X$4;YVz$)EU?CvDO_~PsV%h>?6PYT${{Zz%uFC4WfB^JDOlT`n6Tj%;sWsY z&7hsG));nIw#LirtB#ML^X|P*%C{TH-JreCLk}+8t^^cB_JetutHt{|BL*?(hpy5g zbhklJem71AIr9aCs%Z*QG|aCe5Dvb;{e{So>E-MH6)3Sxv&sC6#HV+xN<*)D{nyAENo~t?d2l4X z-WhyLaa})zrjI&gep{egmD0;XQb^&%iEa%=Jx)`H2!aU#dFQ*U&F$a&70Eh z;X)&h(dnq`9PQ5N$5G{CTQi2JbHM@yxU-_TcTnxb;+fIM9VCkgCsax2r28^TXqx?Q@L+Xaj$d z`==I~v%(-%A%cwjTgGKjhxM-?Vvn;gs6izeN@u=}uujpt^QL$dWn6vErt#xO%qa-= zP<4$~{-Ew|ma^87wQtg_gsL0Nf7pr#UPA(F`iKk#dY2Ow?>LRv+KFA-sW+b9@D}Jj zCEa%{ZX-MEwSE_+2RTUKECZL8hkp`5Sy;xZVH%ze@>_DDdy(rXf|AXBzxG<>gZe0+FlkSw$i)?PZ*_P7Y#pj{@qy*GZU_sgeE(>Uu66rYLN zTWpEJS*m{nV1t(>QN!z^>*EJB0Ny9cWUlbaLc;>o6f}@rC6d!%Ylwm!4UN}F?FLDS zsu;664O7Co>x~(_zD=^V&nmm?yI*W}Xcw%xdxxBm+B+_9;;X*i7q5sN(yu@w=ask* z?5~9Y_rGCc8fsmvbNyklZ+G)lrcs;q$2%n@V-5 zx+SUxWpD9b-BuZ2YI0`=C~1#whd}8lHGATrs}=1<#iu~r58gy~h?RjR5!o4?#)aUi z-e6^OFbC}fRa818K0j85f+%(-x+|M0Ie+J?Zusa2-x)2s8bB@RXFN{l|CXCb6Ug$0 z*`o6lt{kUC0+5d;v?tBf5=f)O6DaWuw#v*=R#Kdj@J zbLg=FFb-qsnBeLlw@`_1$?E$o0%D?LN{m1r}=q&gLukVhvAHL+2&rHX0yA z+6`1B>H_hM&V??9bcD3v#D#bUze2mzWDhRJLL7-A1Zt?bLP9}^^Zb0-W8vz!;B|*UTi9eoPn0dk~HibCP0qXV2 zs{1#L&2KlJb-O2XsvM`#54O(FqiEjRJ)3+~Cu~~TAeOel0FucnHO{h4a!k@Qhs>~r z12sz3S=K_JrZ-DcD;1l?{f!R8W$qfxQ_zP!3{&(R z>#xdB4ksb+$9?ZutK1D^nI=o#T|3OR(D4Pdj#dy#j6{|i<6+GQ%WG{-%ghxWZ~wcT zat-0)IyKXL@OP%&rYS~R+OmAb`BZP{zBqX~JF>P{dKKYr&D?e50PLSTCJC1_YzxV` z&&#buWpfFuHvZ)SF|#F!aHeEYm@B`*W{RyJ@q}+gqOS`d>?PmHU4kZh=uByPDyz6% zcr>f^45{9}65ZJDnMDjJ;&I27=D4|(5EvwSjvf-Jq}*Jl&i8(`?fgL@xWvirw?UV4 zJz$d%iJ+PM9Tvik!h(`kCc!@KrEEuzjbz|!^5ji6(+cuk4F+)2UcuYHlKmv$%IsyX zZVu{}T?5X48^$UknMGqPz!I8tuai_(a-L@`3$D&I_#k*^2{004Y>SN==Q0uIly83_ zqLjIuiz_=Ie=`BxMvCP`v%%|#JuC21^Q875E`1(&XPg!0% zn#v(xBCq|{zp(cM{?RmqHC^U&bOmdZo|79yJe=UEp?cO>WA3 zKL_iwYtsvqmZ(5;7!(R9S39H8;NE8Q57_>5DbQ9Nq|L<<>A{Fecz|xO)v(r)UsPWq zJB=&RrD{`7trAd7U$=zT22!#hJ1VXlyc!yokpDZAx(wfe-t}RDfx)X%Lwbo+MX;uikhP*LHXut~gom z(8Dl$-}JEn6tutbK##E&=lgV>uaV4W_*TWf$hjKIsv}%}eac%J>9{jj|5_o;nANBeh^EGX9rnrdZVJrT{Whyf1+z) zqmJ{})4-I_Wl|={YcBM)nvmgh9}>lf$mo!}@Fx+-j)AKSC?85}#Iw4eHAq_uIeEVb zy9UdNtpf?B&mcI(A*6nYV1cj^qM^)!sj70%X1@Xs>3%?H=^o5A5<|;J09mx*zl;xu`hoT8a^WC<{HVM3KdJtjYGC zrrNK&c)ie-ne8^I1k(Mgn--3oWK6VvW@T5AYk}!nqkOkB@t&EwV@x&Nq3zJ1wqH0E zUMxFnv%!yp*6=4yN^=dyeNF{=9v0gdfQzaH#kz#>%x=e74aCWom%aYw*xl=CgqR4{ zMKbgKeWuJqz~W6uSyqOn_`4h&#SlERd$e_DsX~r824lHawNhsr3Ruj25Z(;;ZP}j& zt?2DdVy}SnIvM*ilFjCz<=w6N2yeLDUzc@m6?Fq8fM|>-Y;e%$P@A|E&*l3vD$Ugp zXU(#8lH4KO^3$-yNlO_k7UU3{{@ZLSQ#c>h$uuBSc3C=+O&F?QGZo^75|yKX?~svi zV*D3U_jg$;AH(80gN5F;D56w2qxP0R8erH)hGBg|bI?U@dRG66n^u=dpS(0IjyC%1 z=)7V&ZRk?i*zL`>C!5)*w9!@BP7}=^9<|R}8{{gB$TrAQDQhu40zkAnQ9JEt#*qx1 zyH8*Zt)I?Cv2pX+h(Lw5E;R;v9wrtz>EQ99Ll2w@iDgTx4Tc7QO&$NBjMTLAc-%|U z{mu_ao)FBzTo6zju1kfEE|nlHi^QVlw(?tEdOx{r$O>tH+`M`losLy!ePzuVrr*T3 ztI+64Z)oewuf<*t`}b1%ZT1K_SM=3Hzb@V^nWVv7R<{DtSy$Qds4=_c^2L+Z@%^ZB z%Bhqu^2K@6_t?wIEdUjwfQFS{6h*$;-?$i<0LS@F?idxQQXN)(G$et5l{n}MALTaE z^3h8d^{@TJo8E)4DJUJfP?_K>O$Q_*mU?mRzZ@p;G2`hz!G)GJ%Kp+K#*CiC%%+Sy z^D-`rL#JB$T;MgjZ#hbEw7~;!MZb@&;n&7$YfbmRjr(pSyZg%CaH#t0>L)Y zj)5UiSp!4lR~nC8r7ATn>P~|@RT^m*$!_Qm$^%>J0z$}N9hY8_r!t<(4rg3XWO64mtxXv2%S9(Ju3bra;Z{7}_! z)em5GM`IgH!B*9e-;-u`=#e8ajTwJLWJRZs+nLO2&yw%aU%we*mp>+8f7k1Iy@$aI zQ}xEUKkDpg6w4OCdDBZwVsQTFcyWv2P+WCF_O8W)9m9+6SLVKt_=2Q!bMOsYy~JQ! z?3*%qLZkUEgc)9ILxK#ds$x%SbQfvA_?VWP>pIK093$xsy*7yX0;1fW0LzzhIYbAe z)Sh5LN+ISn7GKq!@OGVj-3l)n_=&iyp!2*Z;}or)+a??PGRfo@vs64K%@k z6cS{s2pXU+7gC4o`k(1$Sb>iyFT?DLHFxmsS1k96Isg8Oyga=}+N~7Hew$bMB)&#M zUQHdDpH`@<`cwbJHZlM9MC8*{7ulDvCc|xQ(%qk5oM0nQ1cFU2m(yTrPX0J#nmd#s zPX97TW;%^|g-3kfRHKBLHDrEnun{&}Qcse#|3d%0>b9h2|IK>y3HO=wfa9WvJm zR#te-<7HDJMRFArAx^al(RJESW=&K5os|t+8*9mgLnpCm0$WSp#=;(dypSi0Nptxz zKF4(mrI&&*(`k~-Ja+oCle!IEJ*_0HC*j!giTwEuldErl)Et z6|LjJc}XvR&WcWg)u8#N(5qJJ5IS|mcdQr0{_SE!El2orA-a-3p?H2QG5=*bjfuib zZY+q(gUlT+qpTQh!0H#PZbY%q;j(m9?(21RSKY-h?M|#%nVo~G@-O;}zq3u)RyT#{ zg!{)uwT1z%rS~AxR4~ul(!9 zZKr<3AvIGLl4-2-aDFD1R6*Nk7+`&u*urKpYSOtv|n;mZX~g^_A%Piv_CKe54J zavo*VSu$~V(*7KVNE9GL$Uz#`_2uU;HGm=vjBGB7msjiXUy#V$U#vq3LE*eV*ndt5 zMPB(0Q?lM!8dW%R5;WGaU+$GCT2!ofZ8RpN@z#~n+KAb3Q1c;WOWwVcYkLfO7Jd4C zLQ1)QpjtVd;;t3zq=L4zyH*HaU$8HqxMf$*-PJTocQp-j0OldQ3Ebzr$iw2mnC?C$ zo-*}NzOa(91#u#0n-WbxU#vGXIyvcI-W;s7K@4rThaG=VX5B$@x6^+&d)PsH^hC8Q zN1e9#pRPpm5&R<*acd1_rk@BNKr=H$OgkK*s5?VLv&lIrM`IexPE~tVmd%h?w1o3P zUb%F-24*DH*`h$m#-It)rd#TnwjmWBlh!tfqnGTd)JfdZGCub1JfC=dfuY&` zH=B=rsd~@7)k}-+2bS6eM}C+XFlcZcwJ0(D#y#XbZ6x|5?2e%);yvB@^ZogVYnxNM)ladP0p)^!=Q zDByCVG*nWal%7Z!`{Zlq^2E#A!tL$-gGZ?6ir=hSCi^QQ6DZexO_(Nm)lrjutKkQ` zR8^>z1;??!fqbni^;H))obZQAz+A1Y8;iNyb229Gb!}vYNBP&b_51u%-(YQ?O=|=n z-stRGsonWlztCzPs^=%)S}aZEG=X!tRR%Lx4>J&0rF~cB?g-NU3oc9ySG({y>{`zD z{uuny0!|&7d5P6xqhxGTtid)-1aeuQCupS{=r{0(()PEUGy?X}9WF70A>E;FLA6o^ zQfLL*MqjBbk9V8q7Y?*9uK^9x1v<}ED???Z`!Bv|bT?-)&15VRGY*3i50@bsXqut> z>#l9M41cRIS1dRqU?~er;x?y82=Cybl`J);1q3lGa`^B%ll$>0%ofN$u{D|TINWBP z|1*|_KNDrlvwtKT2Mpn(Bun&vhZ%>Ux(|l28?UCnuM3?<6Cy#{K7b4kaJ(ueybzZM z=T-|I8 zBSvRb^{v50rA#xP#lDPuvcD?G4~!i1*7PRMPWDDhh>vTp!^ox4x<^PGdyxMc(V)rv z7L#Di!+y-;K8ipanuQc&=oWq!6Uk(BS0k zOhRdl15z<{saiL@*BpF^_l)iA z3SwE~U_I~z%NbuUiUAq#u_}o6^T*~y;XLu*K$M77HM@dnX^Ww$w0qo$^6In_V#TOlE+}jOayF1j02nE8Hr-w zPc?k7MGbq4_Q~oug>`rcKe4HuMT{s!68214kP>OTjS5m!yg|!t`G&cb+4*J{ z3?a4FEK?(1Xpn9-7Pk8$WuqRCx_)AXVk1R2gbc*dR=j_?nF8wzwlNT{Sz9|z>Z(RE zX)f&RbkxN!>?ZG$z1 zGESs=IaZyw`bW>6UUm>^xcnwVA4sDtqj8^rG22(?VpF$%m=!lA4Ua`p~nR06isi8vXtFglXO#!BIO4y{%ZNw$N z8xl@QwJ_wCv*#eidH;L$RF-bX-}!U$Rr{Lv{m^C@)ZNrs@!D7&tIc&jKP7p%Bfrh) z;!Ey9YDc7U*I2~oq1GJk9}sq`Rr!yHM~CZph9tH|&%A|1kK^-K0ReU`y9)z972Ih% z!Oj5Y3XRjo2OL+{g~GfMk&Y{O!hONA zRKd?N1XMv1z9@fJFU(o&Mg(Q$Y36)Hd~s(KV^J^xP;ztd@w*}Aavo1Ds|y7rog*thno+A6$U>x$E(1c3}&Si~6}Iq)#v{><=}+lUSa+EP0* z-H8+Kw{&In@hE+;K}4hg-tms(2TBDs80#&7u2g2Rx^=`jmHXtkhp0k(Wrb0?_6gRK zV88Iqbc)QKSdD5h<$_bI5m?~W~7E_K>@tjZWzJguj-^y--{bj9#kmIxur->xYqP|zOL7#2wh4Busd7=UJf9V5tXnK zAruRRB`V8=L_i=4QG~?_PmI83rKvY^BoME2c*&;WK^Z^6#~^SN!)Q{#WK{5&*AhyX zxg`~;NB*bkj3(Q7T9$XbVhxYT)!$ja)%ec(t>`51rQKQA?MU8BCap_ePi}UL{8r)? zxfNmxYR|A5xt)s?35E1_G7-wvZfIWuFY511>q^$YHBG3vz~yPW3X!kfHqqPQ*o>5o z%@kvCucFxjyR3H@m{3pk8t`%y)B0*@O{EmOwJVyD3>P4i&Ef}u!)T|LU=~y$D3aXz z6eh2RlT~V>T6toMWMikXY zf>i*fvQ}DdHQ-ka;6Z}7i|_}_zmZ&AGB~okCvKS z;@QS4nF}rMw8(&8%a{OMhNL2I2=tpOz(WFfSOus>ia>K2OBOi{i&WQQ9|m?s)_xpW zQjovxuNh(fSyb@j}>`FHgiKQ zE_IlUnKpA{X)bU!6+6wpV!mShv_HK-H3+C?+qk}epw_!kA60ExhoV_jHOJITh^*$= ze+kjmTt{7Egf-cR(!}CwWI}-}WNOU-o>je84oxgTv>-U7>9xY}g5pb3T$=M5nPceN zvC}@!YKAg4*Br{j5M=`@WpfTu+9{uB#UaV6eI3NEo33cjNw!?c}=7` znEyinhr?g6m6HgS5rxGPk56Yc6g`o0_~o zC>_mOjYD|tLu?5Hi<-mkMWDF~(m5B@ zFBZReg23c$2?f?vF1|UJpj&ErgT|oL2ny6#uTWO4z?urB@~m83{-)1G^og+FGYKiK z(kiC-yDy|&YIk;a*WB4zb>jwJMa@~#AGdS!P4QmV$v3yM7mi9a+b0nU)^3>yWiEG< zBH5aY?^j6ez0lT$#EeF(;Z@!EtGVlUo4@Iq|2h5j%{=M5D|ym)SM{XtuHZ@EO?%S+ zP(Ss*kq7ykcU4eD|4L3q=804Py?Ij^^h!x?^_2p+Ih*!x-XE2xJ+K`PfavY{%-Fp= z-5I;FSqqE|uB{n?iSF4cO8dX@J9fbVBPF`%oK!F!mUA}xtymTVOAI$fg?r8%@35RH z8$G<=$6@|)RzRF<%ttfp|3Cs>qza5It;JAI4b+i29i z=h@z*3oexAi%xrY60@Dtu%%u$yo70c}m#XM3Gvw2E~wy4SvFDDlP_e&UV5> zM9JCL!o4pIAzkze)SJ?gQxp0Li?BIc8^0QY-VjqGU|x>Sh&^e5e5XHE27I>f(jhp( zeVP{+#rlO}uWkCCMEE1*-M;0a#};zYg;AdBaJR$WGQQf(v$ytHEp+;kafS9_z@#iB zdW)eD01a;Ol%|iY6)=pq7*gV3S;$y@_dDkQ7G}ppS# ze3S-+M~vgx9u~mXK8UN$Y$pcDIMnA_;fexVQ6crcdoSqn$I9^e>t8cF&XcWi`XQLy z9OrNj*;aOxt#l&-=?~TNIuZ5u&}N5C-@_pFfF zF4Pz|UdKaF>|#9xDW=@(u~5ng(6Jyj0XGq3FG7x1ysIOmTnZW3csQ_Uax@_Wu(Rw8 zPbV|N^ZD4aJMc##vGcJ&s*XXzm}esiOwZU1cwCOk*$1>DKyV0#?0F+0PVq5*_Y}(^4DlazMb7e6P@7tJ%cn6=C67CQ%W>!mr ztA`Bil%)O?2TY2T8${9OV znbTSDtO>0pB6@pZ_2ZTY+zU%TmI8!@R`lGsPiJC1E_Y8X=IgXZhUXnSa$CeOdlq}YkcDfJR$jl$WsZRPYSReXXL~MyL zDl1x3F)mXrN)OCLyv()KlONOhg$8xN`kKLAACBD{y1E)a?X%gDPWn1ro%AG6(rcEU zY(wpL&J2X)q8SjDH_9ik)E=IN!XKkjh$Q#>k=I|eWJceEcq1T!aYFW+JFZ6_f7p$2+V}s{Rzy;#f`G;vS`!F63+AQ`Qf%TEz zEGS!B5=)tTS7I}H6(bqRhh^8_RD}*VIvH-njt6rF=ovE97rUX~4pfa{A|*P2YSumo zv)00gtwQ%$4FFT3##2@uXitzI!m^#`YE0wwb{T=)uvs>$wIZ~kHXw6|y}6C36|gO3;} zB*kq()VA<*qcHNv1#)*7SPyA}{EPT_vpPb;?&=tPgM#)Ids zZ5Lkf$!i*_+@cf@$jhdxevV1>rbmk@d&q+>&>b&;-geS2Adl4G#nT4(z2GzSQXq5A z3>(Z`CM4+>`9W~%c$UbnlsY$%yQ5Ok&MNNtD?VS)!Gezq5+c^&!NXr(y;9~*G};=> zV{6;6n0jTo82dBL9 zfKNerG|(ITz6~EN6lU7dj>u^q`IgG{Z{u+N!|g#NerkFI%wPCM8MTRYjuK7E#Jw4= z+JYh-Ta{ExrrTddN;0md#+=Z+KMFY2a7_@BAOZq1+8(U9Xi4P?4O88-gYx)T{hGoN z|EXI6W9rs^*6Q5q-hntR`p5R}_wL^?X?p07b@V*Wr> z;h;9xV)6f>(HO?|>VHa@9KQyt~euT?X6Y>WP;%_F2)0($0O#{ zc23rPUT!O>jXAchY5w=Anm!9(i9b8|9}cnT8%~_wB70_RIl(s9s*dzyDOWn$I`fau zfwdj9f^9o+$3Rf_9%EJY(Jguk5HQ$o)^FuWnjL~1tG`8fMh%HTHV?;Rvic7H?dM0B`}n zyl&M0#q-{{h^4pPfyVK0@Cf!SACb!G9E3kfV66G)Ls|L`fjxW>;DdHtF26aIiemXw`?4L)_63LJA-p@wbgSCUkv{ zrRgm@p`p2-3D*acqCzjM=;g0Fdg3-s9{N%)c!yVL=~R>fx!` za(tHB^9+4Bp0dz2quc57!(I_@WE``u4{u&X78t={HeExro1bX_wQiGSPoc*d9FV`U zZ@l!X*E(&7#kl7~q#HpaDt7&LM3K_Wn}I412AcQRxOohLSe+@8$f1++f|< zB$w(6#$0OLG|$T9l>wZ_tV9L#oS?_~U?vj>GdYZ01S2wWfDB&B4X&QZGe%Z-mr5Mn z$(v#qzf9&>Q%x3SFEceG&u(qC)PS|xKe*&vB}z_la|KNFJ1uN%FRw`JW(zksuq5+e z4hAc01-xmc?|J@d6$EW}-8eVx-AM7Rsh$w|cG)UpsCSH->jWr3N4c@QAUV2WVvxJM zOOt*ig7tq$R)g^n96wGEhS)J@8)WUu(9$C&&X8S4N1qJ#>JPz_zdCi(aOoCt&18DX%6wwV|ASTlIt zLaWKjTzhT=mDXo`&a$#1ehTx}q>GIFi9-r@yf#QSR0;15np32u+ zBtEB{05@k?wmLjtIuR4XMDavI=dGMoQRC~1e4-+spPe2R)9q*X-@O0z{?lI`2Y{sz zt;w|7oYf1Gqr3A#zTl3Kv^!cwCQ6Dou$67`tXyb|jSLNMR7NPHbBfbqGVJxklSR>V z;MYIeEzO1;wV#-ENaCeL7M)RU6pD>t3`Sg(+E30&Uz_7NZ+2Wd1sNYRP5|PO01Bk4Cu8YDZ{|+hVcWte zN>S^ut7*f;i^;Al&79(HJ}TvaX?sGvuGi!EHnk0xRz-7ABz=p-Z+wTF5K+BS(^0yg zJ$VzNjfT64@5RE%g|unm5A#0<-@?s_&ov$72PEsIzwlo!n0o96y4VgW+qn|fMA81J zb2~gWAvRk!)@I<_bIHW;30!*?B<1+$>xSTXs< zafq0%CGYJ=hva?v*<@Ju3%e89i8r+^S+md*^Ekp8M=1S#JTH&SzHvtcn9S)3YNv&d zS(~L`mX7S2vJ<7f*~I22=0%pNNl$JpliX-mnK4SrV{27@Jb`+lSw_|J69LS9RWUEU zGSzIWUYP3jOXa$hb3a;^@@&0uOJtfA-%iv$;R-Y$FI<0mMu*EapOdWXbuyQ%JcA6f z(hQmwUW>G{BN7%k?O0y4HVsG+uaH`-bt_5N3S!8nI2g z1cGS34i5Ig3Dk6XYhxHJ?#xDjPQ=lUTbn#i03*M}G*W7w3Gau|z>`VMB|vK$${E>o z`sZJ&Saxs4-XlZI%9Xn#5>3r3h+w!?Mva&CC5_41wctQMm+n{qT|o>qv6+S9annQK zJ%YU$vj_gc0aw(NkWY?EFmZeg_X-mSI26RnLB!*u|5n`x3h?baCUW7HMQjc@lqnr( zGu>}CQt;qX;HaS_X`@#!43`sg(uq$C43c|>I1!@j&+j&wapO*^tUy)bOh%G2vy(H5 zd{kAH&`Z8o&~WRGU4bG~WTi$2N1Pkgo1HLUW={wkRy&=Imn zCM4j3(d=t*!p;fR+~AYVRdOUjPso)jf&z6JoGUn<7ILvVNwc%s8cdEa5s6$*Tqn8; zHm4{G`CLg-?bw80oL%(xlbcmGH=`%envUc1;1rO+)ry-?SHW44q-apr(G;*&3_BU@ zbJr~Zh?6#4^l@W>FZK9}1^N{dTE}N2TtIqD%o!IxUUxpEo>9 zVNZ>G?Pve|tk$0*!lY2FCT0l5COk5R%jLh+KU0Ti=o3%XJuYcEFVEP$&-{4>r z+^5pF80KUB*Lh!(cjGE9Em(B?ygI*c*!-$Ogv}jJsiQ+ThEp*guR}wC$)0yryu)+P zI`kF3@WaoxQZA<;`DSPhm#_yaA5p1pq2gQR<%r)3dnh`g(T*wia(8xkSu z<^vFra&+=wyznPHyz&vVo&K?J!~a@L=LH3b71M}?IML6(k0N>OkB8%_+2(l&zu``$ z`Cs5xnk)mCF(jFyBGuXlBh@)sz8<&WkIR4$P0TjF(mp=b)OaGp`$kY=HO@aAmJ^kG zBC$QryE>jLYzI2_TQnua-LbQs=eNIWXa4Vz%l9D|d~jnKt37d+)X4{n?bf zB5M*V=3_OqPeSkedrVY?@Nb}Bo=FnR|7}9u9k_lh@+amv zi$R)Gi-yqB+1dSGGmg;UnFR$XtMFT7)T`n|FAf@>QaX$F{LiD5vpfchlRlOM;RL~l zqCEK^9g#Vi7I;jWr;m@1m4J9%cR&I0u77)R7-A}#Wics&`Ink#7 z)0(VWM&UZ!NdIhSN`>m5e3hwyp_gW@Gx*ca&f$-|ehrqNRa3?NxuP$cFEF)g+ZOU) zvx^k^;EK}zRd0MxQJ4}C7$vdj>DM6e(QQJ^E6gAj(^7U9$0OZk`4c^xQR_ihb`qb4 zvG6~Y#Sl+C`vs;?etUgZe$qo#zY%V^pn;s|PI}W>@x(d@-ge#*Cl~@cX$~NB4=GlE zJf5DKk<194932jppbuFBFT^7>p9H)v7cUtuN z;yT9V+hXsXAZ=$xyAfTtt+nD_4bEi}=Xotou~n1PUb-7pX14D*3`dZz!?x=62qTPC zExdx1(u}v)7fZ1|4Ya+ekx>J-Y$l+*=Hv)5NSlli1G>s6;Y1w4I%{_2EU0T#cZEjn z);3DdT~&?pvtEOy`KfSa_QHHvNk=f7HlZe*Vpk^$+f&);m(HK2EtUkKuEq5NfpIS7 z!A6}qwuxNpS-*`@HvA+Q66kHK?@5#@cO^$7P-^lz?!{DNaBagFyRj~#^9oaOF%E*Ma4s9gtzc8bsy}HhQ4PVo^6ie6v9Kon-(zc8~Q+aK| zoF5czV1K?ur^j9ZsQsw>v=1prf*nozP-;TluLA#U{~W^*!ja*u4?Q+^-U<8A2pwX^ zMBXBLeac(>`kWc^GGa4rwl}yV>;44emFz{p+onGz&acFB3I7{1Uc37A-Pn~oAZDCF zwR*oWMRy53BfiyQR1J<{>6V@y+;4-5;h!7eab|eW4$+Xqh!Dg+EaTQ`zozj@$Nc)@ z?OW4gkI#xAn+Ei0zOdVD(+I&DM*t_kw`zy3G~1iUwG;Dtq`{I#12rc1stP!hf!UO) z0gJamvBwpWy3dSu6)tg-0ft(hzGuK7oSf(%97dWwXdeh!pW{(}=3BVPZjvRopb^eJ z?9#%Y;u*621PVsth4N)BD>NEw7s+KA0 z*3kn>f6$45Srz)fu!U@tKHmcpZ?V%l+*u`lmE9d-HgIs^UQZ5Mb~l2F$nRPB0x6P{ zae>sbz|3N^R&NFy(7lmj*|e=VH~;W*S{&msgzMLZ_TjuXJ|?rM*Kf#okDTF#i}x*p ze$yKwR?*4MzzW{#Nj$+>4*@)#n;j;HeJ|?WaMOqQ?hK6XAVJYYOy2}qd7$EKo3$fYB-y)lx9jX3>w*j&E zMnEc)$Bqu4^{fZy?e`5)5SlBKqo|Ef(ObreZeJ%@g1b+qL>x`l*a{)l9*uIn-fgoB$f1d! zxE@;a+>#wJ1}k}FQ?PTlJrgx&rClfOv5k(P64h;L3hyAg`pqwg)u>mpGsKzP4%oOM zl+@cqo`G$`ATbz0v=U40TbbM{S<#0$wzs!?(~~p)I-HwHB)+G_E7tSzP53Xf$yYh~ zr1l>r16cP)Z2vYrm-DQceUQ%N@bst;FYP>zxNl}U7x@{b>k_~GDstlNTufFPu{Syy z%G_&k3~Qb7{6W?8RKB@h3{GTH)S6Q<6L>GSqBxyAj1MW{19$L0W|f>x2EBQq*c2R1 zqU_`Rq*L@Y$4!W4WPX#kzg?lonjzhw_wE#>KMlvdx!z2T3R3Gq7qb{>&WNN7!N$&b zW46!Q*?Ew3-p*Y2wX?X-0;8WsZi;nUXhAqBCK%e8J^4huPtNA`hoANsCX;Wq38K() z*S2|1m*~uJO=Yhc@+GNo;qdz%e%s^>pO%xo0$bq*##X$-qofDxa|yF`OmEg_w5QkVDW4nn&6^~{L=C#SZVs8b)@WOAq|u!+GE36l zIzt|_=Zh?XuFg(?@1GGUvjgD$)H8u}W*Gp`IbY|lAY&>0F6j0uX|mG+m#82_;7ey8 zCJs$|12R}cl9C=KI&nv=&k&QgkfgGvG`@n&3hJai4tB0q4rM=tw5b8`$MJMH_|@b& zW15r`00I=$-X#Sit5;Yl5O9|qfHNbX!29$|Y!MFy%q|@`>y>nntC$Livc{j5qu+{w z79#GubC(wQ>QA_^fR_#=tCs(c%7sA>^GFm5goT*?OrMAbGZU`qg>1w4liz zr{Q>(h&YDz^hWc8Ns)xOlv{(G4J+SCBdz1()nqi%JOibb~(qin~XlJu>#K6>d3`R|{1@6?%C_ey)Wd;RZa?m~p9Rv-< zNT5A62=dmloh@M9>&cq-28yf|R0x;e)U@UMmnFMiTe4&#g^WL6a=dCMuQXuahgs2( z{X&Cv1`(9s&;_wiK8%u+LwltijpiFA>AjoLpqLiZ7Z^e(y}KjjXzxa1Tj36`KfV7D z0Loh`i3wF(Cohl=aaTn)&3yiW?KHyso6Hx%Juo+DUnkHVa(gs^&-i92!b6I1I95qO z*%l)$=OkFI8aSEJz$zV_sy1d5!FA|x#dRJMT!#rNy}5TQGADa6?GKfp@7e67ouxy zzWy?2ksN=we7gg{jsryIZF*)0fVqq@k0HArWnPVQ*W=7Lq zolDZ3*$n-_d>V*Vsk}+t?-pHIs{V8ox}BI`wk06;>4ZXt>SlwX-Ap`$(;E?eBg&8`$3iT9TYTvP82ZM?RlYt-6{69EJe?q8?++ zTMZ73_LDiRHvANPMD?>&*zRX|1bv2JKoznrvTu5#rd@emySjhQcJ0=+>$^W^yKdFB z>-JaCt|p7yXr;HdS2kMo2umSWpwf-I+G^S@6NQC@2RLK^hn)H*>+uUX&YSOs+^KdZ zS`}}Lk?%W!1MLV9`~Z=}0Bqz+c+;`^Jjy!k*oAwP^|13QGvPLcyq_}@!c)k5 zkeN`PLf(Cq_nnyc3y^Y4%=#6wZp&?hCDk3dZIJc7Oh*oF>&QHLm_y?_39jVOx=w;E zIW(^$^W_&Hrz7*_SIm?7@}>)UGGh)gPv*?SF1AtT&BHFXF~OZKv@uU`rweV&W$yd} z^yD&ge#JbQH*aGw0zhv@uU`XBXR;;La|#QRdDsKu=d@&aar) zNd=*W)0`gq=@{?l`Z%;wc2*O`D17|LL_Ugx&zcPUOQ$3?@kGp<(9LwqkyBjq>rbXsf9D*)qz!Ua@tfs&2lUAj#CX_!+~yGC#n>U zcs=F0X)s>ec~oW+j+nuwUk|<=Ehhsl?m+`~2RpA{EwfKy%k(N)9WWxr=)}Ujj?Hq6 zQqS$^G*ddTDWS}v4>mJv@CMK#!eDEo4r2f=p%emv)?gJ%1c+0c84uLLlE>AyDHSTr zJaTGGm>l2nnNNG88615uuRXq| z-`me2ej0BebnL6*A7|yX@g_b~9GcNT@P}yw)uCZd&t@1I8eXvt<4U8jq!D1hRR<-v z9gcs+P7gy&yH3|X1k0H*4-!e(Oq%7xx3bi?!RK|&e)3d;N!V*r_{C_r#Izww6?r)! z%xQ$~`Pgn2znH!%j)(f$K=QOg0-zys+=(EsF4&Y+ibsU)QdALD5ayFfKL+{?#)A&^ znbbsF3sq>Kfl^Ry7y3S-ga(O-{7^}5%VE#|Ms2g}#s`kuixg<(g}>fZhm? zqV-}bI^&&!z$X-pu-b=Zm+e3>+e{qU*I}E99{V~JHs^Wmt5IkPwDbk!G3pp`jJAfP zVYRS}+s=GFwhD{gA~raK)g_GnMLhbK$*+w3c2CFsF_d9SfijiWlF34~SJfsF<89@*nPSZuFz)0*oCLAxTsec*Z7*yd1>JQ60RlGpzphnBDkW{D4mxzdh z60H2z)Mq9|Ei57+mkb;VtFoo!VKH%A~=mCp!4Q{jvXt}2-kf~I0g3%W6h zojdH=-W~QMs3Qk;wgJQVScL9a&4;CO7m4mhPl*q1C6x+$}Hyk%nHl|MFF~d(hsF}GG(SY{DX;Ymfg!b#nx_kMb#Y*>mAKn z8acfCj?y^k!~M-56rO^)8O(yw)P->U1l(Z&cVtC3tY~1H8)je&$#LQdsM}upK(Xlp zDF)r77cwi;iaboiI+c8Hv5E&U3)EH|4xR-cHO7|Nf=a^P#PYJ#V|(%eMHdr2nLl1B5`smX!eiky!8nv`2_v+2~d9OZzNRNcN>u+>xAkG zknIOa{U~Ww0unYAoca?x7~+&hsuf(U5YDD0@z`cc>_gvd-1e0o1exj<;ERD zzcBu)ZSIg*+GOsOAU+Aq6&(}KFM%LJ!<}!!1MoIG|AYpJofOVT;Q<&wPKr6Z0rn>L zkde`>d&9b@>aJFWxDV@b4-D=KV~69`Hy;v+QO{awv|_pGWXk;5Na9Tq?C~C1EJqga zz@`iY2ig6}WLOrW_ijzEk@u6)HUCyH4nhw_Z^;TAMg>Ce2lcV7ArBsp6ZzFUC_r); zBWchZ1WDxSkNkRJOM4N1N2C>82QsicJ@W0SsGSXB z@e!RvUN{E}UE>WTV+%0cFqN0wYlWhzvwI$Vp=}ukj*)ASH6$G(*c7VFvug$y5#0nJm{uC z1LC3urSqXD9(M~EglQ~~}bqo>KR)A)}ZnQE9RL`@WptgxnP zgiI?HRkVB$SQu-ISQ%+vAk_n;T2?-X5;{V6=mvn+Pb=L3^yUZ-#nq(Ii+CBX-~S-(uSNZbeg-mbt*5qG@f-w zvMajq<0&j^rfiN!lF(N6gUI9NcNG-pC}TfS!$nzrxwKHjx+J&p_d zSi;@?RXaSa#X?NpxJMl?hLkge7c?2-&(+pZ$v<98l7Ad5%|9LUzzK(rd0?##lG)># zwYIZ<|4fT~6g$;k?$Vg`GQ{yUzU zdE`>~d6n6`H`VW!grV@UEt{Kx)(Gj*=c*aTvwpvr&00$J43B#K-*m6EGi0V%$<~&@ zE?+b0ino9Y&e-86H6(3q-j8TgTC{pfDE4AR=Bc8cJwCT0p;|T^p$6Sbq*@XJchalg zM;Ph9yn15b@SIg}pwD%)QpXy6TACM6qF#HK(SuQTQtJ&Kl%w8sX(}<@X@*Bzb1fQ7 z^qL(Jsf2{OpRA^qZV!7-QX@1HW&YZpLU3o0s`9Gh`I*X|7PE=c5ruvTJI1Fw9{+1` z{nx|s*>EuW|K`Ym>YdGm_Nv6*2NZ4_-XKM2Un)P%e>|xX_zDn2tZra0a?|tuSM1uJe<((+mStzqT{b?3&fFgV#<#A_Jn8a} zhT|jtMp485#uo|h+8+NehC+DeD)WRxl@ZaV2;^lyX8mcQEOUG{;Xye+?M<){@M1D8 zPS1w(axz@rA5K2>6kkT;QE^?r6*WDW^!kM|JEU=ugM9*$a&K1cqc!wQ+emKAT++0mrB?viKe3 zm79V1SS#YX?8r=1b`hDPwYeQ(*_c4nfp!^H4OL~r2F<2@W6w%%C8DVC0%-$nrCPm+ z6qj~E+2^R$nirn%dSYKDyLp|d6t^+r9-G@yqXmoU=fcX-3A_@cvp2I2i2ZdZ7MCz{ z|*7TbnbTwz_AwJH#?wzXv+1x?%r(Tm!|>Wq2P zv|A;>6$UpE*5pP}%t$;Yx|F7-l3pP@j@fI-bfpcrtip{}yI#w|RULCp2YosIPBy!W zt$RZ0gzNur1j+gn^eKNaRaqqC^DoeL`*^D70ZaB~!T>g}i!{cVb+jS(hePS{*WZdI z+*l__!<{gxC8`viSJO>NHijRj2|Zr+Ruia3HTOLnpH86diR(>7g$ASGHRenIX@kHp%Fx^JK}UXKs70b{;{mu*d|He6yxXW*z?e4JIV~(6c}-x`+Ute!$NH7@a{8W{W3lRDUqLx~W-gwsE%!qcai|DY952!BAv__(o zJ1a(mmMEm?c&!vtwu1IDExBp!QVly3mlzs~x@R?Zi4?Ol@vlB&1Qq;e88wvyArfXa zuF#VQO+7k0J}#!$>7Ysb)>a-j4aQ7Zhju7av@pY{?t+1QO9YehT zA+60pZcok>$Ai{LHX!XAD>HoOc7>+Xm8T4W3&rUP;E6%)!zXdAZsrB|-N|r;! z9&H4Sb^){nuQ`k;*R0_ZJnR@VP1%s!y~$*_Y-x8bpluL>>+v~zI0Qed4uzC(;6>UU zPlUTs1LaqE_B}eHaSV@L$XQy^*}V9D@$xh-b3PuP3CTyjA-s-F(=Q%Jg;D{3_5?=o z&Hqa7^Rq`Tspi;G;)Kx`;D7IIP>x^rX!rrNvcZvs;g6MGLC=BGqBP}^29Q%^lRoqI&jWbIoA)4k} z#(Iv}TpPKBvM~x*(xGpS>juC)+0mum?!0Ro3f%d3`e~ylS*d6Mx5)M{gBM(uvTY z=!M8^;1<#ad!Yce78XKZ!h=2NQW~AH zfNMTfY*ZJlpf;L?0%;r!gp_EiWSXfN?_a{X*zyJ&XO^uHOiir{eXIw(&5O69VB2_( zSE80gV=zws^{-I$2Zh@6)Fj?hiR#yp7?8+nu9gD4iI+z@AecD0z_t->s_N!2k_XUW zW~3lO#xj5nV!iu?VgW@Z25!u~KR{Bkv>~b7k6VFC&@M2F){Ppo8{p~J^_w~242nPB)zBi9If}tfi%>!i{ zZT(>LN9-JKmq1H=A`62$aQ22ZH}G;I-szt#OdtWYFRXdd_xb#Z%MP0$Fd)DH83&~Y zOGV%?cm2XAm_DeFUPt{ur?R9_{t!(Kbd6^fWULv{H$wEH`PRCS^f3~X)b@QGSNb_8 zs?7N3q5m|BoqisY>f}9~z@(f6k{DQ)QZLSHdU4*k7jc@8CU@E?&Pj7^pQ|;OaRcWA zRS=cmrk=QWw!iayK$^KhF&MzzQ>-1RQeD3V@^S-FZDye>$j|~t#7=BDOf2ftas&@4 z&%lQ8l;6nmjSa9U*wO-6G=sVcTnosU02Lb;#Eb`QT7bPeL0$zmxlLcv^lIM5mdN;Q zUQF+@2A>6O%?-1|b%ws>3$_!o@&@7OFvlfdt`qS)G@PLH55dtP_@}XMF}5kCmS;Y^ z*bQrwP?*o&k_Qy`vIJ%caS(nHdp(|9OaW*!6Deq^YUL)jy2^xvf7*=fg~>@%63Z-w zGM}TiCm7a)*lOzk8#3RZJ%)OH4WGFOATu{>H4MPk<2~7P3fZpi%=kwUJZkH|Ju8Vv zZ2vlnklD-Zs2=7a8DJBI>A0QNGxIH&9k{kI7575QaNS9Z<13{{PDX(VJ)G}AqVdX#l^O{Ug$qw!-O-g8GLN=ziYLrX4g*Zf5@w0I9JyRmA^5KGg{L5m4P# zC}NVQ5DNvYy1^hGUCTgULr58bPY5skLlKgWZWLRW0&cVwkZOC||$J`dktonRZ;=u~cxPgB#`7qQ>h_<(| zXqCaBzTVjJ+rv+b3o>rtA54yLf$VSfwAh202mCuainTPz=2i!m(0#PTBc;mKOu##9 z3%eMPeK?Le45VUdMy*paAsQG-pcNJ-ILb1XDp>v-R>o3A`l26puIK+i$ih(XLORBE zPYZ(^*tSaqntVsbG`W6^Y0^C&)1>>jf~LP2ElEgI3b|6gR~BEOX`hB5O!H47hdxo4l{147*8(ZViwHZy44QX>avl zgzI@%h+_jDg01MK3cMrG37waKNp@QHI+3$dC2=REp)$DunV@r~O#?soI_>3M`>C+#xvq@nC(d?L2EZ+sL*q2`MECWA&u=ZI7V=9Yz z&CWSgu^vvQq?jM)ea-BjjAtcq-aKCxKP5Kl^~=#oDqDw$O6BTzr(bzZup`zTWtd8% zbk%W)EI#9-a^iS~D)BJtPt!@H*^uTR-lIA0-9480mVaIUsazBT^5~xa-m5S8vY7Uj z-X$;X*%T=Jd4th{ug$&Wy`>+U(=9si9mN|&GF*FT+FSN<{V96GNOMfWUR^=YhEBwW ziei)rdBlY3qSNtYJcUM@M-TN=fGpW?k`zQn9x$<{e0=33nzPZTJ1&x>xAgb**S*n+ zZIfoAP1&n1`0#^L3WSIHyGbGc9%AlG`X><;3w#;mzyM)Dp1&(Paw}df76h`)AYh%1X2gy9#1foIn7UDv&?1doe z{`^Hw$Q=yF^VA8sSfCNmekX)m9~#u3NjbMC9(95w^cLccB>Xm$#fHE5Q9d0FgFM4c z7`LtdPo90|V$~w0N~Ln(0Py%Yc-A_3jYoT7Jaag=V6loEaooX_Lz2RdZ4gXwLjSLS zHRb)sVeK)+)XM_;2qVrR?hGllz4poUux%zA^LSz{xSuL$ZRrD%HuvH94Eu@>B2_0U zM4RVm{*e^9OMVjvIG(kz>eNL2R9z24`Jnt%w1~cC)xegX(|@|jKZa^Ch0Z{Z{I%DCkQ}eKgrgLvn*!t1Oj&qT9q;rj)8K<=M z3(bf<9Lzb^5@W#zfW!FmuPyKHgB-F{xEm5V^H3^zDl=EhiL{ms(J+HpmuX8&trFX+Kg zYXCi6ttXu2iRursUl5Zp$#|L`Hk+Y!mv6dR1J5IdZ&hsI(^X6WV=RXO zmguz##Ij6c5hvv-AeD7EmI*jHRpLm`s)YT!#gDS&qL@r!*R=}EW(Afh3^cKQm0eod zp=M}TJR;(tDjyPYP?e8~IH-yTML6%tU6A-;Kt9vx|H`I;3BW5F19y;f!&*fqRi|WL;1d8|}>b$pimPe>k2M12|5Ap?>uz1voF%%2^?FW;Mbg zx?fqA(vje6x9+Q;+|BG(8zO90gcG~>QR(Q$ z`ja>UJUv_cuBAU_9c6Zqk)bcK&Oc~Mb24pu1VN-pe_5Ar0`Ie3OY5m(5u>dD+}Nj; za%xN%^0Jtc4C^cNbtfEV&0J;~ttCqkgF}d~4p;E6R8#@xJXyU~S12q?#K&ofD0{8GM3#k7nkC4?-I$_G~jyyt_iUL!g<;VcQ{v1 zvj3>)S-c=69dSiFI$6v!Bc38X%77BgaKryvJpLa%{^`Z5$MIsjN@wUY;gZuR4zI_p zo@!}*+|KfLwrf-(9t+6>BZa#x^-j!S@SsrAQP=_AnotZ%JFEW$Xq57rm!mVul+b*- zN141b$L|01`thsP7=}ew=U1T1w?LP#!NB{+^J41xhfkWi=C8-i(7Uvk?P>Xpefi?T z2w~qz!{VNS3CD&+h8csJ=|T|oNp@5Ak0gCP(1{_L(dt2?-p@2ERSA7t!gdm-RP{@w zXhWN|Z$;0^RHR^tupzX-7Bla{DQC+eKd}n(ySg~;)`(*hq&pPHt{~F!8mkFf-Q*kD zEwIDXT$3h~GT)9EWNoBz(9@)Ub=-IZ4(!4bb=UYm2)~N0> zlh-~uni|J51QemmCNU!g{RWZJJl=+rHOE2dYNYig$&ve`k-&JRB_XEhG{++-JaA15AXh=yqEb-y|(V;PKqiGK$jiCgC=%vp|%Qo;yQ%u z?QGd0Y=vX#=5Bj`X@4won__<0gk^N6dwx2x0c%bt=KA(vFgRZLpDxuWx-^$`%r0Ap zX6eTa#tzz|zV*fw{Rji=7TZB54gN^PtWR405j{^N51Z)oa#oJ#bxB@OY?ovOrM@Fs zhHI?_9NPzSZ)9**T@j%#Omyzt{*FQG>#zvDbkIu?+H$|u>KpV3)`fetaJ9$QvGaX5 zEVk6eOg*mH5{fNT#jrALkR}W3X8=nLup|J)hiRzQ#4gO$+uPs4Ek8hN5bB2B!hg4E zVWe4;ybKC2ZDonVWW;Q;n_^fU{C6|crPY5oIK`X$Syt8TccKXdZ*3fAma{(@`B8#IJTE!M2mI37qahyYCpfUwW*E07EOE>9({rf z>z@TlpicWK>Nm|9$|yRC-mi8iOW8?N=AeU)kLR&EM@8ErU(IV#@3Yv8#UXZBq}>%s zXGP$u2pt@PpCa&5Fc($qqNsLIthvUI7lX<5yI9Dn)DWwmArT)6g}(bC}Jy0{dawKW}6ooYmWD^0qJ-i8}GQ}FL$0xcpJ6)Xe;Fe zJ`!|{pi=}LBIpbOM+i7UR`(+YFJ(C&qKTd;8DjI|RQVG>1k;a*2LL+cYIgmNcqbCyw$WKvNKy(F811<#S zVRI%R!jKVNce)H_4aY5gz|1EZmVGr$h@9Z-2qcevKG9c;KuBlLd(T@F_Np3b+a6E! zZHY7TcUchPqGQC#&GEia`YoV2=t2xwrijOn`CNZN3`dM+rhdZjGnIS>zwraV=)w`t zi=3IF^Dcbgfe`YFv^cOIl<} ziY!f$SfXU{*(3cI_o`ndc9gkBRq|T>6Fv=;zyZfHTc(A+v2$;$ViPg4;}#me7I47< z4f{3%{mAd#hnI$f&0T;K&eUW!-kZ304!OCIiyOs|*%dO)!T1bghklp1{0x^g{gr3< z%IfYp!(puz?l?>7{qfMfiN41XO@Dis%4GK^D{@~;PuuwH1Mx!ipfJ%igxj^3bVC>! zm&Sn1TK{HnrVnb$d{(s}TU#MM&u(lWN%>Jfh<-O&7+x+PAHZq+Soy-O1E3{mtfYq#9@LBS06yM4?+X!1gfmNq$a_sgSLykrj8~wtvA%=nE)@k6s08qbXvrc>??=5&i~Z z=8(me2edQ6=0xL|0^$E@IzH9o!h6jzlZ|>l&VpGOjKdgwP!p;(!I;kNSpz#n@~|IWSC+Mep0YSnOS_ zARqtwRN#7FvmlphWcKRRG5vBo_-#^2*00V|~D;yMW+R->U+=w|vZbc(1dmlM@Ejqp!jpdeE&CTe~;pi|5RvsO$ z&v6UN-Yd49yXh_zn;+42R`ccslR~`eJcB(I@;DZ%IgG5|M>Pjy2w)-|gVdU4*^it2 zI&^PFyF{ovS*6HHS zZmKTRD)MN_b>yI(@yP6w9)-8NjsiXEm22y0$+N7Y);+%w@%?L1uKU1=O+d5BCQ{pZ z%sfd5oKb5a6N6ZX9B~D$fTRv*8k@sh;2N)FWPURR|FulP_BR8tsR8)S+WThhHL~`M zu~%!|8RPEa)?A&@)oEsQg+XVo*5;}+jgmxj(?}%xDlDTF%$cuGGc+^p!qX~X)oJr) zi=kH5X#THj@dU2AKa<5%W5aymnR>|IqS5Lkd^Dxmggzz4mqWQlpFK$#JY2rjNNaU& zb?@xLiUWUa?|$$8-NMJbZo>O3+3$)BJjZ;Cg=p|K?&G^(!feYQllE_KFZ8({{Xx!$ zF7!&@v~GbY25ON{H}xWK z&}~_~0&S7vy#!&mwK-7_YY|ng@JtbizJH|1NSTwi@Imn4!Pw-I^qYddN(D{FMgu*Y zi2D|(K#H`XmIDk#Z&C~wRd))q6>FpwtmO@%l2CcZl^m{S-G-G&s)Z@CY8{cV)V|07 zPMsV%a7TdLSx0-yp!$r+MNfvzhU2-IF_`u~zL*XQ@u*`--ZzsEoWzG+M7Rk%6Doqd z*M0J^*Z+WrHB;}a{Dw>U=4UzQ(lJaoN;+}!VU)ax%CmS27eA6xd649Cj$8<;@{zA_ zTh^KMBqupNitn)Lw+yM#VUO7=I`R001=VhaHa0rgypNyqMyzaRcpFryPjayfFLgB= zT4@o33*Q1%zx44FJQ^#_`r$bh2KZSVXbJgc<86f=MZ8r#3IMc6v4Gg4oV&K%wqtY1 zUyI#Pj1TJAQsx}?9_N%MR-fomKf`Rt0|A6FGtxgRFpQP0Vq6(N;us@fjErg14FU4# zlaQ?twU)>5s9}vRU7^hqimIjy@RS1*x|k7SrH&uMamZGp+Dh&SGsp^z2})P-go9Fc z1V~~|gta&(@GB9mxQfcA$H(V8_|ysfk1H24h4O>&EQ75h_^cbv#1=hC63%k}0VcgZ z^gEu;3-97XwWsWZSH(Zh%4snOpxuGeYou_&zaFb?jFavlZI`eU{zdsE1_+|?5%&HtQzRI_K1rKU}KQ7zQuu?l6&M_Cmn z)eS8hD++0B?gg~zFvQZF(Wcax$F|aHwr%RyfC;rj>h8N-N`ro|E2wwVqqZ2vXY*ou zHz9c@;uo(#kTqY*7K3tz4EZWPr#xg_7@)$$#_(t5^-@h6L8@#V)lm-@CAe%h^%$av zjrQiX<_OPCJ+~vbn=`#(^W};1(zqbap zED#})qio~6;7t=;1xCbHy|w6^fl+h#;@k32=WU2;5@#}kht0ig0ZEFGaGAWOU|qU+)+=EqT`glAx8lZxf2;}kT54?ehA|&T>NzXK$ z-p-(A#OGiXq=)f};{Z*PKjUC93+d!gurN=+yn_=Wa5LIpU<<(>XbTOYsJDijv2maB zjtDQzL7}!MqwT7a?i9lPKpoHSz_3=%xJJz2l_?6bRa2KV!JSw%)aea~LTnfsqlzLt ztVORjVvkk4xZCKx-R15yw*_}~^|bC* z+@Tqk)*e-{5v*o2uNzgxCZ}LEY&1ID~in3 z73PN7TZQkPFhf)ub4}(Nc6Ig=-js*+ruD~>pcG6CxaXk|Fg4#qjTP+iw1-o+I9#Qn ztr6>q5rcoLWR)q25gx-TX_9fhA;#e4Z)ru!ai_ z9#*c)xF3_QFA|D}I3#_8v=%{j_$FQ1$^C1@w@SMwjuDvTYNP=XN?3qZ_<3osN{1eT z-GD#BiQjX_W)@+NI}Wo9bHdX+@o7tT{>4CrXX@DT6$%rc7cnP391MPmFoz80koUt% zTP_mE<82su0Yl(mezTzq_G+X7HMbdjOfIHlx70*>PvAV1PHJuNagT}&T?NV@oE-Vj zBlX$$pMCW?@SkoY##UwT82|*FmDdL`HUZ@gdkACGme#N`3VdO?&rl3fDA*x3D^q~L zp(H27zTZ**aT&Ad5Zn-W;g6H|$FoPpNlU`Sk>K$wpTuMq@gB)|4YhG;PF0_ko|U6Z zqG}-Ht*6Q*1HW3>+rysi>0y7vb{4PGl{)gJj$ElhU8z2n>btrILR~S117GUMl^P^U zUF}#8bSy&mj)ny<8O=)`?wXfsI_EfmKx+gRLS=9&m5auP5SYzFz&R2L!c`EXxQe-o zDRJCcl_Scnx{oOlkvNl*?9{3~Hu}VlU%H-_3%(+@v3x}6+4y*_8a)$=*etQ!Q85}k zDyK!?Ou=DcmM>y}_n)S6%{EJ>c&=>C{s)O*og+=S>ux8DZp6wXHqClc-YyJIT$$s5 zK{HdGUK4661Q$b2g+OBHsSv0p1eFM$4n-A#SBIpcoxIwvUfnKdT9<*YIl82x5 z$)o6H6gnjIgEbb`eE#8r63iB{wr9%R9-H*X2Q40LPW0fQ*TeB-i7WLPKC!~j5@HfP zC0V%}5FDozrUQF^vM#`=w}a!rV06+ELw2#_%3;9BncKJ2mASZPkclx1xj)4vlU214 z+!a95N0I-4RiIk{qYOcyHsDp<8pk2J(G|po_x$uca|c!hp1I^S&n!qa&(Z?ClK2US zdM$XwGru)xc^0?EF$S_4@(e~RoHSbkD)e%4#@Ul_Y*P&xtr9&vbHIh0egThhgAkZ| zJU$x@?q=7OaUCIYhNG<}G#D{MVLf0+_n>~02s{$@Ami|P5t8JNYL*#TQ0}?QBFll_Hh`AlrXP zUNW>Y$5wsJhacBB*GV+3Owy8vX<38pC@~|iodscK#o&^u7`3ssvSDijtVwcOWIG~7 zNwB|Aqy9Kxby(Hp!C594emAix>0Iy0Vq*9k2alE?GbCpTqDfhVTAA3ib`8)}%gw*? zG!@6QNk@MU`#wgH31Sv0pQL07BO}y85zk3%^kDJ|M$Kk+y^S1(rkm-_GJ%pnHCJon#(0T#R;bsXwel+ z+3F)AU#d&~bp90Sd`IK1>aWvL$%Bqxs*k>EcgUCRj}veuD?K-B>FePT4(wCW&PW7$ zeUB{P2zo}tSM-PmsEakPYO9*KRd#h>(mSKv=|Q1R%Mo~Mo}Zl_71QmPFAko(e)8+% z_fMYx^yK-I*BH71x3Ve#dJBT#`QxAO#{h>F09DfD?|e2kCtQ(ubKRYHZM4G@nSEZZnHB~>z?12)VmVW1rV`!82^WYyj z9s>?`8}s~EQ>f)Q>JgzwEvH9Ce2^}=iO-7Jhg1VmL{)w!J@6uO0HF1@?5`~Aav6iQ zBw2zy2oa$5)=){hQ-vIl=`?q|8Qv|o^daMwo1T_P#bYrvV+5*SoW z{cgc`J6mi-P=^7O8vfy9r$%3BsNSLl-vTbJG$>SrE4@nB8W!UfYEpp|R~B@q&I3}m zG6MoNZc#|~g2SK~MgcW2N(8)Y3VFUvT^tX*FCWG7Fqei?@jQa6jsGPb%Oe#DqbAY- z9!#&ur)Tqp>WlLtdCwXFdZY3b_x7uR8r_RDAByti z!#qk>!)vCuW+Ik-=%IRx(vK&z2#w<1NihR6Q7X|p8Uh zU>eU$bB@7Pv(Kq#qO7YJs396~5CL6*h=-W$n3!moV;APHz{>k}PHDN>Me<#R;;|}#p<25-T8*v+VR#?c&0VDl>LNW$7TyT zvT3eolB&mT*{j`VEtVpmZ@gD79{HuS)Z)lm_)=bQS|*k17RR=2~i-)aOzILNM?Ha3qaWP~pWrUZGd$f<;Su{sWoJZw}2Kf)K0g{`7B07?G+XJ?)D}1U8A?df|tZ^k(4yo83CI2KIzN%0Hr>4 zL-})Z{KrRDX4Rnw_=!8}*kgbKge& zw^6_Ls1Iy_ZOOVx-6mH(K&ei_`IWaaBZtQ2H`nfFr`< zJ&$nwF*;Pzw5$w~4&#lC(2&-;u-c?*sil%vo)k%J|Khr*9EBA~`@GTd0|KvE#+7FE zS!%;BAD!5(obBOkw!CV%Piq~%8hN_!ei~2RZcH?oX1rq?@Lra(3ZAaU|JAu)#d|7p z0{5#HxizY!KP-CD#Mwf&-xz3tPZfE1+fM1=kJ?R`TRg4S0`pA4IZf?eFpQMX%XdXxKZpNW|W+COK zE9n@95%ws4z@-caL+w$JM~Nq2nn#Bp^rpW(Og)nl99Wl#P+~rKHXekTcoN!-j-3jp zn}#_(o1wSuo@#q|Q1U{~MD{vK&Dn=X^{=tm4k{bFc}XYPpMs0`f#o73w2se4I9OXQ zxoZW*r@SRUuRkA8PkY1bU?lCpe{8~DRiXQXK?%nsu~-L-xunX1&(4PPaxz?E!5j;^ zq{@N^{b^B*uviz1nFJ{GdBZmsA`g-;@LR%MCk{qo!;Fv31b`c=#bT~1nq@(Douhqr zHYs!(9{9s$v+PGto^G-ckfT9GZ)ER;Id7!ILn+bS!k2U8GWKpg&xu~xma^lj%%fz9 z^aOqMIj~fwOy$%(jTgExFcU*J@|-4z`5u%oX~xI-bb5ut_qy}xxHl-K;m#4XFAE=) z3JXcnF?5USO7Rj8R~kg3%w)qz5I9=DdEL zqAEv|GyAlV=JXRtu|!eO;rQd<^btEOv<(e;GMaaD9;4+$dGetSj?rb#?fG)%aZOj> zKE72C-J=%G7HoSyK2VFD(MhXw3tkU4&@5T3&YvLk>W6S8sf3WFt-8IM(r(q|A%EXOh!35<)z)gIF& zhe5G#wV}FjeupUXEnW>G!Tu^FVUQdu@N72KUB&*=j{5g{tQRgO{FD0Gjx~2`^pgD* zC?Ad2OB*fj6mb2BAxnXajuE@wgfZeTi@SA>FLyDP>RSE!FgbA=H?9M{wx4Zv#I6mg zV9QUpSlwv*dP8Z8)}$fdUlqsED4@&KN`YoQquouHBt>m~aVIHBqA+5 z-pje<(K@PWVQPO+Us0lyne7KZE*p-4kbJjlT6qlFU{p=Cs}F(KRBeXQ?+9O)G+v?s zC!y{tdw@oMKl-Ov!csrf}+ISpW&5NzB%4Zs@nfVza5z&2<-lT+~w_?Oo+{NVOC z71Kn;m>slw6=TCuHeWXAn3Rp-aluzK247h>k@%VwpxV%l+Pj~}dRt$}wLbvp?9usK|}mCIr`-jOs5k=~H`9DMufQX*qv{K&okmmb)REG=3#! zFR>6F`>Q2KhhO;RS8{%m#bOkC`f~iNX*1!my}ue+2k2S|RhLpgzxIY_@vOx61P$~t z=(QL=u@1#rW9ZnyG-&R#CR2zjz)yEz-uZZVc3MNEwLN-6I6Ybo`&rg|<_hvvxa#Bz z$>m(E)Tt(a&DiLtn1x(tc}Z|r#C@jDqI+v8#m647l=nY~`k~u_)&XhXvU8)NYLX)G zl}4036l8!|oN6&rb>>Jk2iRKI4GsPjMRYtjEK)b(qALc?&FGB94G6CbB&IWRM`4}C zw|GriAh)Xi=%jkucT;EQUp+bUP2E45s_4FIH9-x>NabY>iz2ye@Wh=ZYQ6|;r`L_a z@-RAfnAp|}oaL!geW)Kv$W%#>MK2%f-8<2sgMU?r|FBP+-}a1Wna`nSwuZOY$Sb#p z?>toM>dJExO}auj`eur8DlGi$V+kH&qCd6UnF>O`r&O{d~mISh9b*Uk1&p%ke`lAmPvR}VfbgL!XF_QI(rd&Xy7q&OO^08vhF+lSsuciWKWI3~ zs+LAKMmSZ&_Q7}&4{-AU~Hz~Ndh(?7Hq{*ScP6YiJj|{ci+zHDbjTcqI zP8upod@Sn!%&k`m2-Z}~q~hk*C^9U@#)bVILFuXKmtO%& z4aX>7@btMnHU`K?NKT#jA~Gw(_;)YPubu2IQT3BOl~^Mj+&fyWQT_esFQivp6vl># z{VC5T(A;@kvjcib3hSE!$}V34H5z7DG>l@ezq=Jn!U+K8wi9QzOxH5o=F+$!**>cb zRq&F>gS0;!&x%3bOxDpy)f>$ZCPn=Lfj`Jb*Zxo+IbE?`PyUpWn^`vum@fJ746Yg< zYi8lJi?zWipNp?1%uq>=ROsx6>xfuGB*rKJZfkkT_O0N=0D+9K?+AMJ`5cQiwHXk& z-VQ-9FF5AcMHerI9o4HBuIy??@VFe!<01UVc&{!bz2nk*W<~J@fTr>bu+0P*Ak#h_ zot<>)=)Tzl(~lt_QJLQ$2{lSL32V)OErOK(XxBM5?Wmn-w-JqDNR# zoDJj`Y&J&%-`Wst9~KKM?2dZp4t4Tz2k=~X;C9ONSqSGNTo8B)vL)Ls61 z?F{c(;bhXu*d00%CYNE>IfC)WpJ}kH1EY;h!Z0PGS56K)T{~tO4SKa^ayZj?tdGGoKM$O&BN2%~wA^xG(eZsQ6SC z(}ta$U_M|M*-nsG^?^lM@0~O&Q3m+SXjYz#3M0$e%`E@!JE_#kTBVNGD%D%LR4j*< zeOe~H1V-IhA%l?7&Xmb~qOi5IUc^p4otirL{YZ}GT$DH3dwG-YGaZ<(%pcQ->lQp( zw_tCbf=vz?`F}V}AO7;{*T?Sg7jcLLN(lus@RbsnHrL*(d^ zPd)eM1~UeV#_*sKrb0R>xDz2ARM?S_4oa#QrH9m9&1`g~lhL=i$o~5R zv&y$A<=f2gZ#^^oG3xuvsOkIp)vg-yZ>pM>T7B8Drs`W$@vW)$zRcQ2>lIJ{NBLJW zDUDVaIa6?TsWSyv7d(5{V%>sk&%C3xr{2-Gxp&>UcQn1Sxp#DOWpnT7=*m`Qqu%A9 z-VJ%31G6v59QiKfHXy$&Tjy5DZ$N&T*3M`uTRWo@+1eQ$$&1xdPr#3kdeNT39MPh} zoIlE@x>}R!n?=Pb{AL>+eKU+MWEg$3Z@$?#e^&eEQjL(%!nsr8y=(jD#wUqrO?x=myov`#PfR}K%2u|dE z>BB|xp`v!}F{1WrYaVxgD0Ob=!HegQ-@khC`u^+3p|k~E2X$C&*KtSFU;%~E8ta!( zj?Eh&fK4R8Q~3JT{pSZyS0gf~L}C=^;mUOCW0q^u`et2@I%3~^L23^#Ozq*-Q+x36 z{?oN(0HY9Jt(+o#Yxlbjsr&^fT)VGzAm=Nl@NbXrM^j(pK8EPgUx2>#`xqZ#`2rNK z-^Un$`$806>2zJDr|Ks2XOn}sg0)Yd&1i1)mw~}wZR#i9k5H;|r6(iSwEt@?e?^=p zq%D{(B*osk5fh`UTy<-QNY*RY3rJ}q$C58*OBV~9t{Cdq3e8susi9r9GPuZ^06P|V zCanuD;{Nf%;`kolo(k^gCzc#~WB`$@cl@w$HS9&Ir+yLgr&mtG8z)z&qtfBoFwhw=7w&$ZY60Ep`K9sB{ZNWE1mx)opqSb(ygk=uPTr2 zul4i%o2XqPI;OiWTLn9zd~;#cp$Fbc`r(C9haPxg_*|U+&=VgFOf9$HSmB1UNF78 z$|@F{eDL!A!za&wzMK}DXK60l;LCd!=K_p*_9XH?2sR;a|Fd$jcH39muex*takcF& zZbQ52|HPPYXb7vd9$3^D+6WUZzc0Qyb~UEnx1F;Km}{$7wW86sdIc+*ZmaJF)>|hI zPP9>6u4t)96gAmbyizZud0Rw!lPX4Z=?26~F%ej$uGWfbb-h?|RI}NBU-6yfxLhW_ zK$UzDLBORWtzaNK4;u$giUJ1_U@0Dxu?;b>ql-!8>iW?KbTLoF+|0V!jVxF5c#sn# zT_r}uDp4ZVIt(kA3_6-+z2{%-r3Cu=`Q-w~ReVoLHcBxXG+~6EqY*fGhe-b$*od=4 z2weP15}b#M%mxvMu(lvdPE<`TZrMhd&3n^^r=T-r&E~!?Bik%;v>^Y__1bx6@u;6a z0A}?=3i{z2`S!drkdXfug%rBd`sFaQNQcOxYgQl{a7fAYxp}Km5#XYh0>$T}Mg(vA z=y2+@p2pOSnXqSdMdHwCV!n!|*-GcSRxvS~8JMe?mkHytk!g7m!*Zt`zZU@ir2dmF zFb;V!%Lp~`0$<>}kk&j*5(lL+m9ahHzT)3*VdnO9s))pU(uCBKwh9KMOgw&jk z`X73u6EvJs)TnAmD?{3l3DfeV9QB6Q0##z{5WBQ=gKPvrQj28gu59UM*~bs1nz&k= zzH9sB{B1C>9NBMq12#8-e+P^mJ}*aZ1^A7Ee^Ao1`p8(&wxDn9(+bmq8oqHv(I)+wgr?r`LQ@@ffLBP#*At z%BisL%ZAEQzlB<}Iwd%0ds>?P4mYb6Q=30jYYQ}etJcD&o~w1|N?06X`>3k2!yVNW zMYsd2>!^CS*3!}J=~@fj==Iuo3n-F*#CBn+ADm5XglwmqC0~fgSruNNV0#Af)K7bh zmQC{}5QN@`RsJKB(~4fU#mf{f=;g>6rC7S{sxif&J)hy{d2gCMP?~MJd;+Y^Antu{ zHZz^3-|Rf=&&N}I`d6)5vG;>Wm~FRR1gp-o<71qp(MVB+el3fS`Y~gjMT}7$F4Lhj zzxHUZ--uFwS&pkn|L_gd5kSo?hJSK4k&?hqHMZ`wd_AgTLNvjph-!4dl(qOw3{w_Q z_1uidn7Ga@f^9=!j9Sp-fh3&!q3Nr&A;p_jt3Ye3-ECNHYdleMSbi$>zSemVaQ7%9 zaie)uP`pN4%+7`&mPgrNvrc}SPAM&&c4q@D6E>w(Ak8ew-}f_v;PwWD$iD3%s*%^A zPgc;`r9gFc)Yg)$ClB0O^))r9D_z^2^g1fNLNYQFiiVnfOf`4yk9+s-Wu5H*mukHV_=+$z`=yF*1vgl4wl~lRL zt1ixVxk&0p<#(f`E_WPg(v>pOov?j89iKi#!Uu(x`ECcL^j7wJNQuh4)eWS)Wct)_ zEp%yUN_JPJr1PED0=XikCDO7gq1_rn&D-uP5E{nRE9p`vF@_OgI4G<$u)%bLpqDn` zctcj2sR>iBIk9H8&{Ow-RfQ?!pSEi7tQ9wQ%nM}nT`R3;>`quY;^}17?tU`}_W+#! z5%4a2?u~p4t^d_;@TA&qBk+S3YO|*#R6@{L7OkHVCcNt*ki#E+fz;NqTJxfX%ky$u zbCCQt{JyRqUA_)W=^glwP1tKzoIGQTI68=frZz+bB8C`p#DJd-i+UMF1YJZx5*wm{ z)fpn#MFjZSv?#pQgJr+dW%0XVVf#c4mcNDNT@s-9yb*LR90v-M_OpL})@vXu5t(?1 z$@`GmV-MA*Z_ZN-YQDK~rDterb{ddG=3uGXU|>^2%~=@4+~{sc;}`9dn+(l17lMhc zax>u~n+Vu)%Yg8b#b?ql;SPe87hRH1NqX`zM4))5WH!IJ%yz1}t$Ek};ey?Av&;?Y+&70Xw8C%6xe>^R2&ZhmF2WE={&Dh!Yd}c{z z=@pBDaFJ7v-cYxJO+1VfdkX=ww}>H+yosH9h)FMp#>3@_BCQ_erCKT)DEQe@t=PXu zRJKtZ(n+GuEw8SaGfKap-m-f}ZIf`ncXULan}TC67Q|0s^AFSUN4;G%ohqhYw;)Q> zk49rSn}&<5?d!}#8Zsv47KJA4VeArM41YqFQAj*HK=#P=VS*6C9Xk+C8ZbibX+YBV zq~h)4X;IuC4qKMyjQ~h0FL|sSP03fXEU|A(vaP4PO(o;HcDvU{XEvD>)rgpvBf2dX zpVoxp{IuoRo4Q*Q)0@JXUq5ll{C8-CarFtsyp{Atbc|fXfpP!u`71M1!n<%~iD)dJ$;9!ua=dXWNDL?F!8db`Y!W`-p0uxpHWHc|Pv!Xwr9TX=xxh<VyXTQ zaVeI$IJ_JUdpz%uU%HjK`%-zT+&#^H zQ_glS3W=j>=QaB*iVQT@u7ae9>fwZ5hr4x#=&Q=n??9gVZ zPRdC4$koHPpDpB(LL)8-sU5pGm|UYy72*X$ywHfPz#$_m5o@Ht;7ddrcZw*)#;VlQ z{!HG|!Fqqtv$7vKei+?zS%yGAo@l8mSDCaVq_G&)J0ol&QOCL zsG^1`JFG&@KQhH6-YBoC&D6v<`I2)KdpLF3HN~cSe8%3 zCgwOxVS!pIJ&##p7?h`u14GYPq(7+9ssu@wRk~;iN=kp3EDH&l@${>6-&9P(zP2}t z4y7ozEK1a3x-OD-Lxb}cymJt5HWXpOXRiS_*KkX#>sy4tUP)byTRB{73|iIWko(V7A_eo@GT%pk-y8KkSpC?4XC)X zYq^4HOGsPpMu?$#mY+9#fi2I`8x}J!i!&=S)&Zze9u*J`V;bt<+NOoZqaxB;jfyK^ zC}HZZPwj5NZv)-&>A8o_eQIYT)<;W1quex^N<$|au*&3C?vk4EgZFPdvY+kF83j?m1e+SV^oSZSXYOq*vMgN8ZkuG~k$`X6(bHXA0dRq2I zCuhUnd_48;XqwvG8LhI;i^a=&w=f4(lbb!*l7KHY1ZGu%&D3hJ-#ahr0O#1eVH59m zL)W!{<+F&-H1^_XwLr{WM-|TazyirBj6v-MFvY@pkQtbDGQt7TVDK2MQ8&3oi%x6k zFD5jEc7(?B7H{U1j0oH7jtnLSju4w#ONzE`I4Rn)+1xA%MHZo^i47!|2X`R|CVz~p zZCk{&5fw}>sZN$`g3t_e4U2Z$j?ZSijbJOZUHgm0+-`0$)OeKz{3Y-f|4WR@8p5=kolj?zq52Ec3%!c(CpkHvAfY3XwYVk0NCvO z6d+O*!H?OFvW!cC(zmSQikXzbHJ(*zO^(8fS{zK{8t5h?v!V9++?(j}yn$5gG=S;6 zizsr-HD*KT+(7|*uj5%@Hnu(V>K0^V{|m-`%Eop_4mh}L6HgY5pO}Cr+&UFAYfSV6 zRZjvD5OWhW@=5}K8?8Fr_~#(i*t7UBNeW*A(Q$9|pf_{x3~edvODzJ`!WEaob;fgO zrF!2W-lmD}q<3f;Z||WiiKL^UVDq|BULIN@==;|NExna+BLe*!|tt<5H z_?V^6xzOhDI*B(9q~Wi$R^Is?^0ix*dX=R!ghwzGKw@k9^DanT-DRuY>}Y zl{gBc73w0q0mgEdiCjA@^`-U@$aOJyok{mLjhUrOa6*M+Klft8Ezp$7b2urrMGJ(A z4hfZlT#4#DQEip3t*n^Zfz9{8VIA}!HD z%0$Npu><83mB;0D=8SrdNNH;h3tgH3l}XrQGoc^RyjjuNth(vWE@ob;|G)9DdSWx_ zhcrF0BmE|T$xZpNZ1!y0GG9v=;8F{n?c(sE&KAFBtEV+3it{%KMU z4Q+2Mjbh**wq+;U9*aFM)qij`1Y!4>eER%#e0=jJDlnZEBfGSS- zD`y{??87+w4Q}ek>4&(n&(n=wskDd1=~MOw=s0jT4BXb1FnLx_FM^Q}yGDb$Wk=g8 z7V#SMddd!ILQHd$I~9gPaOh}|*}SLLxf$90YUD}dCy|JUH{pJ@0b)WoDO>%cKj>^~ zA~rZ5takr}fW}qqy|DK1S!ET5AJ+_biSwVG1H*l-b{3_X#kET})Cx%C{;AY=we+aW>Zx=Bj`ug}YBv5Ba*miHTW%+JoEK0)#o? zs&E}Z=xcMu2fq2~9#E)e>zWemv7bLKuZPKJ0L==uVxb=OgS)s2&9h9Gn zmedJq3Fke)P($@?rV&+r?7|YNs;GmdDs72KAWwV06%U8w{%;@4S{-U(-g>hbUt0yeYX3iSU#q%>Wu>6v)4kEoBlWJTr zP#%v4e=p}B4wU$y4Al-4cdVW#Zx^G%0baB;cOoG^Bt1E2N~rqc(Ta)u{9S_~T0KB% zP_>lg$uM4F3C6Ohtt#Psl@XXZHaxRZk~nS`wC&n{e5hYRIBHsc{GT&DM0VZCPn&mk zu2P3^>JMJ^n*OFhK8_!bhvO-qE1BjG<^rv3xyqLq8)*uz`b8$wGLssuBEhogeU+nw z9#jLh4229UU^a(GP3}-gd$@Cls_AMmY9K+uktgXKThNEnz87uF3ydl*?SVz>f3|f+ zOGo=!40U+I25_ALxDu`q&AF5wVMtT%cj+SP^D63-nKJcxf_f=^HR_{%L}_;~q&}G` zQ{PQcFQrEqoXAbI$W4^UvC*WG5~1ns{1^>_U}a9{n1n0dZOW-7&AT>HKf;MAuAkgH zMLtQSLemkK6W_f_9aqE413THixlN(S9^eIwuDOme@Ru_n&tE_g&lSQZUI(uKD3mv# z>?WX7s~>%pqZ_}C$eV7JUDPOgwpK3sWL}&y#j2B2g-91ny>oOY!SX(wjcuD7+uqo= zZQC|Kv2EMQ#@N`lZTro=_x+voJ*R5AdV0G1^voYKQ(g5u>j{AdIDcB0)l)(bwg|b{ zEpso(;MY^zATK3!8A=F;j^-lL;yIWpSU)adr`~BYfUO>jgY`pzF*OiNPi%HibQ{!{ zF}OAIS8C{8n*{5xz3X+gVTZs&NBg6Lf6&9ppqpXgh~6I=A%Iv6f=Sx@la|yqp~1fTSHd$(;z76VO}dT zpNax*XnTL6(v? zoKm9-+(WcQQN8@_SqJFw~66|Dj~9#xByH;}0kP|h!tYNAwmVGmo26LfVt z!9XBH*Zc{zJFH7byJt^bGlwToB)F*80sDQ)N3Yx+qh_C7ExMhTcLb|+xJ&xFLR!AK zZTutF*W+2Db*pQ=5%%JFTm^1j*M;)~Qoy7xlqCsKzfe`B$wuBOs?s#22GY2e8gDAH z4A@o?iau(AS*MZ2H$~tL!`2N=5on;9m0@Kg*+H|b!3G2bj`Gteao0qpJ)pT-PZAJ! zfAXyvv!4A~WcE_Z^QxKQWrp)dIVLQY)K5Bp*yojYgS{gRs1$a332fO#MEY3nP zD#{=wB4_Mq;Bq);(9)bK4kF&Qu$Ab7j^TBH^Kf>9PE3KU-wr}OfcF^OHp0vpq(@dZ z*xS#W;My();`cIpe>F&IFD;Ro-H7>!bFH*MHj=l$&wFUf% zzcHR$kf^@ z?YyM8{Z-(hpnxYZ#`CvYNaC_drl<@L2fu=?2vcbF&;cne5&>9!mbpp*w{iv;CQ!{H zD#}!>xcqMjjq+ex%$g>ohi#op{9W-vzk068a0qHz=-kF#_< zRPw1!%5Akf-y{mWgeaT>o#s{+xG~BP9$OiEXLQ8_HQ!itD)%MCYx6VsJF8p)X;a33 zfyRfvuSe(3c>@P^ekVsTEgP!T>Gp4BG-&j|LcSMyJ7diIVZhqa-(@Dk9zu1oM?mEvvrnVm)GCQckDOM zrS6rIY9yz299i7+80HO$ctQA6fKW$}galvbT4+}AcL%(&=?9=*y5NXeVt%2D6E~3#FWt)yW^$Ky3TifWc9A<3N{Q1Ho^+nWfsFc zpty+WRS1qo50B=z%)zJi`EiV@ye@0$Ma@dF$E`B9Q|h>3D+14_7q_==-a`NE*d3mz z+yWXMBc%u;q`~s-^Q5?t_xQF*5XTKvEjbK+6G(`|mz=k%jg-E@xr0bCLJokY{&ANf z*A)}#fYOt*D#~0bv~RElM&yzbp>Om+GcA$RP{HI`$)Pg&g^_4zA^>Hhl@Z-gr?UK< zL+RH1w{)HPQ>F&fQSnhQN1m3HpGBsxXMLpGmj)%`Z)-|FRG-qG0jVeAWW3=EA)_$C zN>@uTu2laFu7r@%$yzdK*GF}{b83%DR12Gj*I_uc`)elQrZ8V_S$Ex#yet+v>S$X0 zetC-_Ua30K&~H%jla*j-7zI)^jXf4V5^e@X;OhW1h}y^lM!KCr@&10$namtii_Soj zxn9PEc}ImI#N_O>%i$3xk+rIXOz;xVSbjytFL4)X{;U%rXP}q4jgFqJDd!n$-}S7# z5S-?DY+%~xmBWs7r{=ROzcTA$aEW~moMeVk)m;WcVt8B2#Q4TNf44@TLWk?TWz4S{ z>t=L&@G*81dm!=0Bi6V|jxeCpUyQV&yqJS36g1M<5I&g|HwkY3yXQ|_ zu!5O8;^{V2ZalZotud+r3bdT|Cr|xxAb;|Z+wgj7X5dB9>%&t>y=p(L8~7X#?T)`1GUGP&%q>fOg+vy7V!+0-$3tJr?)mv zbQjOtU<$i&<-gT|6KP*i2zDtgq4{hGzoMfqdSKfvn6BW|ASl4+;BB?=et`&xCC`g^q zq~^UIyzJa=v$Sv`jGeQDSm0V;6YPbW1(c5+7@|h3#|xR=TlOa=D~Uv5J|8|9>*_6! z<0>02*{6@n5EAZRfNH5cPxZ~vv1I=~G;91yej7w8qOihvOhwO8KpfmE;520e4HUyP z0%!=lHr#rTiY}*atB6cxB*QIM+_DKx>P~i-Ka#K5UY&;>STU9lb>8s{GC+AAmex&( z#o|NqP1le}+;TC&iA`bN>vp`B`HrvTHS=sfdh4Vv(a!wzy{X4MpX{fSh}B(DZSjrGwHBe;gDqS4T9^tDrM z%j#5+lLk)bXFYbjnUOT!-dA82Ho-y04_H^#+(Q$bS;g`&k((_eLXOR|!Y+S_baSr} z53=_kZbP9U zv8*(Y=U#O^lWmfi*;5FeZ;oY5i_F9`X6W@4Tr_~t`UNBz6B;Gfg@^c5|4?`1qk zEZIx&lDZ^92{?Q=?=mOdknLHO0?8JymfIs>t2=%`q2 zAW;e&Sir@rk)rXaFuh3d01H>T!X#P%Td6%l7|-;-@wj6*Lw*4l~6 z8Nvwj4{iuJLrE03QU`8Zyl3HSUlC%|yfwAQu6x0oFMrlA>~KuP{w>ycGdNm5KJgI4 z(jNzn)Ye2tz7NrBPJnn2fHN258V&eloVo~<6tW`3{n=mq{yY-3`m_t}H-F6|i3k2b zq#B~Rcx{q7kU7;H(7JTVFGp4o4GfJ@z9o?*1`YZ~lK9X?Pvpp=&N^bsyB!k6_fnEarVMO<>O0o@(v)M&Jw@@liCvadBWA} zgx=Cbwj~(hHxeNwe82z!Pr~2p2s2kmMF&e2mxOP@fj$U1hW97IR!gz+Z{k5Y>__{# zy&}iQ@c+oXMQS-)Zr6O#d60BmP*m=m8gmXGc4&|#)$o)oS|l{>6jWn0st-x~XNDnxZaVU+6)4g~~QU7W;bB72uIo z&Ox^XOG+TZlw~NIce6S%ErP_dCFLUYc%K1Y7Zb8-p=m8VF^*+gZ_0oZhqi3tn$#r` zL9})_yXomxZVRCZD+{QIErrJ6)7_COCCJH>@u&Uc=q0ix-b`lg#`UuNyRaCFP-@BC zZNULipn0>}?@Rw5`?lkUEyb%={X!RMwRe|sd4Wwu zxLkN|4?}lOqT@Yi>nm)lwNF-h`0adRp)PYu&)aL?XZUK#a`I`sngicxM|QYPi>YPf zpml=eqf%-GteBCK2zsQetFkxMt^IFN)=I<(V+0{lEu|*jW`5ZV0LeSaR^PHrz%f3G zV~RUE2t*C#?;hzLi_g5aJ1r@8MMA>JTEp+5`fr;bE}&LeG?h>ye}5q$xrP=Zw>v zM#`Lx)=!vRCNl;p)2MT+v_O2|tWaC-Pz?`;xmdaP)32eDMB5g)!0p}GgSBRt!8KWN z8}ihj1ehgPVN33g!L<%U8(u{%xf)t@kwRuf1z0!`A=;SBa-cRL`M zp3}_|&*#jJ&l1~j)`iQSK;R2FastwQ=3dy1rnlO})_;gL=gmNQ5)|SUxC#keyYMR6 z4q5E2vG+|W-JgqA7SRzobm?lSF@fm4J^V{GZ2XQ8N!(>0>n!rzaR2&y$D@!9kiv;? zZLnX@O5*9Qnrl_oYm~KQx#@Zqa^7WYu7j7{(tX^dYOceVo`<4=O3!sR^@8&Aj&_gc z?T2W*&(~=_z|3~-5^ER6>=LhAN1utCBNDICWWyp(pT|lD1|Qz-*zvwZ-e@!8fu1r_!CP@QqB$h%V|3i(17a`*+85qBO zKI~xa2y#HvM!Ra|A3L0Tw;;$s_aj`FdSePT+xbnUEqaRi5;3gg1B8U3*h_MfA7p5pUVb3^346AXrtXP?O1%!A=GV?w7<_ZtsaSkosXL}2pk9fX> zRsrYO*}`5nj8ar)!#!8DZxL68b)~ZBn0rU9@}7kKmI$h+_z}K+ z#z#s*A0e19XrC^DT9uqpl2Zs>J4@ysEkB(1I=A+X>@BS8jn}i*zk6CoJ&zC0+Z14! zBO6**86l+XfogvFm=nA}s*LBakrRd7*Rc1<31Z7bU(9=z%0n&jtCfz8GeSXHEw>P~ ze?uAVoncKQtE82q#yBN%0AjA43Ws*mt(H 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 literal 0 HcmV?d00001 diff --git a/src/addon.json b/src/addon.json index ec0488d..dd0d064 100755 --- a/src/addon.json +++ b/src/addon.json @@ -3,7 +3,7 @@ "type": "plugin", "name": "Spine", "id": "Gritsenko_Spine", - "version": "1.55.1", + "version": "2.0.0", "author": "Mikal and Igor Gritsenko", "website": "https://gritsenko.github.io/c3_spine_plugin", "documentation": "https://gritsenko.github.io/c3_spine_plugin", diff --git a/src/c3runtime/instance.js b/src/c3runtime/instance.js index 081ae63..1e9963f 100644 --- a/src/c3runtime/instance.js +++ b/src/c3runtime/instance.js @@ -134,7 +134,7 @@ this.initSpineInProgress = true; // Init Spine elements // @ts-ignore - this.mvp = new spine.webgl.Matrix4(); + this.mvp = new spine.Matrix4(); this.mvp.ortho2d(0, 0, 0, 0); // Texture size unknown at this point this.gl = this.runtime.GetWebGLRenderer()._gl; this.canvas = this.gl._canvas; @@ -172,24 +172,20 @@ async loadSkeletonTextures() { - // @ts-ignore - this.sdkType._assetManager = new spine.SharedAssetManager(); - this.sdkType._assetTag = this.uid; - const assetManager = this.sdkType._assetManager; - const assetTag = this.sdkType._assetTag; const gl = this.gl; + let context = new spine.ManagedWebGLRenderingContext(this.gl); + this.sdkType._assetManager = new spine.AssetManager(context); + const assetManager = this.sdkType._assetManager; // @ts-ignore if (this.debug) console.info(this.GetInstance().GetUID(),'[Spine] Loading skeleton, textures, json, atlas'); - // Only load textures once for creation of skeletonData, not for each instance - // Disable PMA when loading Spine textures // @ts-ignore - spine.webgl.GLTexture.DISABLE_UNPACK_PREMULTIPLIED_ALPHA_WEBGL = true; + spine.GLTexture.DISABLE_UNPACK_PREMULTIPLIED_ALPHA_WEBGL = true; - // Path translation for json and atlast (1:1) + // Path translation for json and atlas (1:1) if (this.runtime.IsPreview() || this.runtime._assetManager._isCordova) { - this.atlasURI = '*await-atlas-path*' + this.atlasURI = '*await-atlas-path*' // For debug of not getting path this.atlasURI = await this.runtime._assetManager.GetProjectFileUrl(this.atlasPath); this.jsonURI = await this.runtime._assetManager.GetProjectFileUrl(this.jsonPath); } else @@ -204,26 +200,21 @@ this.sdkType._assetPaths[this.jsonURI] = this.jsonURI; this.sdkType._assetPaths[this.jsonPath] = this.jsonURI; - assetManager.loadJson(assetTag, this.jsonURI); - // @ts-ignore - let textureLoader = function(img) { return new spine.webgl.GLTexture(gl, img); }; - - // Load multiple textures and set up path translation (for C3 preview with 'blob' URIs) + assetManager.loadText(this.jsonURI); + + // Create texture translation dictionary and set up path translation (for C3 preview with 'blob' URIs) let assetPaths = this.pngPath.split(","); for(let i=0;i 0) + lastTime %= this.duration; + } + var timelines = this.timelines; + for (var i = 0, n = timelines.length; i < n; i++) + timelines[i].apply(skeleton, lastTime, time, events, alpha, blend, direction); + }; + Animation.binarySearch = function (values, target, step) { + if (step === void 0) { step = 1; } + var low = 0; + var high = values.length / step - 2; + if (high == 0) + return step; + var 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; + } + }; + Animation.linearSearch = function (values, target, step) { + for (var i = 0, last = values.length - step; i <= last; i += step) + if (values[i] > target) + return i; + return -1; + }; + return Animation; + }()); + spine.Animation = Animation; + var MixBlend; + (function (MixBlend) { + MixBlend[MixBlend["setup"] = 0] = "setup"; + MixBlend[MixBlend["first"] = 1] = "first"; + MixBlend[MixBlend["replace"] = 2] = "replace"; + MixBlend[MixBlend["add"] = 3] = "add"; + })(MixBlend = spine.MixBlend || (spine.MixBlend = {})); + var MixDirection; + (function (MixDirection) { + MixDirection[MixDirection["mixIn"] = 0] = "mixIn"; + MixDirection[MixDirection["mixOut"] = 1] = "mixOut"; + })(MixDirection = spine.MixDirection || (spine.MixDirection = {})); + var TimelineType; + (function (TimelineType) { + TimelineType[TimelineType["rotate"] = 0] = "rotate"; + TimelineType[TimelineType["translate"] = 1] = "translate"; + TimelineType[TimelineType["scale"] = 2] = "scale"; + TimelineType[TimelineType["shear"] = 3] = "shear"; + TimelineType[TimelineType["attachment"] = 4] = "attachment"; + TimelineType[TimelineType["color"] = 5] = "color"; + TimelineType[TimelineType["deform"] = 6] = "deform"; + TimelineType[TimelineType["event"] = 7] = "event"; + TimelineType[TimelineType["drawOrder"] = 8] = "drawOrder"; + TimelineType[TimelineType["ikConstraint"] = 9] = "ikConstraint"; + TimelineType[TimelineType["transformConstraint"] = 10] = "transformConstraint"; + TimelineType[TimelineType["pathConstraintPosition"] = 11] = "pathConstraintPosition"; + TimelineType[TimelineType["pathConstraintSpacing"] = 12] = "pathConstraintSpacing"; + TimelineType[TimelineType["pathConstraintMix"] = 13] = "pathConstraintMix"; + TimelineType[TimelineType["twoColor"] = 14] = "twoColor"; + })(TimelineType = spine.TimelineType || (spine.TimelineType = {})); + var CurveTimeline = (function () { + function CurveTimeline(frameCount) { + if (frameCount <= 0) + throw new Error("frameCount must be > 0: " + frameCount); + this.curves = spine.Utils.newFloatArray((frameCount - 1) * CurveTimeline.BEZIER_SIZE); + } + CurveTimeline.prototype.getFrameCount = function () { + return this.curves.length / CurveTimeline.BEZIER_SIZE + 1; + }; + CurveTimeline.prototype.setLinear = function (frameIndex) { + this.curves[frameIndex * CurveTimeline.BEZIER_SIZE] = CurveTimeline.LINEAR; + }; + CurveTimeline.prototype.setStepped = function (frameIndex) { + this.curves[frameIndex * CurveTimeline.BEZIER_SIZE] = CurveTimeline.STEPPED; + }; + CurveTimeline.prototype.getCurveType = function (frameIndex) { + var index = frameIndex * CurveTimeline.BEZIER_SIZE; + if (index == this.curves.length) + return CurveTimeline.LINEAR; + var type = this.curves[index]; + if (type == CurveTimeline.LINEAR) + return CurveTimeline.LINEAR; + if (type == CurveTimeline.STEPPED) + return CurveTimeline.STEPPED; + return CurveTimeline.BEZIER; + }; + CurveTimeline.prototype.setCurve = function (frameIndex, cx1, cy1, cx2, cy2) { + var tmpx = (-cx1 * 2 + cx2) * 0.03, tmpy = (-cy1 * 2 + cy2) * 0.03; + var dddfx = ((cx1 - cx2) * 3 + 1) * 0.006, dddfy = ((cy1 - cy2) * 3 + 1) * 0.006; + var ddfx = tmpx * 2 + dddfx, ddfy = tmpy * 2 + dddfy; + var dfx = cx1 * 0.3 + tmpx + dddfx * 0.16666667, dfy = cy1 * 0.3 + tmpy + dddfy * 0.16666667; + var i = frameIndex * CurveTimeline.BEZIER_SIZE; + var curves = this.curves; + curves[i++] = CurveTimeline.BEZIER; + var x = dfx, y = dfy; + for (var 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; + } + }; + CurveTimeline.prototype.getCurvePercent = function (frameIndex, percent) { + percent = spine.MathUtils.clamp(percent, 0, 1); + var curves = this.curves; + var i = frameIndex * CurveTimeline.BEZIER_SIZE; + var type = curves[i]; + if (type == CurveTimeline.LINEAR) + return percent; + if (type == CurveTimeline.STEPPED) + return 0; + i++; + var x = 0; + for (var start = i, n = i + CurveTimeline.BEZIER_SIZE - 1; i < n; i += 2) { + x = curves[i]; + if (x >= percent) { + var prevX = void 0, prevY = void 0; + 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); + } + } + var y = curves[i - 1]; + return y + (1 - y) * (percent - x) / (1 - x); + }; + CurveTimeline.LINEAR = 0; + CurveTimeline.STEPPED = 1; + CurveTimeline.BEZIER = 2; + CurveTimeline.BEZIER_SIZE = 10 * 2 - 1; + return CurveTimeline; + }()); + spine.CurveTimeline = CurveTimeline; + var RotateTimeline = (function (_super) { + __extends(RotateTimeline, _super); + function RotateTimeline(frameCount) { + var _this = _super.call(this, frameCount) || this; + _this.frames = spine.Utils.newFloatArray(frameCount << 1); + return _this; + } + RotateTimeline.prototype.getPropertyId = function () { + return (TimelineType.rotate << 24) + this.boneIndex; + }; + RotateTimeline.prototype.setFrame = function (frameIndex, time, degrees) { + frameIndex <<= 1; + this.frames[frameIndex] = time; + this.frames[frameIndex + RotateTimeline.ROTATION] = degrees; + }; + RotateTimeline.prototype.apply = function (skeleton, lastTime, time, events, alpha, blend, direction) { + var frames = this.frames; + var 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: + var r_1 = bone.data.rotation - bone.rotation; + bone.rotation += (r_1 - (16384 - ((16384.499999999996 - r_1 / 360) | 0)) * 360) * alpha; + } + return; + } + if (time >= frames[frames.length - RotateTimeline.ENTRIES]) { + var r_2 = frames[frames.length + RotateTimeline.PREV_ROTATION]; + switch (blend) { + case MixBlend.setup: + bone.rotation = bone.data.rotation + r_2 * alpha; + break; + case MixBlend.first: + case MixBlend.replace: + r_2 += bone.data.rotation - bone.rotation; + r_2 -= (16384 - ((16384.499999999996 - r_2 / 360) | 0)) * 360; + case MixBlend.add: + bone.rotation += r_2 * alpha; + } + return; + } + var frame = Animation.binarySearch(frames, time, RotateTimeline.ENTRIES); + var prevRotation = frames[frame + RotateTimeline.PREV_ROTATION]; + var frameTime = frames[frame]; + var percent = this.getCurvePercent((frame >> 1) - 1, 1 - (time - frameTime) / (frames[frame + RotateTimeline.PREV_TIME] - frameTime)); + var 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.ENTRIES = 2; + RotateTimeline.PREV_TIME = -2; + RotateTimeline.PREV_ROTATION = -1; + RotateTimeline.ROTATION = 1; + return RotateTimeline; + }(CurveTimeline)); + spine.RotateTimeline = RotateTimeline; + var TranslateTimeline = (function (_super) { + __extends(TranslateTimeline, _super); + function TranslateTimeline(frameCount) { + var _this = _super.call(this, frameCount) || this; + _this.frames = spine.Utils.newFloatArray(frameCount * TranslateTimeline.ENTRIES); + return _this; + } + TranslateTimeline.prototype.getPropertyId = function () { + return (TimelineType.translate << 24) + this.boneIndex; + }; + TranslateTimeline.prototype.setFrame = function (frameIndex, time, x, y) { + frameIndex *= TranslateTimeline.ENTRIES; + this.frames[frameIndex] = time; + this.frames[frameIndex + TranslateTimeline.X] = x; + this.frames[frameIndex + TranslateTimeline.Y] = y; + }; + TranslateTimeline.prototype.apply = function (skeleton, lastTime, time, events, alpha, blend, direction) { + var frames = this.frames; + var 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; + } + var x = 0, y = 0; + if (time >= frames[frames.length - TranslateTimeline.ENTRIES]) { + x = frames[frames.length + TranslateTimeline.PREV_X]; + y = frames[frames.length + TranslateTimeline.PREV_Y]; + } + else { + var frame = Animation.binarySearch(frames, time, TranslateTimeline.ENTRIES); + x = frames[frame + TranslateTimeline.PREV_X]; + y = frames[frame + TranslateTimeline.PREV_Y]; + var frameTime = frames[frame]; + var 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.ENTRIES = 3; + TranslateTimeline.PREV_TIME = -3; + TranslateTimeline.PREV_X = -2; + TranslateTimeline.PREV_Y = -1; + TranslateTimeline.X = 1; + TranslateTimeline.Y = 2; + return TranslateTimeline; + }(CurveTimeline)); + spine.TranslateTimeline = TranslateTimeline; + var ScaleTimeline = (function (_super) { + __extends(ScaleTimeline, _super); + function ScaleTimeline(frameCount) { + return _super.call(this, frameCount) || this; + } + ScaleTimeline.prototype.getPropertyId = function () { + return (TimelineType.scale << 24) + this.boneIndex; + }; + ScaleTimeline.prototype.apply = function (skeleton, lastTime, time, events, alpha, blend, direction) { + var frames = this.frames; + var 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; + } + var x = 0, y = 0; + if (time >= frames[frames.length - ScaleTimeline.ENTRIES]) { + x = frames[frames.length + ScaleTimeline.PREV_X] * bone.data.scaleX; + y = frames[frames.length + ScaleTimeline.PREV_Y] * bone.data.scaleY; + } + else { + var frame = Animation.binarySearch(frames, time, ScaleTimeline.ENTRIES); + x = frames[frame + ScaleTimeline.PREV_X]; + y = frames[frame + ScaleTimeline.PREV_Y]; + var frameTime = frames[frame]; + var 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 { + var 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) * spine.MathUtils.signum(bx) - bx) * alpha; + bone.scaleY = by + (Math.abs(y) * spine.MathUtils.signum(by) - by) * alpha; + break; + case MixBlend.first: + case MixBlend.replace: + bx = bone.scaleX; + by = bone.scaleY; + bone.scaleX = bx + (Math.abs(x) * spine.MathUtils.signum(bx) - bx) * alpha; + bone.scaleY = by + (Math.abs(y) * spine.MathUtils.signum(by) - by) * alpha; + break; + case MixBlend.add: + bx = bone.scaleX; + by = bone.scaleY; + bone.scaleX = bx + (Math.abs(x) * spine.MathUtils.signum(bx) - bone.data.scaleX) * alpha; + bone.scaleY = by + (Math.abs(y) * spine.MathUtils.signum(by) - bone.data.scaleY) * alpha; + } + } + else { + switch (blend) { + case MixBlend.setup: + bx = Math.abs(bone.data.scaleX) * spine.MathUtils.signum(x); + by = Math.abs(bone.data.scaleY) * spine.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) * spine.MathUtils.signum(x); + by = Math.abs(bone.scaleY) * spine.MathUtils.signum(y); + bone.scaleX = bx + (x - bx) * alpha; + bone.scaleY = by + (y - by) * alpha; + break; + case MixBlend.add: + bx = spine.MathUtils.signum(x); + by = spine.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; + } + } + } + }; + return ScaleTimeline; + }(TranslateTimeline)); + spine.ScaleTimeline = ScaleTimeline; + var ShearTimeline = (function (_super) { + __extends(ShearTimeline, _super); + function ShearTimeline(frameCount) { + return _super.call(this, frameCount) || this; + } + ShearTimeline.prototype.getPropertyId = function () { + return (TimelineType.shear << 24) + this.boneIndex; + }; + ShearTimeline.prototype.apply = function (skeleton, lastTime, time, events, alpha, blend, direction) { + var frames = this.frames; + var 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; + } + var x = 0, y = 0; + if (time >= frames[frames.length - ShearTimeline.ENTRIES]) { + x = frames[frames.length + ShearTimeline.PREV_X]; + y = frames[frames.length + ShearTimeline.PREV_Y]; + } + else { + var frame = Animation.binarySearch(frames, time, ShearTimeline.ENTRIES); + x = frames[frame + ShearTimeline.PREV_X]; + y = frames[frame + ShearTimeline.PREV_Y]; + var frameTime = frames[frame]; + var 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; + } + }; + return ShearTimeline; + }(TranslateTimeline)); + spine.ShearTimeline = ShearTimeline; + var ColorTimeline = (function (_super) { + __extends(ColorTimeline, _super); + function ColorTimeline(frameCount) { + var _this = _super.call(this, frameCount) || this; + _this.frames = spine.Utils.newFloatArray(frameCount * ColorTimeline.ENTRIES); + return _this; + } + ColorTimeline.prototype.getPropertyId = function () { + return (TimelineType.color << 24) + this.slotIndex; + }; + ColorTimeline.prototype.setFrame = function (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; + }; + ColorTimeline.prototype.apply = function (skeleton, lastTime, time, events, alpha, blend, direction) { + var slot = skeleton.slots[this.slotIndex]; + if (!slot.bone.active) + return; + var frames = this.frames; + if (time < frames[0]) { + switch (blend) { + case MixBlend.setup: + slot.color.setFromColor(slot.data.color); + return; + case MixBlend.first: + var 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; + } + var r = 0, g = 0, b = 0, a = 0; + if (time >= frames[frames.length - ColorTimeline.ENTRIES]) { + var 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 { + var 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]; + var frameTime = frames[frame]; + var 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 { + var 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.ENTRIES = 5; + ColorTimeline.PREV_TIME = -5; + ColorTimeline.PREV_R = -4; + ColorTimeline.PREV_G = -3; + ColorTimeline.PREV_B = -2; + ColorTimeline.PREV_A = -1; + ColorTimeline.R = 1; + ColorTimeline.G = 2; + ColorTimeline.B = 3; + ColorTimeline.A = 4; + return ColorTimeline; + }(CurveTimeline)); + spine.ColorTimeline = ColorTimeline; + var TwoColorTimeline = (function (_super) { + __extends(TwoColorTimeline, _super); + function TwoColorTimeline(frameCount) { + var _this = _super.call(this, frameCount) || this; + _this.frames = spine.Utils.newFloatArray(frameCount * TwoColorTimeline.ENTRIES); + return _this; + } + TwoColorTimeline.prototype.getPropertyId = function () { + return (TimelineType.twoColor << 24) + this.slotIndex; + }; + TwoColorTimeline.prototype.setFrame = function (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; + }; + TwoColorTimeline.prototype.apply = function (skeleton, lastTime, time, events, alpha, blend, direction) { + var slot = skeleton.slots[this.slotIndex]; + if (!slot.bone.active) + return; + var 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: + var 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; + } + var r = 0, g = 0, b = 0, a = 0, r2 = 0, g2 = 0, b2 = 0; + if (time >= frames[frames.length - TwoColorTimeline.ENTRIES]) { + var 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 { + var 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]; + var frameTime = frames[frame]; + var 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 { + var 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.ENTRIES = 8; + TwoColorTimeline.PREV_TIME = -8; + TwoColorTimeline.PREV_R = -7; + TwoColorTimeline.PREV_G = -6; + TwoColorTimeline.PREV_B = -5; + TwoColorTimeline.PREV_A = -4; + TwoColorTimeline.PREV_R2 = -3; + TwoColorTimeline.PREV_G2 = -2; + TwoColorTimeline.PREV_B2 = -1; + TwoColorTimeline.R = 1; + TwoColorTimeline.G = 2; + TwoColorTimeline.B = 3; + TwoColorTimeline.A = 4; + TwoColorTimeline.R2 = 5; + TwoColorTimeline.G2 = 6; + TwoColorTimeline.B2 = 7; + return TwoColorTimeline; + }(CurveTimeline)); + spine.TwoColorTimeline = TwoColorTimeline; + var AttachmentTimeline = (function () { + function AttachmentTimeline(frameCount) { + this.frames = spine.Utils.newFloatArray(frameCount); + this.attachmentNames = new Array(frameCount); + } + AttachmentTimeline.prototype.getPropertyId = function () { + return (TimelineType.attachment << 24) + this.slotIndex; + }; + AttachmentTimeline.prototype.getFrameCount = function () { + return this.frames.length; + }; + AttachmentTimeline.prototype.setFrame = function (frameIndex, time, attachmentName) { + this.frames[frameIndex] = time; + this.attachmentNames[frameIndex] = attachmentName; + }; + AttachmentTimeline.prototype.apply = function (skeleton, lastTime, time, events, alpha, blend, direction) { + var 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; + } + var frames = this.frames; + if (time < frames[0]) { + if (blend == MixBlend.setup || blend == MixBlend.first) + this.setAttachment(skeleton, slot, slot.data.attachmentName); + return; + } + var frameIndex = 0; + if (time >= frames[frames.length - 1]) + frameIndex = frames.length - 1; + else + frameIndex = Animation.binarySearch(frames, time, 1) - 1; + var attachmentName = this.attachmentNames[frameIndex]; + skeleton.slots[this.slotIndex] + .setAttachment(attachmentName == null ? null : skeleton.getAttachment(this.slotIndex, attachmentName)); + }; + AttachmentTimeline.prototype.setAttachment = function (skeleton, slot, attachmentName) { + slot.attachment = attachmentName == null ? null : skeleton.getAttachment(this.slotIndex, attachmentName); + }; + return AttachmentTimeline; + }()); + spine.AttachmentTimeline = AttachmentTimeline; + var zeros = null; + var DeformTimeline = (function (_super) { + __extends(DeformTimeline, _super); + function DeformTimeline(frameCount) { + var _this = _super.call(this, frameCount) || this; + _this.frames = spine.Utils.newFloatArray(frameCount); + _this.frameVertices = new Array(frameCount); + if (zeros == null) + zeros = spine.Utils.newFloatArray(64); + return _this; + } + DeformTimeline.prototype.getPropertyId = function () { + return (TimelineType.deform << 27) + +this.attachment.id + this.slotIndex; + }; + DeformTimeline.prototype.setFrame = function (frameIndex, time, vertices) { + this.frames[frameIndex] = time; + this.frameVertices[frameIndex] = vertices; + }; + DeformTimeline.prototype.apply = function (skeleton, lastTime, time, firedEvents, alpha, blend, direction) { + var slot = skeleton.slots[this.slotIndex]; + if (!slot.bone.active) + return; + var slotAttachment = slot.getAttachment(); + if (!(slotAttachment instanceof spine.VertexAttachment) || !(slotAttachment.deformAttachment == this.attachment)) + return; + var deformArray = slot.deform; + if (deformArray.length == 0) + blend = MixBlend.setup; + var frameVertices = this.frameVertices; + var vertexCount = frameVertices[0].length; + var frames = this.frames; + if (time < frames[0]) { + var vertexAttachment = slotAttachment; + switch (blend) { + case MixBlend.setup: + deformArray.length = 0; + return; + case MixBlend.first: + if (alpha == 1) { + deformArray.length = 0; + break; + } + var deform_1 = spine.Utils.setArraySize(deformArray, vertexCount); + if (vertexAttachment.bones == null) { + var setupVertices = vertexAttachment.vertices; + for (var i = 0; i < vertexCount; i++) + deform_1[i] += (setupVertices[i] - deform_1[i]) * alpha; + } + else { + alpha = 1 - alpha; + for (var i = 0; i < vertexCount; i++) + deform_1[i] *= alpha; + } + } + return; + } + var deform = spine.Utils.setArraySize(deformArray, vertexCount); + if (time >= frames[frames.length - 1]) { + var lastVertices = frameVertices[frames.length - 1]; + if (alpha == 1) { + if (blend == MixBlend.add) { + var vertexAttachment = slotAttachment; + if (vertexAttachment.bones == null) { + var setupVertices = vertexAttachment.vertices; + for (var i_1 = 0; i_1 < vertexCount; i_1++) { + deform[i_1] += lastVertices[i_1] - setupVertices[i_1]; + } + } + else { + for (var i_2 = 0; i_2 < vertexCount; i_2++) + deform[i_2] += lastVertices[i_2]; + } + } + else { + spine.Utils.arrayCopy(lastVertices, 0, deform, 0, vertexCount); + } + } + else { + switch (blend) { + case MixBlend.setup: { + var vertexAttachment_1 = slotAttachment; + if (vertexAttachment_1.bones == null) { + var setupVertices = vertexAttachment_1.vertices; + for (var i_3 = 0; i_3 < vertexCount; i_3++) { + var setup = setupVertices[i_3]; + deform[i_3] = setup + (lastVertices[i_3] - setup) * alpha; + } + } + else { + for (var i_4 = 0; i_4 < vertexCount; i_4++) + deform[i_4] = lastVertices[i_4] * alpha; + } + break; + } + case MixBlend.first: + case MixBlend.replace: + for (var i_5 = 0; i_5 < vertexCount; i_5++) + deform[i_5] += (lastVertices[i_5] - deform[i_5]) * alpha; + break; + case MixBlend.add: + var vertexAttachment = slotAttachment; + if (vertexAttachment.bones == null) { + var setupVertices = vertexAttachment.vertices; + for (var i_6 = 0; i_6 < vertexCount; i_6++) { + deform[i_6] += (lastVertices[i_6] - setupVertices[i_6]) * alpha; + } + } + else { + for (var i_7 = 0; i_7 < vertexCount; i_7++) + deform[i_7] += lastVertices[i_7] * alpha; + } + } + } + return; + } + var frame = Animation.binarySearch(frames, time); + var prevVertices = frameVertices[frame - 1]; + var nextVertices = frameVertices[frame]; + var frameTime = frames[frame]; + var percent = this.getCurvePercent(frame - 1, 1 - (time - frameTime) / (frames[frame - 1] - frameTime)); + if (alpha == 1) { + if (blend == MixBlend.add) { + var vertexAttachment = slotAttachment; + if (vertexAttachment.bones == null) { + var setupVertices = vertexAttachment.vertices; + for (var i_8 = 0; i_8 < vertexCount; i_8++) { + var prev = prevVertices[i_8]; + deform[i_8] += prev + (nextVertices[i_8] - prev) * percent - setupVertices[i_8]; + } + } + else { + for (var i_9 = 0; i_9 < vertexCount; i_9++) { + var prev = prevVertices[i_9]; + deform[i_9] += prev + (nextVertices[i_9] - prev) * percent; + } + } + } + else { + for (var i_10 = 0; i_10 < vertexCount; i_10++) { + var prev = prevVertices[i_10]; + deform[i_10] = prev + (nextVertices[i_10] - prev) * percent; + } + } + } + else { + switch (blend) { + case MixBlend.setup: { + var vertexAttachment_2 = slotAttachment; + if (vertexAttachment_2.bones == null) { + var setupVertices = vertexAttachment_2.vertices; + for (var i_11 = 0; i_11 < vertexCount; i_11++) { + var prev = prevVertices[i_11], setup = setupVertices[i_11]; + deform[i_11] = setup + (prev + (nextVertices[i_11] - prev) * percent - setup) * alpha; + } + } + else { + for (var i_12 = 0; i_12 < vertexCount; i_12++) { + var prev = prevVertices[i_12]; + deform[i_12] = (prev + (nextVertices[i_12] - prev) * percent) * alpha; + } + } + break; + } + case MixBlend.first: + case MixBlend.replace: + for (var i_13 = 0; i_13 < vertexCount; i_13++) { + var prev = prevVertices[i_13]; + deform[i_13] += (prev + (nextVertices[i_13] - prev) * percent - deform[i_13]) * alpha; + } + break; + case MixBlend.add: + var vertexAttachment = slotAttachment; + if (vertexAttachment.bones == null) { + var setupVertices = vertexAttachment.vertices; + for (var i_14 = 0; i_14 < vertexCount; i_14++) { + var prev = prevVertices[i_14]; + deform[i_14] += (prev + (nextVertices[i_14] - prev) * percent - setupVertices[i_14]) * alpha; + } + } + else { + for (var i_15 = 0; i_15 < vertexCount; i_15++) { + var prev = prevVertices[i_15]; + deform[i_15] += (prev + (nextVertices[i_15] - prev) * percent) * alpha; + } + } + } + } + }; + return DeformTimeline; + }(CurveTimeline)); + spine.DeformTimeline = DeformTimeline; + var EventTimeline = (function () { + function EventTimeline(frameCount) { + this.frames = spine.Utils.newFloatArray(frameCount); + this.events = new Array(frameCount); + } + EventTimeline.prototype.getPropertyId = function () { + return TimelineType.event << 24; + }; + EventTimeline.prototype.getFrameCount = function () { + return this.frames.length; + }; + EventTimeline.prototype.setFrame = function (frameIndex, event) { + this.frames[frameIndex] = event.time; + this.events[frameIndex] = event; + }; + EventTimeline.prototype.apply = function (skeleton, lastTime, time, firedEvents, alpha, blend, direction) { + if (firedEvents == null) + return; + var frames = this.frames; + var frameCount = this.frames.length; + if (lastTime > time) { + this.apply(skeleton, lastTime, Number.MAX_VALUE, firedEvents, alpha, blend, direction); + lastTime = -1; + } + else if (lastTime >= frames[frameCount - 1]) + return; + if (time < frames[0]) + return; + var frame = 0; + if (lastTime < frames[0]) + frame = 0; + else { + frame = Animation.binarySearch(frames, lastTime); + var frameTime = frames[frame]; + while (frame > 0) { + if (frames[frame - 1] != frameTime) + break; + frame--; + } + } + for (; frame < frameCount && time >= frames[frame]; frame++) + firedEvents.push(this.events[frame]); + }; + return EventTimeline; + }()); + spine.EventTimeline = EventTimeline; + var DrawOrderTimeline = (function () { + function DrawOrderTimeline(frameCount) { + this.frames = spine.Utils.newFloatArray(frameCount); + this.drawOrders = new Array(frameCount); + } + DrawOrderTimeline.prototype.getPropertyId = function () { + return TimelineType.drawOrder << 24; + }; + DrawOrderTimeline.prototype.getFrameCount = function () { + return this.frames.length; + }; + DrawOrderTimeline.prototype.setFrame = function (frameIndex, time, drawOrder) { + this.frames[frameIndex] = time; + this.drawOrders[frameIndex] = drawOrder; + }; + DrawOrderTimeline.prototype.apply = function (skeleton, lastTime, time, firedEvents, alpha, blend, direction) { + var drawOrder = skeleton.drawOrder; + var slots = skeleton.slots; + if (direction == MixDirection.mixOut) { + if (blend == MixBlend.setup) + spine.Utils.arrayCopy(skeleton.slots, 0, skeleton.drawOrder, 0, skeleton.slots.length); + return; + } + var frames = this.frames; + if (time < frames[0]) { + if (blend == MixBlend.setup || blend == MixBlend.first) + spine.Utils.arrayCopy(skeleton.slots, 0, skeleton.drawOrder, 0, skeleton.slots.length); + return; + } + var frame = 0; + if (time >= frames[frames.length - 1]) + frame = frames.length - 1; + else + frame = Animation.binarySearch(frames, time) - 1; + var drawOrderToSetupIndex = this.drawOrders[frame]; + if (drawOrderToSetupIndex == null) + spine.Utils.arrayCopy(slots, 0, drawOrder, 0, slots.length); + else { + for (var i = 0, n = drawOrderToSetupIndex.length; i < n; i++) + drawOrder[i] = slots[drawOrderToSetupIndex[i]]; + } + }; + return DrawOrderTimeline; + }()); + spine.DrawOrderTimeline = DrawOrderTimeline; + var IkConstraintTimeline = (function (_super) { + __extends(IkConstraintTimeline, _super); + function IkConstraintTimeline(frameCount) { + var _this = _super.call(this, frameCount) || this; + _this.frames = spine.Utils.newFloatArray(frameCount * IkConstraintTimeline.ENTRIES); + return _this; + } + IkConstraintTimeline.prototype.getPropertyId = function () { + return (TimelineType.ikConstraint << 24) + this.ikConstraintIndex; + }; + IkConstraintTimeline.prototype.setFrame = function (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; + }; + IkConstraintTimeline.prototype.apply = function (skeleton, lastTime, time, firedEvents, alpha, blend, direction) { + var frames = this.frames; + var 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]) { + 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; + } + var frame = Animation.binarySearch(frames, time, IkConstraintTimeline.ENTRIES); + var mix = frames[frame + IkConstraintTimeline.PREV_MIX]; + var softness = frames[frame + IkConstraintTimeline.PREV_SOFTNESS]; + var frameTime = frames[frame]; + var 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.ENTRIES = 6; + IkConstraintTimeline.PREV_TIME = -6; + IkConstraintTimeline.PREV_MIX = -5; + IkConstraintTimeline.PREV_SOFTNESS = -4; + IkConstraintTimeline.PREV_BEND_DIRECTION = -3; + IkConstraintTimeline.PREV_COMPRESS = -2; + IkConstraintTimeline.PREV_STRETCH = -1; + IkConstraintTimeline.MIX = 1; + IkConstraintTimeline.SOFTNESS = 2; + IkConstraintTimeline.BEND_DIRECTION = 3; + IkConstraintTimeline.COMPRESS = 4; + IkConstraintTimeline.STRETCH = 5; + return IkConstraintTimeline; + }(CurveTimeline)); + spine.IkConstraintTimeline = IkConstraintTimeline; + var TransformConstraintTimeline = (function (_super) { + __extends(TransformConstraintTimeline, _super); + function TransformConstraintTimeline(frameCount) { + var _this = _super.call(this, frameCount) || this; + _this.frames = spine.Utils.newFloatArray(frameCount * TransformConstraintTimeline.ENTRIES); + return _this; + } + TransformConstraintTimeline.prototype.getPropertyId = function () { + return (TimelineType.transformConstraint << 24) + this.transformConstraintIndex; + }; + TransformConstraintTimeline.prototype.setFrame = function (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; + }; + TransformConstraintTimeline.prototype.apply = function (skeleton, lastTime, time, firedEvents, alpha, blend, direction) { + var frames = this.frames; + var constraint = skeleton.transformConstraints[this.transformConstraintIndex]; + if (!constraint.active) + return; + if (time < frames[0]) { + var 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; + } + var rotate = 0, translate = 0, scale = 0, shear = 0; + if (time >= frames[frames.length - TransformConstraintTimeline.ENTRIES]) { + var 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 { + var 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]; + var frameTime = frames[frame]; + var 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) { + var 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.ENTRIES = 5; + TransformConstraintTimeline.PREV_TIME = -5; + TransformConstraintTimeline.PREV_ROTATE = -4; + TransformConstraintTimeline.PREV_TRANSLATE = -3; + TransformConstraintTimeline.PREV_SCALE = -2; + TransformConstraintTimeline.PREV_SHEAR = -1; + TransformConstraintTimeline.ROTATE = 1; + TransformConstraintTimeline.TRANSLATE = 2; + TransformConstraintTimeline.SCALE = 3; + TransformConstraintTimeline.SHEAR = 4; + return TransformConstraintTimeline; + }(CurveTimeline)); + spine.TransformConstraintTimeline = TransformConstraintTimeline; + var PathConstraintPositionTimeline = (function (_super) { + __extends(PathConstraintPositionTimeline, _super); + function PathConstraintPositionTimeline(frameCount) { + var _this = _super.call(this, frameCount) || this; + _this.frames = spine.Utils.newFloatArray(frameCount * PathConstraintPositionTimeline.ENTRIES); + return _this; + } + PathConstraintPositionTimeline.prototype.getPropertyId = function () { + return (TimelineType.pathConstraintPosition << 24) + this.pathConstraintIndex; + }; + PathConstraintPositionTimeline.prototype.setFrame = function (frameIndex, time, value) { + frameIndex *= PathConstraintPositionTimeline.ENTRIES; + this.frames[frameIndex] = time; + this.frames[frameIndex + PathConstraintPositionTimeline.VALUE] = value; + }; + PathConstraintPositionTimeline.prototype.apply = function (skeleton, lastTime, time, firedEvents, alpha, blend, direction) { + var frames = this.frames; + var 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; + } + var position = 0; + if (time >= frames[frames.length - PathConstraintPositionTimeline.ENTRIES]) + position = frames[frames.length + PathConstraintPositionTimeline.PREV_VALUE]; + else { + var frame = Animation.binarySearch(frames, time, PathConstraintPositionTimeline.ENTRIES); + position = frames[frame + PathConstraintPositionTimeline.PREV_VALUE]; + var frameTime = frames[frame]; + var 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.ENTRIES = 2; + PathConstraintPositionTimeline.PREV_TIME = -2; + PathConstraintPositionTimeline.PREV_VALUE = -1; + PathConstraintPositionTimeline.VALUE = 1; + return PathConstraintPositionTimeline; + }(CurveTimeline)); + spine.PathConstraintPositionTimeline = PathConstraintPositionTimeline; + var PathConstraintSpacingTimeline = (function (_super) { + __extends(PathConstraintSpacingTimeline, _super); + function PathConstraintSpacingTimeline(frameCount) { + return _super.call(this, frameCount) || this; + } + PathConstraintSpacingTimeline.prototype.getPropertyId = function () { + return (TimelineType.pathConstraintSpacing << 24) + this.pathConstraintIndex; + }; + PathConstraintSpacingTimeline.prototype.apply = function (skeleton, lastTime, time, firedEvents, alpha, blend, direction) { + var frames = this.frames; + var 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; + } + var spacing = 0; + if (time >= frames[frames.length - PathConstraintSpacingTimeline.ENTRIES]) + spacing = frames[frames.length + PathConstraintSpacingTimeline.PREV_VALUE]; + else { + var frame = Animation.binarySearch(frames, time, PathConstraintSpacingTimeline.ENTRIES); + spacing = frames[frame + PathConstraintSpacingTimeline.PREV_VALUE]; + var frameTime = frames[frame]; + var 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; + }; + return PathConstraintSpacingTimeline; + }(PathConstraintPositionTimeline)); + spine.PathConstraintSpacingTimeline = PathConstraintSpacingTimeline; + var PathConstraintMixTimeline = (function (_super) { + __extends(PathConstraintMixTimeline, _super); + function PathConstraintMixTimeline(frameCount) { + var _this = _super.call(this, frameCount) || this; + _this.frames = spine.Utils.newFloatArray(frameCount * PathConstraintMixTimeline.ENTRIES); + return _this; + } + PathConstraintMixTimeline.prototype.getPropertyId = function () { + return (TimelineType.pathConstraintMix << 24) + this.pathConstraintIndex; + }; + PathConstraintMixTimeline.prototype.setFrame = function (frameIndex, time, rotateMix, translateMix) { + frameIndex *= PathConstraintMixTimeline.ENTRIES; + this.frames[frameIndex] = time; + this.frames[frameIndex + PathConstraintMixTimeline.ROTATE] = rotateMix; + this.frames[frameIndex + PathConstraintMixTimeline.TRANSLATE] = translateMix; + }; + PathConstraintMixTimeline.prototype.apply = function (skeleton, lastTime, time, firedEvents, alpha, blend, direction) { + var frames = this.frames; + var 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; + } + var rotate = 0, translate = 0; + if (time >= frames[frames.length - PathConstraintMixTimeline.ENTRIES]) { + rotate = frames[frames.length + PathConstraintMixTimeline.PREV_ROTATE]; + translate = frames[frames.length + PathConstraintMixTimeline.PREV_TRANSLATE]; + } + else { + var frame = Animation.binarySearch(frames, time, PathConstraintMixTimeline.ENTRIES); + rotate = frames[frame + PathConstraintMixTimeline.PREV_ROTATE]; + translate = frames[frame + PathConstraintMixTimeline.PREV_TRANSLATE]; + var frameTime = frames[frame]; + var 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.ENTRIES = 3; + PathConstraintMixTimeline.PREV_TIME = -3; + PathConstraintMixTimeline.PREV_ROTATE = -2; + PathConstraintMixTimeline.PREV_TRANSLATE = -1; + PathConstraintMixTimeline.ROTATE = 1; + PathConstraintMixTimeline.TRANSLATE = 2; + return PathConstraintMixTimeline; + }(CurveTimeline)); + spine.PathConstraintMixTimeline = PathConstraintMixTimeline; +})(spine || (spine = {})); +var spine; +(function (spine) { + var AnimationState = (function () { + function AnimationState(data) { + this.tracks = new Array(); + this.timeScale = 1; + this.unkeyedState = 0; + this.events = new Array(); + this.listeners = new Array(); + this.queue = new EventQueue(this); + this.propertyIDs = new spine.IntSet(); + this.animationsChanged = false; + this.trackEntryPool = new spine.Pool(function () { return new TrackEntry(); }); + this.data = data; + } + AnimationState.prototype.update = function (delta) { + delta *= this.timeScale; + var tracks = this.tracks; + for (var i = 0, n = tracks.length; i < n; i++) { + var current = tracks[i]; + if (current == null) + continue; + current.animationLast = current.nextAnimationLast; + current.trackLast = current.nextTrackLast; + var currentDelta = delta * current.timeScale; + if (current.delay > 0) { + current.delay -= currentDelta; + if (current.delay > 0) + continue; + currentDelta = -current.delay; + current.delay = 0; + } + var next = current.next; + if (next != null) { + var 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)) { + var 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(); + }; + AnimationState.prototype.updateMixingFrom = function (to, delta) { + var from = to.mixingFrom; + if (from == null) + return true; + var finished = this.updateMixingFrom(from, delta); + from.animationLast = from.nextAnimationLast; + from.trackLast = from.nextTrackLast; + if (to.mixTime > 0 && to.mixTime >= to.mixDuration) { + 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; + }; + AnimationState.prototype.apply = function (skeleton) { + if (skeleton == null) + throw new Error("skeleton cannot be null."); + if (this.animationsChanged) + this._animationsChanged(); + var events = this.events; + var tracks = this.tracks; + var applied = false; + for (var i_16 = 0, n_1 = tracks.length; i_16 < n_1; i_16++) { + var current = tracks[i_16]; + if (current == null || current.delay > 0) + continue; + applied = true; + var blend = i_16 == 0 ? spine.MixBlend.first : current.mixBlend; + var mix = current.alpha; + if (current.mixingFrom != null) + mix *= this.applyMixingFrom(current, skeleton, blend); + else if (current.trackTime >= current.trackEnd && current.next == null) + mix = 0; + var animationLast = current.animationLast, animationTime = current.getAnimationTime(); + var timelineCount = current.animation.timelines.length; + var timelines = current.animation.timelines; + if ((i_16 == 0 && mix == 1) || blend == spine.MixBlend.add) { + for (var ii = 0; ii < timelineCount; ii++) { + spine.Utils.webkit602BugfixHelper(mix, blend); + var timeline = timelines[ii]; + if (timeline instanceof spine.AttachmentTimeline) + this.applyAttachmentTimeline(timeline, skeleton, animationTime, blend, true); + else + timeline.apply(skeleton, animationLast, animationTime, events, mix, blend, spine.MixDirection.mixIn); + } + } + else { + var timelineMode = current.timelineMode; + var firstFrame = current.timelinesRotation.length == 0; + if (firstFrame) + spine.Utils.setArraySize(current.timelinesRotation, timelineCount << 1, null); + var timelinesRotation = current.timelinesRotation; + for (var ii = 0; ii < timelineCount; ii++) { + var timeline_1 = timelines[ii]; + var timelineBlend = timelineMode[ii] == AnimationState.SUBSEQUENT ? blend : spine.MixBlend.setup; + if (timeline_1 instanceof spine.RotateTimeline) { + this.applyRotateTimeline(timeline_1, skeleton, animationTime, mix, timelineBlend, timelinesRotation, ii << 1, firstFrame); + } + else if (timeline_1 instanceof spine.AttachmentTimeline) { + this.applyAttachmentTimeline(timeline_1, skeleton, animationTime, blend, true); + } + else { + spine.Utils.webkit602BugfixHelper(mix, blend); + timeline_1.apply(skeleton, animationLast, animationTime, events, mix, timelineBlend, spine.MixDirection.mixIn); + } + } + } + this.queueEvents(current, animationTime); + events.length = 0; + current.nextAnimationLast = animationTime; + current.nextTrackLast = current.trackTime; + } + 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.attachment = (attachmentName == null ? null : skeleton.getAttachment(slot.data.index, attachmentName)); + } + } + this.unkeyedState += 2; + this.queue.drain(); + return applied; + }; + AnimationState.prototype.applyMixingFrom = function (to, skeleton, blend) { + var from = to.mixingFrom; + if (from.mixingFrom != null) + this.applyMixingFrom(from, skeleton, blend); + var mix = 0; + if (to.mixDuration == 0) { + mix = 1; + if (blend == spine.MixBlend.first) + blend = spine.MixBlend.setup; + } + else { + mix = to.mixTime / to.mixDuration; + if (mix > 1) + mix = 1; + if (blend != spine.MixBlend.first) + blend = from.mixBlend; + } + var events = mix < from.eventThreshold ? this.events : null; + var attachments = mix < from.attachmentThreshold, drawOrder = mix < from.drawOrderThreshold; + var animationLast = from.animationLast, animationTime = from.getAnimationTime(); + var timelineCount = from.animation.timelines.length; + var timelines = from.animation.timelines; + var alphaHold = from.alpha * to.interruptAlpha, alphaMix = alphaHold * (1 - mix); + if (blend == spine.MixBlend.add) { + for (var i = 0; i < timelineCount; i++) + timelines[i].apply(skeleton, animationLast, animationTime, events, alphaMix, blend, spine.MixDirection.mixOut); + } + else { + var timelineMode = from.timelineMode; + var timelineHoldMix = from.timelineHoldMix; + var firstFrame = from.timelinesRotation.length == 0; + if (firstFrame) + spine.Utils.setArraySize(from.timelinesRotation, timelineCount << 1, null); + var timelinesRotation = from.timelinesRotation; + from.totalAlpha = 0; + for (var i = 0; i < timelineCount; i++) { + var timeline = timelines[i]; + var direction = spine.MixDirection.mixOut; + var timelineBlend = void 0; + var alpha = 0; + switch (timelineMode[i]) { + case AnimationState.SUBSEQUENT: + if (!drawOrder && timeline instanceof spine.DrawOrderTimeline) + continue; + timelineBlend = blend; + alpha = alphaMix; + break; + case AnimationState.FIRST: + timelineBlend = spine.MixBlend.setup; + alpha = alphaMix; + break; + case AnimationState.HOLD_SUBSEQUENT: + timelineBlend = blend; + alpha = alphaHold; + break; + case AnimationState.HOLD_FIRST: + timelineBlend = spine.MixBlend.setup; + alpha = alphaHold; + break; + default: + timelineBlend = spine.MixBlend.setup; + var holdMix = timelineHoldMix[i]; + alpha = alphaHold * Math.max(0, 1 - holdMix.mixTime / holdMix.mixDuration); + break; + } + from.totalAlpha += alpha; + if (timeline instanceof spine.RotateTimeline) + this.applyRotateTimeline(timeline, skeleton, animationTime, alpha, timelineBlend, timelinesRotation, i << 1, firstFrame); + else if (timeline instanceof spine.AttachmentTimeline) + this.applyAttachmentTimeline(timeline, skeleton, animationTime, timelineBlend, attachments); + else { + spine.Utils.webkit602BugfixHelper(alpha, blend); + if (drawOrder && timeline instanceof spine.DrawOrderTimeline && timelineBlend == spine.MixBlend.setup) + direction = spine.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; + }; + AnimationState.prototype.applyAttachmentTimeline = function (timeline, skeleton, time, blend, attachments) { + var slot = skeleton.slots[timeline.slotIndex]; + if (!slot.bone.active) + return; + var frames = timeline.frames; + if (time < frames[0]) { + if (blend == spine.MixBlend.setup || blend == spine.MixBlend.first) + this.setAttachment(skeleton, slot, slot.data.attachmentName, attachments); + } + else { + var frameIndex; + if (time >= frames[frames.length - 1]) + frameIndex = frames.length - 1; + else + frameIndex = spine.Animation.binarySearch(frames, time) - 1; + this.setAttachment(skeleton, slot, timeline.attachmentNames[frameIndex], attachments); + } + if (slot.attachmentState <= this.unkeyedState) + slot.attachmentState = this.unkeyedState + AnimationState.SETUP; + }; + AnimationState.prototype.setAttachment = function (skeleton, slot, attachmentName, attachments) { + slot.attachment = attachmentName == null ? null : skeleton.getAttachment(slot.data.index, attachmentName); + if (attachments) + slot.attachmentState = this.unkeyedState + AnimationState.CURRENT; + }; + AnimationState.prototype.applyRotateTimeline = function (timeline, skeleton, time, alpha, blend, timelinesRotation, i, firstFrame) { + if (firstFrame) + timelinesRotation[i] = 0; + if (alpha == 1) { + timeline.apply(skeleton, 0, time, null, 1, blend, spine.MixDirection.mixIn); + return; + } + var rotateTimeline = timeline; + var frames = rotateTimeline.frames; + var bone = skeleton.bones[rotateTimeline.boneIndex]; + if (!bone.active) + return; + var r1 = 0, r2 = 0; + if (time < frames[0]) { + switch (blend) { + case spine.MixBlend.setup: + bone.rotation = bone.data.rotation; + default: + return; + case spine.MixBlend.first: + r1 = bone.rotation; + r2 = bone.data.rotation; + } + } + else { + r1 = blend == spine.MixBlend.setup ? bone.data.rotation : bone.rotation; + if (time >= frames[frames.length - spine.RotateTimeline.ENTRIES]) + r2 = bone.data.rotation + frames[frames.length + spine.RotateTimeline.PREV_ROTATION]; + else { + var frame = spine.Animation.binarySearch(frames, time, spine.RotateTimeline.ENTRIES); + var prevRotation = frames[frame + spine.RotateTimeline.PREV_ROTATION]; + var frameTime = frames[frame]; + var percent = rotateTimeline.getCurvePercent((frame >> 1) - 1, 1 - (time - frameTime) / (frames[frame + spine.RotateTimeline.PREV_TIME] - frameTime)); + r2 = frames[frame + spine.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; + } + } + var total = 0, diff = r2 - r1; + diff -= (16384 - ((16384.499999999996 - diff / 360) | 0)) * 360; + if (diff == 0) { + total = timelinesRotation[i]; + } + else { + var lastTotal = 0, lastDiff = 0; + if (firstFrame) { + lastTotal = 0; + lastDiff = diff; + } + else { + lastTotal = timelinesRotation[i]; + lastDiff = timelinesRotation[i + 1]; + } + var current = diff > 0, dir = lastTotal >= 0; + if (spine.MathUtils.signum(lastDiff) != spine.MathUtils.signum(diff) && Math.abs(lastDiff) <= 90) { + if (Math.abs(lastTotal) > 180) + lastTotal += 360 * spine.MathUtils.signum(lastTotal); + dir = current; + } + total = diff + lastTotal - lastTotal % 360; + if (dir != current) + total += 360 * spine.MathUtils.signum(lastTotal); + timelinesRotation[i] = total; + } + timelinesRotation[i + 1] = diff; + r1 += total * alpha; + bone.rotation = r1 - (16384 - ((16384.499999999996 - r1 / 360) | 0)) * 360; + }; + AnimationState.prototype.queueEvents = function (entry, animationTime) { + var animationStart = entry.animationStart, animationEnd = entry.animationEnd; + var duration = animationEnd - animationStart; + var trackLastWrapped = entry.trackLast % duration; + var events = this.events; + var i = 0, n = events.length; + for (; i < n; i++) { + var event_1 = events[i]; + if (event_1.time < trackLastWrapped) + break; + if (event_1.time > animationEnd) + continue; + this.queue.event(entry, event_1); + } + var 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); + for (; i < n; i++) { + var event_2 = events[i]; + if (event_2.time < animationStart) + continue; + this.queue.event(entry, events[i]); + } + }; + AnimationState.prototype.clearTracks = function () { + var oldDrainDisabled = this.queue.drainDisabled; + this.queue.drainDisabled = true; + for (var i = 0, n = this.tracks.length; i < n; i++) + this.clearTrack(i); + this.tracks.length = 0; + this.queue.drainDisabled = oldDrainDisabled; + this.queue.drain(); + }; + AnimationState.prototype.clearTrack = function (trackIndex) { + if (trackIndex >= this.tracks.length) + return; + var current = this.tracks[trackIndex]; + if (current == null) + return; + this.queue.end(current); + this.disposeNext(current); + var entry = current; + while (true) { + var 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(); + }; + AnimationState.prototype.setCurrent = function (index, current, interrupt) { + var 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; + if (from.mixingFrom != null && from.mixDuration > 0) + current.interruptAlpha *= Math.min(1, from.mixTime / from.mixDuration); + from.timelinesRotation.length = 0; + } + this.queue.start(current); + }; + AnimationState.prototype.setAnimation = function (trackIndex, animationName, loop) { + var animation = this.data.skeletonData.findAnimation(animationName); + if (animation == null) + throw new Error("Animation not found: " + animationName); + return this.setAnimationWith(trackIndex, animation, loop); + }; + AnimationState.prototype.setAnimationWith = function (trackIndex, animation, loop) { + if (animation == null) + throw new Error("animation cannot be null."); + var interrupt = true; + var current = this.expandToIndex(trackIndex); + if (current != null) { + if (current.nextTrackLast == -1) { + 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); + } + var entry = this.trackEntry(trackIndex, animation, loop, current); + this.setCurrent(trackIndex, entry, interrupt); + this.queue.drain(); + return entry; + }; + AnimationState.prototype.addAnimation = function (trackIndex, animationName, loop, delay) { + var animation = this.data.skeletonData.findAnimation(animationName); + if (animation == null) + throw new Error("Animation not found: " + animationName); + return this.addAnimationWith(trackIndex, animation, loop, delay); + }; + AnimationState.prototype.addAnimationWith = function (trackIndex, animation, loop, delay) { + if (animation == null) + throw new Error("animation cannot be null."); + var last = this.expandToIndex(trackIndex); + if (last != null) { + while (last.next != null) + last = last.next; + } + var 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) { + var 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; + }; + AnimationState.prototype.setEmptyAnimation = function (trackIndex, mixDuration) { + var entry = this.setAnimationWith(trackIndex, AnimationState.emptyAnimation, false); + entry.mixDuration = mixDuration; + entry.trackEnd = mixDuration; + return entry; + }; + AnimationState.prototype.addEmptyAnimation = function (trackIndex, mixDuration, delay) { + if (delay <= 0) + delay -= mixDuration; + var entry = this.addAnimationWith(trackIndex, AnimationState.emptyAnimation, false, delay); + entry.mixDuration = mixDuration; + entry.trackEnd = mixDuration; + return entry; + }; + AnimationState.prototype.setEmptyAnimations = function (mixDuration) { + var oldDrainDisabled = this.queue.drainDisabled; + this.queue.drainDisabled = true; + for (var i = 0, n = this.tracks.length; i < n; i++) { + var current = this.tracks[i]; + if (current != null) + this.setEmptyAnimation(current.trackIndex, mixDuration); + } + this.queue.drainDisabled = oldDrainDisabled; + this.queue.drain(); + }; + AnimationState.prototype.expandToIndex = function (index) { + if (index < this.tracks.length) + return this.tracks[index]; + spine.Utils.ensureArrayCapacity(this.tracks, index + 1, null); + this.tracks.length = index + 1; + return null; + }; + AnimationState.prototype.trackEntry = function (trackIndex, animation, loop, last) { + var 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 = spine.MixBlend.replace; + return entry; + }; + AnimationState.prototype.disposeNext = function (entry) { + var next = entry.next; + while (next != null) { + this.queue.dispose(next); + next = next.next; + } + entry.next = null; + }; + AnimationState.prototype._animationsChanged = function () { + this.animationsChanged = false; + this.propertyIDs.clear(); + for (var i = 0, n = this.tracks.length; i < n; i++) { + var entry = this.tracks[i]; + if (entry == null) + continue; + while (entry.mixingFrom != null) + entry = entry.mixingFrom; + do { + if (entry.mixingFrom == null || entry.mixBlend != spine.MixBlend.add) + this.computeHold(entry); + entry = entry.mixingTo; + } while (entry != null); + } + }; + AnimationState.prototype.computeHold = function (entry) { + var to = entry.mixingTo; + var timelines = entry.animation.timelines; + var timelinesCount = entry.animation.timelines.length; + var timelineMode = spine.Utils.setArraySize(entry.timelineMode, timelinesCount); + entry.timelineHoldMix.length = 0; + var timelineDipMix = spine.Utils.setArraySize(entry.timelineHoldMix, timelinesCount); + var propertyIDs = this.propertyIDs; + if (to != null && to.holdPrevious) { + for (var i = 0; i < timelinesCount; i++) { + timelineMode[i] = propertyIDs.add(timelines[i].getPropertyId()) ? AnimationState.HOLD_FIRST : AnimationState.HOLD_SUBSEQUENT; + } + return; + } + outer: for (var i = 0; i < timelinesCount; i++) { + var timeline = timelines[i]; + var id = timeline.getPropertyId(); + if (!propertyIDs.add(id)) + timelineMode[i] = AnimationState.SUBSEQUENT; + else if (to == null || timeline instanceof spine.AttachmentTimeline || timeline instanceof spine.DrawOrderTimeline + || timeline instanceof spine.EventTimeline || !to.animation.hasTimeline(id)) { + timelineMode[i] = AnimationState.FIRST; + } + else { + for (var 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; + } + } + }; + AnimationState.prototype.getCurrent = function (trackIndex) { + if (trackIndex >= this.tracks.length) + return null; + return this.tracks[trackIndex]; + }; + AnimationState.prototype.addListener = function (listener) { + if (listener == null) + throw new Error("listener cannot be null."); + this.listeners.push(listener); + }; + AnimationState.prototype.removeListener = function (listener) { + var index = this.listeners.indexOf(listener); + if (index >= 0) + this.listeners.splice(index, 1); + }; + AnimationState.prototype.clearListeners = function () { + this.listeners.length = 0; + }; + AnimationState.prototype.clearListenerNotifications = function () { + this.queue.clear(); + }; + AnimationState.emptyAnimation = new spine.Animation("", [], 0); + AnimationState.SUBSEQUENT = 0; + AnimationState.FIRST = 1; + AnimationState.HOLD_SUBSEQUENT = 2; + AnimationState.HOLD_FIRST = 3; + AnimationState.HOLD_MIX = 4; + AnimationState.SETUP = 1; + AnimationState.CURRENT = 2; + return AnimationState; + }()); + spine.AnimationState = AnimationState; + var TrackEntry = (function () { + function TrackEntry() { + this.mixBlend = spine.MixBlend.replace; + this.timelineMode = new Array(); + this.timelineHoldMix = new Array(); + this.timelinesRotation = new Array(); + } + TrackEntry.prototype.reset = function () { + 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; + }; + TrackEntry.prototype.getAnimationTime = function () { + if (this.loop) { + var 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); + }; + TrackEntry.prototype.setAnimationLast = function (animationLast) { + this.animationLast = animationLast; + this.nextAnimationLast = animationLast; + }; + TrackEntry.prototype.isComplete = function () { + return this.trackTime >= this.animationEnd - this.animationStart; + }; + TrackEntry.prototype.resetRotationDirections = function () { + this.timelinesRotation.length = 0; + }; + return TrackEntry; + }()); + spine.TrackEntry = TrackEntry; + var EventQueue = (function () { + function EventQueue(animState) { + this.objects = []; + this.drainDisabled = false; + this.animState = animState; + } + EventQueue.prototype.start = function (entry) { + this.objects.push(EventType.start); + this.objects.push(entry); + this.animState.animationsChanged = true; + }; + EventQueue.prototype.interrupt = function (entry) { + this.objects.push(EventType.interrupt); + this.objects.push(entry); + }; + EventQueue.prototype.end = function (entry) { + this.objects.push(EventType.end); + this.objects.push(entry); + this.animState.animationsChanged = true; + }; + EventQueue.prototype.dispose = function (entry) { + this.objects.push(EventType.dispose); + this.objects.push(entry); + }; + EventQueue.prototype.complete = function (entry) { + this.objects.push(EventType.complete); + this.objects.push(entry); + }; + EventQueue.prototype.event = function (entry, event) { + this.objects.push(EventType.event); + this.objects.push(entry); + this.objects.push(event); + }; + EventQueue.prototype.drain = function () { + if (this.drainDisabled) + return; + this.drainDisabled = true; + var objects = this.objects; + var listeners = this.animState.listeners; + for (var i = 0; i < objects.length; i += 2) { + var type = objects[i]; + var entry = objects[i + 1]; + switch (type) { + case EventType.start: + if (entry.listener != null && entry.listener.start) + entry.listener.start(entry); + for (var ii = 0; ii < listeners.length; ii++) + if (listeners[ii].start) + listeners[ii].start(entry); + break; + case EventType.interrupt: + if (entry.listener != null && entry.listener.interrupt) + entry.listener.interrupt(entry); + for (var 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 (var ii = 0; ii < listeners.length; ii++) + if (listeners[ii].end) + listeners[ii].end(entry); + case EventType.dispose: + if (entry.listener != null && entry.listener.dispose) + entry.listener.dispose(entry); + for (var 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 (var ii = 0; ii < listeners.length; ii++) + if (listeners[ii].complete) + listeners[ii].complete(entry); + break; + case EventType.event: + var event_3 = objects[i++ + 2]; + if (entry.listener != null && entry.listener.event) + entry.listener.event(entry, event_3); + for (var ii = 0; ii < listeners.length; ii++) + if (listeners[ii].event) + listeners[ii].event(entry, event_3); + break; + } + } + this.clear(); + this.drainDisabled = false; + }; + EventQueue.prototype.clear = function () { + this.objects.length = 0; + }; + return EventQueue; + }()); + spine.EventQueue = EventQueue; + var EventType; + (function (EventType) { + EventType[EventType["start"] = 0] = "start"; + EventType[EventType["interrupt"] = 1] = "interrupt"; + EventType[EventType["end"] = 2] = "end"; + EventType[EventType["dispose"] = 3] = "dispose"; + EventType[EventType["complete"] = 4] = "complete"; + EventType[EventType["event"] = 5] = "event"; + })(EventType = spine.EventType || (spine.EventType = {})); + var AnimationStateAdapter = (function () { + function AnimationStateAdapter() { + } + AnimationStateAdapter.prototype.start = function (entry) { + }; + AnimationStateAdapter.prototype.interrupt = function (entry) { + }; + AnimationStateAdapter.prototype.end = function (entry) { + }; + AnimationStateAdapter.prototype.dispose = function (entry) { + }; + AnimationStateAdapter.prototype.complete = function (entry) { + }; + AnimationStateAdapter.prototype.event = function (entry, event) { + }; + return AnimationStateAdapter; + }()); + spine.AnimationStateAdapter = AnimationStateAdapter; +})(spine || (spine = {})); +var spine; +(function (spine) { + var AnimationStateData = (function () { + function AnimationStateData(skeletonData) { + this.animationToMixTime = {}; + this.defaultMix = 0; + if (skeletonData == null) + throw new Error("skeletonData cannot be null."); + this.skeletonData = skeletonData; + } + AnimationStateData.prototype.setMix = function (fromName, toName, duration) { + var from = this.skeletonData.findAnimation(fromName); + if (from == null) + throw new Error("Animation not found: " + fromName); + var to = this.skeletonData.findAnimation(toName); + if (to == null) + throw new Error("Animation not found: " + toName); + this.setMixWith(from, to, duration); + }; + AnimationStateData.prototype.setMixWith = function (from, to, duration) { + if (from == null) + throw new Error("from cannot be null."); + if (to == null) + throw new Error("to cannot be null."); + var key = from.name + "." + to.name; + this.animationToMixTime[key] = duration; + }; + AnimationStateData.prototype.getMix = function (from, to) { + var key = from.name + "." + to.name; + var value = this.animationToMixTime[key]; + return value === undefined ? this.defaultMix : value; + }; + return AnimationStateData; + }()); + spine.AnimationStateData = AnimationStateData; +})(spine || (spine = {})); +var spine; +(function (spine) { + var AssetManager = (function () { + function AssetManager(textureLoader, pathPrefix) { + if (pathPrefix === void 0) { pathPrefix = ""; } + this.assets = {}; + this.errors = {}; + this.toLoad = 0; + this.loaded = 0; + this.rawDataUris = {}; + this.textureLoader = textureLoader; + this.pathPrefix = pathPrefix; + } + AssetManager.prototype.downloadText = function (url, success, error) { + var request = new XMLHttpRequest(); + request.overrideMimeType("text/html"); + if (this.rawDataUris[url]) + url = this.rawDataUris[url]; + request.open("GET", url, true); + request.onload = function () { + if (request.status == 200) { + success(request.responseText); + } + else { + error(request.status, request.responseText); + } + }; + request.onerror = function () { + error(request.status, request.responseText); + }; + request.send(); + }; + AssetManager.prototype.downloadBinary = function (url, success, error) { + var request = new XMLHttpRequest(); + if (this.rawDataUris[url]) + url = this.rawDataUris[url]; + request.open("GET", url, true); + request.responseType = "arraybuffer"; + request.onload = function () { + if (request.status == 200) { + success(new Uint8Array(request.response)); + } + else { + error(request.status, request.responseText); + } + }; + request.onerror = function () { + error(request.status, request.responseText); + }; + request.send(); + }; + AssetManager.prototype.setRawDataURI = function (path, data) { + this.rawDataUris[this.pathPrefix + path] = data; + }; + AssetManager.prototype.loadBinary = function (path, success, error) { + var _this = this; + if (success === void 0) { success = null; } + if (error === void 0) { error = null; } + path = this.pathPrefix + path; + this.toLoad++; + this.downloadBinary(path, function (data) { + _this.assets[path] = data; + if (success) + success(path, data); + _this.toLoad--; + _this.loaded++; + }, function (state, responseText) { + _this.errors[path] = "Couldn't load binary " + path + ": status " + status + ", " + responseText; + if (error) + error(path, "Couldn't load binary " + path + ": status " + status + ", " + responseText); + _this.toLoad--; + _this.loaded++; + }); + }; + AssetManager.prototype.loadText = function (path, success, error) { + var _this = this; + if (success === void 0) { success = null; } + if (error === void 0) { error = null; } + path = this.pathPrefix + path; + this.toLoad++; + this.downloadText(path, function (data) { + _this.assets[path] = data; + if (success) + success(path, data); + _this.toLoad--; + _this.loaded++; + }, function (state, responseText) { + _this.errors[path] = "Couldn't load text " + path + ": status " + status + ", " + responseText; + if (error) + error(path, "Couldn't load text " + path + ": status " + status + ", " + responseText); + _this.toLoad--; + _this.loaded++; + }); + }; + AssetManager.prototype.loadTexture = function (path, success, error) { + var _this = this; + if (success === void 0) { success = null; } + if (error === void 0) { error = null; } + path = this.pathPrefix + path; + var storagePath = path; + this.toLoad++; + var img = new Image(); + img.crossOrigin = "anonymous"; + img.onload = function (ev) { + var texture = _this.textureLoader(img); + _this.assets[storagePath] = texture; + _this.toLoad--; + _this.loaded++; + if (success) + success(path, img); + }; + img.onerror = function (ev) { + _this.errors[path] = "Couldn't load image " + path; + _this.toLoad--; + _this.loaded++; + if (error) + error(path, "Couldn't load image " + path); + }; + if (this.rawDataUris[path]) + path = this.rawDataUris[path]; + img.src = path; + }; + AssetManager.prototype.loadTextureAtlas = function (path, success, error) { + var _this = this; + if (success === void 0) { success = null; } + if (error === void 0) { error = null; } + var parent = path.lastIndexOf("/") >= 0 ? path.substring(0, path.lastIndexOf("/")) : ""; + path = this.pathPrefix + path; + this.toLoad++; + this.downloadText(path, function (atlasData) { + var pagesLoaded = { count: 0 }; + var atlasPages = new Array(); + try { + var atlas = new spine.TextureAtlas(atlasData, function (path) { + atlasPages.push(parent == "" ? path : parent + "/" + path); + var image = document.createElement("img"); + image.width = 16; + image.height = 16; + return new spine.FakeTexture(image); + }); + } + catch (e) { + var ex = e; + _this.errors[path] = "Couldn't load texture atlas " + path + ": " + ex.message; + if (error) + error(path, "Couldn't load texture atlas " + path + ": " + ex.message); + _this.toLoad--; + _this.loaded++; + return; + } + var _loop_1 = function (atlasPage) { + var pageLoadError = false; + _this.loadTexture(atlasPage, function (imagePath, image) { + pagesLoaded.count++; + if (pagesLoaded.count == atlasPages.length) { + if (!pageLoadError) { + try { + var atlas = new spine.TextureAtlas(atlasData, function (path) { + return _this.get(parent == "" ? path : parent + "/" + path); + }); + _this.assets[path] = atlas; + if (success) + success(path, atlas); + _this.toLoad--; + _this.loaded++; + } + catch (e) { + var ex = e; + _this.errors[path] = "Couldn't load texture atlas " + path + ": " + ex.message; + if (error) + error(path, "Couldn't load texture atlas " + path + ": " + ex.message); + _this.toLoad--; + _this.loaded++; + } + } + else { + _this.errors[path] = "Couldn't load texture atlas page " + imagePath + "} of atlas " + path; + if (error) + error(path, "Couldn't load texture atlas page " + imagePath + " of atlas " + path); + _this.toLoad--; + _this.loaded++; + } + } + }, function (imagePath, errorMessage) { + pageLoadError = true; + pagesLoaded.count++; + if (pagesLoaded.count == atlasPages.length) { + _this.errors[path] = "Couldn't load texture atlas page " + imagePath + "} of atlas " + path; + if (error) + error(path, "Couldn't load texture atlas page " + imagePath + " of atlas " + path); + _this.toLoad--; + _this.loaded++; + } + }); + }; + for (var _i = 0, atlasPages_1 = atlasPages; _i < atlasPages_1.length; _i++) { + var atlasPage = atlasPages_1[_i]; + _loop_1(atlasPage); + } + }, function (state, responseText) { + _this.errors[path] = "Couldn't load texture atlas " + path + ": status " + status + ", " + responseText; + if (error) + error(path, "Couldn't load texture atlas " + path + ": status " + status + ", " + responseText); + _this.toLoad--; + _this.loaded++; + }); + }; + AssetManager.prototype.get = function (path) { + path = this.pathPrefix + path; + return this.assets[path]; + }; + AssetManager.prototype.remove = function (path) { + path = this.pathPrefix + path; + var asset = this.assets[path]; + if (asset.dispose) + asset.dispose(); + this.assets[path] = null; + }; + AssetManager.prototype.removeAll = function () { + for (var key in this.assets) { + var asset = this.assets[key]; + if (asset.dispose) + asset.dispose(); + } + this.assets = {}; + }; + AssetManager.prototype.isLoadingComplete = function () { + return this.toLoad == 0; + }; + AssetManager.prototype.getToLoad = function () { + return this.toLoad; + }; + AssetManager.prototype.getLoaded = function () { + return this.loaded; + }; + AssetManager.prototype.dispose = function () { + this.removeAll(); + }; + AssetManager.prototype.hasErrors = function () { + return Object.keys(this.errors).length > 0; + }; + AssetManager.prototype.getErrors = function () { + return this.errors; + }; + return AssetManager; + }()); + spine.AssetManager = AssetManager; +})(spine || (spine = {})); +var spine; +(function (spine) { + var AtlasAttachmentLoader = (function () { + function AtlasAttachmentLoader(atlas) { + this.atlas = atlas; + } + AtlasAttachmentLoader.prototype.newRegionAttachment = function (skin, name, path) { + var region = this.atlas.findRegion(path); + if (region == null) + throw new Error("Region not found in atlas: " + path + " (region attachment: " + name + ")"); + region.renderObject = region; + var attachment = new spine.RegionAttachment(name); + attachment.setRegion(region); + return attachment; + }; + AtlasAttachmentLoader.prototype.newMeshAttachment = function (skin, name, path) { + var region = this.atlas.findRegion(path); + if (region == null) + throw new Error("Region not found in atlas: " + path + " (mesh attachment: " + name + ")"); + region.renderObject = region; + var attachment = new spine.MeshAttachment(name); + attachment.region = region; + return attachment; + }; + AtlasAttachmentLoader.prototype.newBoundingBoxAttachment = function (skin, name) { + return new spine.BoundingBoxAttachment(name); + }; + AtlasAttachmentLoader.prototype.newPathAttachment = function (skin, name) { + return new spine.PathAttachment(name); + }; + AtlasAttachmentLoader.prototype.newPointAttachment = function (skin, name) { + return new spine.PointAttachment(name); + }; + AtlasAttachmentLoader.prototype.newClippingAttachment = function (skin, name) { + return new spine.ClippingAttachment(name); + }; + return AtlasAttachmentLoader; + }()); + spine.AtlasAttachmentLoader = AtlasAttachmentLoader; +})(spine || (spine = {})); +var spine; +(function (spine) { + var BlendMode; + (function (BlendMode) { + BlendMode[BlendMode["Normal"] = 0] = "Normal"; + BlendMode[BlendMode["Additive"] = 1] = "Additive"; + BlendMode[BlendMode["Multiply"] = 2] = "Multiply"; + BlendMode[BlendMode["Screen"] = 3] = "Screen"; + })(BlendMode = spine.BlendMode || (spine.BlendMode = {})); +})(spine || (spine = {})); +var spine; +(function (spine) { + var Bone = (function () { + function Bone(data, skeleton, parent) { + this.children = new Array(); + this.x = 0; + this.y = 0; + this.rotation = 0; + this.scaleX = 0; + this.scaleY = 0; + this.shearX = 0; + this.shearY = 0; + this.ax = 0; + this.ay = 0; + this.arotation = 0; + this.ascaleX = 0; + this.ascaleY = 0; + this.ashearX = 0; + this.ashearY = 0; + this.appliedValid = false; + this.a = 0; + this.b = 0; + this.c = 0; + this.d = 0; + this.worldY = 0; + this.worldX = 0; + this.sorted = false; + this.active = false; + 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(); + } + Bone.prototype.isActive = function () { + return this.active; + }; + Bone.prototype.update = function () { + this.updateWorldTransformWith(this.x, this.y, this.rotation, this.scaleX, this.scaleY, this.shearX, this.shearY); + }; + Bone.prototype.updateWorldTransform = function () { + this.updateWorldTransformWith(this.x, this.y, this.rotation, this.scaleX, this.scaleY, this.shearX, this.shearY); + }; + Bone.prototype.updateWorldTransformWith = function (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; + var parent = this.parent; + if (parent == null) { + var skeleton = this.skeleton; + var rotationY = rotation + 90 + shearY; + var sx = skeleton.scaleX; + var sy = skeleton.scaleY; + this.a = spine.MathUtils.cosDeg(rotation + shearX) * scaleX * sx; + this.b = spine.MathUtils.cosDeg(rotationY) * scaleY * sx; + this.c = spine.MathUtils.sinDeg(rotation + shearX) * scaleX * sy; + this.d = spine.MathUtils.sinDeg(rotationY) * scaleY * sy; + this.worldX = x * sx + skeleton.x; + this.worldY = y * sy + skeleton.y; + return; + } + var pa = parent.a, pb = parent.b, pc = parent.c, pd = parent.d; + this.worldX = pa * x + pb * y + parent.worldX; + this.worldY = pc * x + pd * y + parent.worldY; + switch (this.data.transformMode) { + case spine.TransformMode.Normal: { + var rotationY = rotation + 90 + shearY; + var la = spine.MathUtils.cosDeg(rotation + shearX) * scaleX; + var lb = spine.MathUtils.cosDeg(rotationY) * scaleY; + var lc = spine.MathUtils.sinDeg(rotation + shearX) * scaleX; + var ld = spine.MathUtils.sinDeg(rotationY) * scaleY; + this.a = pa * la + pb * lc; + this.b = pa * lb + pb * ld; + this.c = pc * la + pd * lc; + this.d = pc * lb + pd * ld; + return; + } + case spine.TransformMode.OnlyTranslation: { + var rotationY = rotation + 90 + shearY; + this.a = spine.MathUtils.cosDeg(rotation + shearX) * scaleX; + this.b = spine.MathUtils.cosDeg(rotationY) * scaleY; + this.c = spine.MathUtils.sinDeg(rotation + shearX) * scaleX; + this.d = spine.MathUtils.sinDeg(rotationY) * scaleY; + break; + } + case spine.TransformMode.NoRotationOrReflection: { + var s = pa * pa + pc * pc; + var 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) * spine.MathUtils.radDeg; + } + else { + pa = 0; + pc = 0; + prx = 90 - Math.atan2(pd, pb) * spine.MathUtils.radDeg; + } + var rx = rotation + shearX - prx; + var ry = rotation + shearY - prx + 90; + var la = spine.MathUtils.cosDeg(rx) * scaleX; + var lb = spine.MathUtils.cosDeg(ry) * scaleY; + var lc = spine.MathUtils.sinDeg(rx) * scaleX; + var ld = spine.MathUtils.sinDeg(ry) * scaleY; + this.a = pa * la - pb * lc; + this.b = pa * lb - pb * ld; + this.c = pc * la + pd * lc; + this.d = pc * lb + pd * ld; + break; + } + case spine.TransformMode.NoScale: + case spine.TransformMode.NoScaleOrReflection: { + var cos = spine.MathUtils.cosDeg(rotation); + var sin = spine.MathUtils.sinDeg(rotation); + var za = (pa * cos + pb * sin) / this.skeleton.scaleX; + var zc = (pc * cos + pd * sin) / this.skeleton.scaleY; + var 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 == spine.TransformMode.NoScale + && (pa * pd - pb * pc < 0) != (this.skeleton.scaleX < 0 != this.skeleton.scaleY < 0)) + s = -s; + var r = Math.PI / 2 + Math.atan2(zc, za); + var zb = Math.cos(r) * s; + var zd = Math.sin(r) * s; + var la = spine.MathUtils.cosDeg(shearX) * scaleX; + var lb = spine.MathUtils.cosDeg(90 + shearY) * scaleY; + var lc = spine.MathUtils.sinDeg(shearX) * scaleX; + var ld = spine.MathUtils.sinDeg(90 + shearY) * scaleY; + this.a = za * la + zb * lc; + this.b = za * lb + zb * ld; + this.c = zc * la + zd * lc; + this.d = zc * lb + zd * ld; + break; + } + } + this.a *= this.skeleton.scaleX; + this.b *= this.skeleton.scaleX; + this.c *= this.skeleton.scaleY; + this.d *= this.skeleton.scaleY; + }; + Bone.prototype.setToSetupPose = function () { + var 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; + }; + Bone.prototype.getWorldRotationX = function () { + return Math.atan2(this.c, this.a) * spine.MathUtils.radDeg; + }; + Bone.prototype.getWorldRotationY = function () { + return Math.atan2(this.d, this.b) * spine.MathUtils.radDeg; + }; + Bone.prototype.getWorldScaleX = function () { + return Math.sqrt(this.a * this.a + this.c * this.c); + }; + Bone.prototype.getWorldScaleY = function () { + return Math.sqrt(this.b * this.b + this.d * this.d); + }; + Bone.prototype.updateAppliedTransform = function () { + this.appliedValid = true; + var parent = this.parent; + if (parent == null) { + this.ax = this.worldX; + this.ay = this.worldY; + this.arotation = Math.atan2(this.c, this.a) * spine.MathUtils.radDeg; + this.ascaleX = Math.sqrt(this.a * this.a + this.c * this.c); + this.ascaleY = Math.sqrt(this.b * this.b + this.d * this.d); + this.ashearX = 0; + this.ashearY = Math.atan2(this.a * this.b + this.c * this.d, this.a * this.d - this.b * this.c) * spine.MathUtils.radDeg; + return; + } + var pa = parent.a, pb = parent.b, pc = parent.c, pd = parent.d; + var pid = 1 / (pa * pd - pb * pc); + var dx = this.worldX - parent.worldX, dy = this.worldY - parent.worldY; + this.ax = (dx * pd * pid - dy * pb * pid); + this.ay = (dy * pa * pid - dx * pc * pid); + var ia = pid * pd; + var id = pid * pa; + var ib = pid * pb; + var ic = pid * pc; + var ra = ia * this.a - ib * this.c; + var rb = ia * this.b - ib * this.d; + var rc = id * this.c - ic * this.a; + var rd = id * this.d - ic * this.b; + this.ashearX = 0; + this.ascaleX = Math.sqrt(ra * ra + rc * rc); + if (this.ascaleX > 0.0001) { + var det = ra * rd - rb * rc; + this.ascaleY = det / this.ascaleX; + this.ashearY = Math.atan2(ra * rb + rc * rd, det) * spine.MathUtils.radDeg; + this.arotation = Math.atan2(rc, ra) * spine.MathUtils.radDeg; + } + else { + this.ascaleX = 0; + this.ascaleY = Math.sqrt(rb * rb + rd * rd); + this.ashearY = 0; + this.arotation = 90 - Math.atan2(rd, rb) * spine.MathUtils.radDeg; + } + }; + Bone.prototype.worldToLocal = function (world) { + var a = this.a, b = this.b, c = this.c, d = this.d; + var invDet = 1 / (a * d - b * c); + var x = world.x - this.worldX, y = world.y - this.worldY; + world.x = (x * d * invDet - y * b * invDet); + world.y = (y * a * invDet - x * c * invDet); + return world; + }; + Bone.prototype.localToWorld = function (local) { + var x = local.x, y = local.y; + local.x = x * this.a + y * this.b + this.worldX; + local.y = x * this.c + y * this.d + this.worldY; + return local; + }; + Bone.prototype.worldToLocalRotation = function (worldRotation) { + var sin = spine.MathUtils.sinDeg(worldRotation), cos = spine.MathUtils.cosDeg(worldRotation); + return Math.atan2(this.a * sin - this.c * cos, this.d * cos - this.b * sin) * spine.MathUtils.radDeg + this.rotation - this.shearX; + }; + Bone.prototype.localToWorldRotation = function (localRotation) { + localRotation -= this.rotation - this.shearX; + var sin = spine.MathUtils.sinDeg(localRotation), cos = spine.MathUtils.cosDeg(localRotation); + return Math.atan2(cos * this.c + sin * this.d, cos * this.a + sin * this.b) * spine.MathUtils.radDeg; + }; + Bone.prototype.rotateWorld = function (degrees) { + var a = this.a, b = this.b, c = this.c, d = this.d; + var cos = spine.MathUtils.cosDeg(degrees), sin = spine.MathUtils.sinDeg(degrees); + this.a = cos * a - sin * c; + this.b = cos * b - sin * d; + this.c = sin * a + cos * c; + this.d = sin * b + cos * d; + this.appliedValid = false; + }; + return Bone; + }()); + spine.Bone = Bone; +})(spine || (spine = {})); +var spine; +(function (spine) { + var BoneData = (function () { + function BoneData(index, name, parent) { + this.x = 0; + this.y = 0; + this.rotation = 0; + this.scaleX = 1; + this.scaleY = 1; + this.shearX = 0; + this.shearY = 0; + this.transformMode = TransformMode.Normal; + this.skinRequired = false; + this.color = new spine.Color(); + 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; + } + return BoneData; + }()); + spine.BoneData = BoneData; + var TransformMode; + (function (TransformMode) { + TransformMode[TransformMode["Normal"] = 0] = "Normal"; + TransformMode[TransformMode["OnlyTranslation"] = 1] = "OnlyTranslation"; + TransformMode[TransformMode["NoRotationOrReflection"] = 2] = "NoRotationOrReflection"; + TransformMode[TransformMode["NoScale"] = 3] = "NoScale"; + TransformMode[TransformMode["NoScaleOrReflection"] = 4] = "NoScaleOrReflection"; + })(TransformMode = spine.TransformMode || (spine.TransformMode = {})); +})(spine || (spine = {})); +var spine; +(function (spine) { + var ConstraintData = (function () { + function ConstraintData(name, order, skinRequired) { + this.name = name; + this.order = order; + this.skinRequired = skinRequired; + } + return ConstraintData; + }()); + spine.ConstraintData = ConstraintData; +})(spine || (spine = {})); +var spine; +(function (spine) { + var Event = (function () { + function Event(time, data) { + if (data == null) + throw new Error("data cannot be null."); + this.time = time; + this.data = data; + } + return Event; + }()); + spine.Event = Event; +})(spine || (spine = {})); +var spine; +(function (spine) { + var EventData = (function () { + function EventData(name) { + this.name = name; + } + return EventData; + }()); + spine.EventData = EventData; +})(spine || (spine = {})); +var spine; +(function (spine) { + var IkConstraint = (function () { + function IkConstraint(data, skeleton) { + this.bendDirection = 0; + this.compress = false; + this.stretch = false; + this.mix = 1; + this.softness = 0; + this.active = false; + 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 (var i = 0; i < data.bones.length; i++) + this.bones.push(skeleton.findBone(data.bones[i].name)); + this.target = skeleton.findBone(data.target.name); + } + IkConstraint.prototype.isActive = function () { + return this.active; + }; + IkConstraint.prototype.apply = function () { + this.update(); + }; + IkConstraint.prototype.update = function () { + var target = this.target; + var 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; + } + }; + IkConstraint.prototype.apply1 = function (bone, targetX, targetY, compress, stretch, uniform, alpha) { + if (!bone.appliedValid) + bone.updateAppliedTransform(); + var p = bone.parent; + var pa = p.a, pb = p.b, pc = p.c, pd = p.d; + var rotationIK = -bone.ashearX - bone.arotation, tx = 0, ty = 0; + switch (bone.data.transformMode) { + case spine.TransformMode.OnlyTranslation: + tx = targetX - bone.worldX; + ty = targetY - bone.worldY; + break; + case spine.TransformMode.NoRotationOrReflection: + var s = Math.abs(pa * pd - pb * pc) / (pa * pa + pc * pc); + var sa = pa / bone.skeleton.scaleX; + var sc = pc / bone.skeleton.scaleY; + pb = -sc * s * bone.skeleton.scaleX; + pd = sa * s * bone.skeleton.scaleY; + rotationIK += Math.atan2(sc, sa) * spine.MathUtils.radDeg; + default: + var x = targetX - p.worldX, y = targetY - p.worldY; + var 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) * spine.MathUtils.radDeg; + if (bone.ascaleX < 0) + rotationIK += 180; + if (rotationIK > 180) + rotationIK -= 360; + else if (rotationIK < -180) + rotationIK += 360; + var sx = bone.ascaleX, sy = bone.ascaleY; + if (compress || stretch) { + switch (bone.data.transformMode) { + case spine.TransformMode.NoScale: + case spine.TransformMode.NoScaleOrReflection: + tx = targetX - bone.worldX; + ty = targetY - bone.worldY; + } + var b = bone.data.length * sx, dd = Math.sqrt(tx * tx + ty * ty); + if ((compress && dd < b) || (stretch && dd > b) && b > 0.0001) { + var 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); + }; + IkConstraint.prototype.apply2 = function (parent, child, targetX, targetY, bendDir, stretch, softness, alpha) { + if (alpha == 0) { + child.updateWorldTransform(); + return; + } + if (!parent.appliedValid) + parent.updateAppliedTransform(); + if (!child.appliedValid) + child.updateAppliedTransform(); + var px = parent.ax, py = parent.ay, psx = parent.ascaleX, sx = psx, psy = parent.ascaleY, csx = child.ascaleX; + var 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; + var cx = child.ax, cy = 0, cwx = 0, cwy = 0, a = parent.a, b = parent.b, c = parent.c, d = parent.d; + var u = Math.abs(psx - psy) <= 0.0001; + if (!u) { + cy = 0; + cwx = a * cx + parent.worldX; + cwy = c * cx + parent.worldY; + } + else { + cy = child.ay; + cwx = a * cx + b * cy + parent.worldX; + cwy = c * cx + d * cy + parent.worldY; + } + var pp = parent.parent; + a = pp.a; + b = pp.b; + c = pp.c; + d = pp.d; + var id = 1 / (a * d - b * c), x = cwx - pp.worldX, y = cwy - pp.worldY; + var dx = (x * d - y * b) * id - px, dy = (y * a - x * c) * id - py; + var 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.worldX; + y = targetY - pp.worldY; + var tx = (x * d - y * b) * id - px, ty = (y * a - x * c) * id - py; + var dd = tx * tx + ty * ty; + if (softness != 0) { + softness *= psx * (csx + 1) / 2; + var td = Math.sqrt(dd), sd = td - l1 - l2 * psx + softness; + if (sd > 0) { + var 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; + var 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; + var aa = a * a, bb = b * b, ta = Math.atan2(ty, tx); + c = bb * l1 * l1 + aa * dd - aa * bb; + var c1 = -2 * bb * l1, c2 = bb - aa; + d = c1 * c1 - 4 * c2 * c; + if (d >= 0) { + var q = Math.sqrt(d); + if (c1 < 0) + q = -q; + q = -(c1 + q) / 2; + var r0 = q / c2, r1 = c / q; + var 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; + } + } + var minAngle = spine.MathUtils.PI, minX = l1 - a, minDist = minX * minX, minY = 0; + var 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; + } + } + var os = Math.atan2(cy, cx) * s2; + var rotation = parent.arotation; + a1 = (a1 - os) * spine.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) * spine.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); + }; + return IkConstraint; + }()); + spine.IkConstraint = IkConstraint; +})(spine || (spine = {})); +var spine; +(function (spine) { + var IkConstraintData = (function (_super) { + __extends(IkConstraintData, _super); + function IkConstraintData(name) { + var _this = _super.call(this, name, 0, false) || this; + _this.bones = new Array(); + _this.bendDirection = 1; + _this.compress = false; + _this.stretch = false; + _this.uniform = false; + _this.mix = 1; + _this.softness = 0; + return _this; + } + return IkConstraintData; + }(spine.ConstraintData)); + spine.IkConstraintData = IkConstraintData; +})(spine || (spine = {})); +var spine; +(function (spine) { + var PathConstraint = (function () { + function PathConstraint(data, skeleton) { + this.position = 0; + this.spacing = 0; + this.rotateMix = 0; + this.translateMix = 0; + this.spaces = new Array(); + this.positions = new Array(); + this.world = new Array(); + this.curves = new Array(); + this.lengths = new Array(); + this.segments = new Array(); + this.active = false; + 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 (var 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; + } + PathConstraint.prototype.isActive = function () { + return this.active; + }; + PathConstraint.prototype.apply = function () { + this.update(); + }; + PathConstraint.prototype.update = function () { + var attachment = this.target.getAttachment(); + if (!(attachment instanceof spine.PathAttachment)) + return; + var rotateMix = this.rotateMix, translateMix = this.translateMix; + var translate = translateMix > 0, rotate = rotateMix > 0; + if (!translate && !rotate) + return; + var data = this.data; + var percentSpacing = data.spacingMode == spine.SpacingMode.Percent; + var rotateMode = data.rotateMode; + var tangents = rotateMode == spine.RotateMode.Tangent, scale = rotateMode == spine.RotateMode.ChainScale; + var boneCount = this.bones.length, spacesCount = tangents ? boneCount : boneCount + 1; + var bones = this.bones; + var spaces = spine.Utils.setArraySize(this.spaces, spacesCount), lengths = null; + var spacing = this.spacing; + if (scale || !percentSpacing) { + if (scale) + lengths = spine.Utils.setArraySize(this.lengths, boneCount); + var lengthSpacing = data.spacingMode == spine.SpacingMode.Length; + for (var i = 0, n = spacesCount - 1; i < n;) { + var bone = bones[i]; + var setupLength = bone.data.length; + if (setupLength < PathConstraint.epsilon) { + if (scale) + lengths[i] = 0; + spaces[++i] = 0; + } + else if (percentSpacing) { + if (scale) { + var x = setupLength * bone.a, y = setupLength * bone.c; + var length_1 = Math.sqrt(x * x + y * y); + lengths[i] = length_1; + } + spaces[++i] = spacing; + } + else { + var x = setupLength * bone.a, y = setupLength * bone.c; + var length_2 = Math.sqrt(x * x + y * y); + if (scale) + lengths[i] = length_2; + spaces[++i] = (lengthSpacing ? setupLength + spacing : spacing) * length_2 / setupLength; + } + } + } + else { + for (var i = 1; i < spacesCount; i++) + spaces[i] = spacing; + } + var positions = this.computeWorldPositions(attachment, spacesCount, tangents, data.positionMode == spine.PositionMode.Percent, percentSpacing); + var boneX = positions[0], boneY = positions[1], offsetRotation = data.offsetRotation; + var tip = false; + if (offsetRotation == 0) + tip = rotateMode == spine.RotateMode.Chain; + else { + tip = false; + var p = this.target.bone; + offsetRotation *= p.a * p.d - p.b * p.c > 0 ? spine.MathUtils.degRad : -spine.MathUtils.degRad; + } + for (var i = 0, p = 3; i < boneCount; i++, p += 3) { + var bone = bones[i]; + bone.worldX += (boneX - bone.worldX) * translateMix; + bone.worldY += (boneY - bone.worldY) * translateMix; + var x = positions[p], y = positions[p + 1], dx = x - boneX, dy = y - boneY; + if (scale) { + var length_3 = lengths[i]; + if (length_3 != 0) { + var s = (Math.sqrt(dx * dx + dy * dy) / length_3 - 1) * rotateMix + 1; + bone.a *= s; + bone.c *= s; + } + } + boneX = x; + boneY = y; + if (rotate) { + var a = bone.a, b = bone.b, c = bone.c, d = bone.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); + var length_4 = bone.data.length; + boneX += (length_4 * (cos * a - sin * c) - dx) * rotateMix; + boneY += (length_4 * (sin * a + cos * c) - dy) * rotateMix; + } + else { + r += offsetRotation; + } + if (r > spine.MathUtils.PI) + r -= spine.MathUtils.PI2; + else if (r < -spine.MathUtils.PI) + r += spine.MathUtils.PI2; + r *= rotateMix; + cos = Math.cos(r); + sin = Math.sin(r); + bone.a = cos * a - sin * c; + bone.b = cos * b - sin * d; + bone.c = sin * a + cos * c; + bone.d = sin * b + cos * d; + } + bone.appliedValid = false; + } + }; + PathConstraint.prototype.computeWorldPositions = function (path, spacesCount, tangents, percentPosition, percentSpacing) { + var target = this.target; + var position = this.position; + var spaces = this.spaces, out = spine.Utils.setArraySize(this.positions, spacesCount * 3 + 2), world = null; + var closed = path.closed; + var verticesLength = path.worldVerticesLength, curveCount = verticesLength / 6, prevCurve = PathConstraint.NONE; + if (!path.constantSpeed) { + var lengths = path.lengths; + curveCount -= closed ? 1 : 2; + var pathLength_1 = lengths[curveCount]; + if (percentPosition) + position *= pathLength_1; + if (percentSpacing) { + for (var i = 1; i < spacesCount; i++) + spaces[i] *= pathLength_1; + } + world = spine.Utils.setArraySize(this.world, 8); + for (var i = 0, o = 0, curve = 0; i < spacesCount; i++, o += 3) { + var space = spaces[i]; + position += space; + var p = position; + if (closed) { + p %= pathLength_1; + if (p < 0) + p += pathLength_1; + 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_1) { + if (prevCurve != PathConstraint.AFTER) { + prevCurve = PathConstraint.AFTER; + path.computeWorldVertices(target, verticesLength - 6, 4, world, 0, 2); + } + this.addAfterPosition(p - pathLength_1, world, 0, out, o); + continue; + } + for (;; curve++) { + var length_5 = lengths[curve]; + if (p > length_5) + continue; + if (curve == 0) + p /= length_5; + else { + var prev = lengths[curve - 1]; + p = (p - prev) / (length_5 - 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; + } + if (closed) { + verticesLength += 2; + world = spine.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 = spine.Utils.setArraySize(this.world, verticesLength); + path.computeWorldVertices(target, 2, verticesLength, world, 0, 2); + } + var curves = spine.Utils.setArraySize(this.curves, curveCount); + var pathLength = 0; + var x1 = world[0], y1 = world[1], cx1 = 0, cy1 = 0, cx2 = 0, cy2 = 0, x2 = 0, y2 = 0; + var tmpx = 0, tmpy = 0, dddfx = 0, dddfy = 0, ddfx = 0, ddfy = 0, dfx = 0, dfy = 0; + for (var 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; + else + position *= pathLength / path.lengths[curveCount - 1]; + if (percentSpacing) { + for (var i = 1; i < spacesCount; i++) + spaces[i] *= pathLength; + } + var segments = this.segments; + var curveLength = 0; + for (var i = 0, o = 0, curve = 0, segment = 0; i < spacesCount; i++, o += 3) { + var space = spaces[i]; + position += space; + var 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; + } + for (;; curve++) { + var length_6 = curves[curve]; + if (p > length_6) + continue; + if (curve == 0) + p /= length_6; + else { + var prev = curves[curve - 1]; + p = (p - prev) / (length_6 - prev); + } + break; + } + if (curve != prevCurve) { + prevCurve = curve; + var 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; + } + p *= curveLength; + for (;; segment++) { + var length_7 = segments[segment]; + if (p > length_7) + continue; + if (segment == 0) + p /= length_7; + else { + var prev = segments[segment - 1]; + p = segment + (p - prev) / (length_7 - prev); + } + break; + } + this.addCurvePosition(p * 0.1, x1, y1, cx1, cy1, cx2, cy2, x2, y2, out, o, tangents || (i > 0 && space == 0)); + } + return out; + }; + PathConstraint.prototype.addBeforePosition = function (p, temp, i, out, o) { + var 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; + }; + PathConstraint.prototype.addAfterPosition = function (p, temp, i, out, o) { + var 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; + }; + PathConstraint.prototype.addCurvePosition = function (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; + } + var tt = p * p, ttt = tt * p, u = 1 - p, uu = u * u, uuu = uu * u; + var ut = u * p, ut3 = ut * 3, uut3 = u * ut3, utt3 = ut3 * p; + var 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.NONE = -1; + PathConstraint.BEFORE = -2; + PathConstraint.AFTER = -3; + PathConstraint.epsilon = 0.00001; + return PathConstraint; + }()); + spine.PathConstraint = PathConstraint; +})(spine || (spine = {})); +var spine; +(function (spine) { + var PathConstraintData = (function (_super) { + __extends(PathConstraintData, _super); + function PathConstraintData(name) { + var _this = _super.call(this, name, 0, false) || this; + _this.bones = new Array(); + return _this; + } + return PathConstraintData; + }(spine.ConstraintData)); + spine.PathConstraintData = PathConstraintData; + var PositionMode; + (function (PositionMode) { + PositionMode[PositionMode["Fixed"] = 0] = "Fixed"; + PositionMode[PositionMode["Percent"] = 1] = "Percent"; + })(PositionMode = spine.PositionMode || (spine.PositionMode = {})); + var SpacingMode; + (function (SpacingMode) { + SpacingMode[SpacingMode["Length"] = 0] = "Length"; + SpacingMode[SpacingMode["Fixed"] = 1] = "Fixed"; + SpacingMode[SpacingMode["Percent"] = 2] = "Percent"; + })(SpacingMode = spine.SpacingMode || (spine.SpacingMode = {})); + var RotateMode; + (function (RotateMode) { + RotateMode[RotateMode["Tangent"] = 0] = "Tangent"; + RotateMode[RotateMode["Chain"] = 1] = "Chain"; + RotateMode[RotateMode["ChainScale"] = 2] = "ChainScale"; + })(RotateMode = spine.RotateMode || (spine.RotateMode = {})); +})(spine || (spine = {})); +var spine; +(function (spine) { + var Assets = (function () { + function Assets(clientId) { + this.toLoad = new Array(); + this.assets = {}; + this.clientId = clientId; + } + Assets.prototype.loaded = function () { + var i = 0; + for (var v in this.assets) + i++; + return i; + }; + return Assets; + }()); + var SharedAssetManager = (function () { + function SharedAssetManager(pathPrefix) { + if (pathPrefix === void 0) { pathPrefix = ""; } + this.clientAssets = {}; + this.queuedAssets = {}; + this.rawAssets = {}; + this.errors = {}; + this.pathPrefix = pathPrefix; + } + SharedAssetManager.prototype.queueAsset = function (clientId, textureLoader, path) { + var clientAssets = this.clientAssets[clientId]; + if (clientAssets === null || clientAssets === undefined) { + clientAssets = new Assets(clientId); + this.clientAssets[clientId] = clientAssets; + } + if (textureLoader !== null) + clientAssets.textureLoader = textureLoader; + clientAssets.toLoad.push(path); + if (this.queuedAssets[path] === path) { + return false; + } + else { + this.queuedAssets[path] = path; + return true; + } + }; + SharedAssetManager.prototype.loadText = function (clientId, path) { + var _this = this; + path = this.pathPrefix + path; + if (!this.queueAsset(clientId, null, path)) + return; + var request = new XMLHttpRequest(); + request.overrideMimeType("text/html"); + request.onreadystatechange = function () { + if (request.readyState == XMLHttpRequest.DONE) { + if (request.status >= 200 && request.status < 300) { + _this.rawAssets[path] = request.responseText; + } + else { + _this.errors[path] = "Couldn't load text " + path + ": status " + request.status + ", " + request.responseText; + } + } + }; + request.open("GET", path, true); + request.send(); + }; + SharedAssetManager.prototype.loadJson = function (clientId, path) { + var _this = this; + path = this.pathPrefix + path; + if (!this.queueAsset(clientId, null, path)) + return; + var request = new XMLHttpRequest(); + request.overrideMimeType("text/html"); + request.onreadystatechange = function () { + if (request.readyState == XMLHttpRequest.DONE) { + if (request.status >= 200 && request.status < 300) { + _this.rawAssets[path] = JSON.parse(request.responseText); + } + else { + _this.errors[path] = "Couldn't load text " + path + ": status " + request.status + ", " + request.responseText; + } + } + }; + request.open("GET", path, true); + request.send(); + }; + SharedAssetManager.prototype.loadTexture = function (clientId, textureLoader, path) { + var _this = this; + path = this.pathPrefix + path; + if (!this.queueAsset(clientId, textureLoader, path)) + return; + var isBrowser = !!(typeof window !== 'undefined' && typeof navigator !== 'undefined' && window.document); + var isWebWorker = !isBrowser && typeof importScripts !== 'undefined'; + if (isWebWorker) { + var options = { mode: "cors" }; + fetch(path, options).then(function (response) { + if (!response.ok) { + _this.errors[path] = "Couldn't load image " + path; + } + return response.blob(); + }).then(function (blob) { + return createImageBitmap(blob, { + premultiplyAlpha: 'none', + colorSpaceConversion: 'none' + }); + }).then(function (bitmap) { + _this.rawAssets[path] = bitmap; + }); + } + else { + var img_1 = new Image(); + img_1.crossOrigin = "anonymous"; + img_1.onload = function (ev) { + _this.rawAssets[path] = img_1; + }; + img_1.onerror = function (ev) { + _this.errors[path] = "Couldn't load image " + path; + }; + img_1.src = path; + } + }; + SharedAssetManager.prototype.get = function (clientId, path) { + path = this.pathPrefix + path; + var clientAssets = this.clientAssets[clientId]; + if (clientAssets === null || clientAssets === undefined) + return true; + return clientAssets.assets[path]; + }; + SharedAssetManager.prototype.updateClientAssets = function (clientAssets) { + var isBrowser = !!(typeof window !== 'undefined' && typeof navigator !== 'undefined' && window.document); + var isWebWorker = !isBrowser && typeof importScripts !== 'undefined'; + for (var i = 0; i < clientAssets.toLoad.length; i++) { + var path = clientAssets.toLoad[i]; + var asset = clientAssets.assets[path]; + if (asset === null || asset === undefined) { + var rawAsset = this.rawAssets[path]; + if (rawAsset === null || rawAsset === undefined) + continue; + if (isWebWorker) { + if (rawAsset instanceof ImageBitmap) { + clientAssets.assets[path] = clientAssets.textureLoader(rawAsset); + } + else { + clientAssets.assets[path] = rawAsset; + } + } + else { + if (rawAsset instanceof HTMLImageElement) { + clientAssets.assets[path] = clientAssets.textureLoader(rawAsset); + } + else { + clientAssets.assets[path] = rawAsset; + } + } + } + } + }; + SharedAssetManager.prototype.isLoadingComplete = function (clientId) { + var clientAssets = this.clientAssets[clientId]; + if (clientAssets === null || clientAssets === undefined) + return true; + this.updateClientAssets(clientAssets); + return clientAssets.toLoad.length == clientAssets.loaded(); + }; + SharedAssetManager.prototype.dispose = function () { + }; + SharedAssetManager.prototype.hasErrors = function () { + return Object.keys(this.errors).length > 0; + }; + SharedAssetManager.prototype.getErrors = function () { + return this.errors; + }; + return SharedAssetManager; + }()); + spine.SharedAssetManager = SharedAssetManager; +})(spine || (spine = {})); +var spine; +(function (spine) { + var Skeleton = (function () { + function Skeleton(data) { + this._updateCache = new Array(); + this.updateCacheReset = new Array(); + this.time = 0; + this.scaleX = 1; + this.scaleY = 1; + this.x = 0; + this.y = 0; + if (data == null) + throw new Error("data cannot be null."); + this.data = data; + this.bones = new Array(); + for (var i = 0; i < data.bones.length; i++) { + var boneData = data.bones[i]; + var bone = void 0; + if (boneData.parent == null) + bone = new spine.Bone(boneData, this, null); + else { + var parent_1 = this.bones[boneData.parent.index]; + bone = new spine.Bone(boneData, this, parent_1); + parent_1.children.push(bone); + } + this.bones.push(bone); + } + this.slots = new Array(); + this.drawOrder = new Array(); + for (var i = 0; i < data.slots.length; i++) { + var slotData = data.slots[i]; + var bone = this.bones[slotData.boneData.index]; + var slot = new spine.Slot(slotData, bone); + this.slots.push(slot); + this.drawOrder.push(slot); + } + this.ikConstraints = new Array(); + for (var i = 0; i < data.ikConstraints.length; i++) { + var ikConstraintData = data.ikConstraints[i]; + this.ikConstraints.push(new spine.IkConstraint(ikConstraintData, this)); + } + this.transformConstraints = new Array(); + for (var i = 0; i < data.transformConstraints.length; i++) { + var transformConstraintData = data.transformConstraints[i]; + this.transformConstraints.push(new spine.TransformConstraint(transformConstraintData, this)); + } + this.pathConstraints = new Array(); + for (var i = 0; i < data.pathConstraints.length; i++) { + var pathConstraintData = data.pathConstraints[i]; + this.pathConstraints.push(new spine.PathConstraint(pathConstraintData, this)); + } + this.color = new spine.Color(1, 1, 1, 1); + this.updateCache(); + } + Skeleton.prototype.updateCache = function () { + var updateCache = this._updateCache; + updateCache.length = 0; + this.updateCacheReset.length = 0; + var bones = this.bones; + for (var i = 0, n = bones.length; i < n; i++) { + var bone = bones[i]; + bone.sorted = bone.data.skinRequired; + bone.active = !bone.sorted; + } + if (this.skin != null) { + var skinBones = this.skin.bones; + for (var i = 0, n = this.skin.bones.length; i < n; i++) { + var bone = this.bones[skinBones[i].index]; + do { + bone.sorted = false; + bone.active = true; + bone = bone.parent; + } while (bone != null); + } + } + var ikConstraints = this.ikConstraints; + var transformConstraints = this.transformConstraints; + var pathConstraints = this.pathConstraints; + var ikCount = ikConstraints.length, transformCount = transformConstraints.length, pathCount = pathConstraints.length; + var constraintCount = ikCount + transformCount + pathCount; + outer: for (var i = 0; i < constraintCount; i++) { + for (var ii = 0; ii < ikCount; ii++) { + var constraint = ikConstraints[ii]; + if (constraint.data.order == i) { + this.sortIkConstraint(constraint); + continue outer; + } + } + for (var ii = 0; ii < transformCount; ii++) { + var constraint = transformConstraints[ii]; + if (constraint.data.order == i) { + this.sortTransformConstraint(constraint); + continue outer; + } + } + for (var ii = 0; ii < pathCount; ii++) { + var constraint = pathConstraints[ii]; + if (constraint.data.order == i) { + this.sortPathConstraint(constraint); + continue outer; + } + } + } + for (var i = 0, n = bones.length; i < n; i++) + this.sortBone(bones[i]); + }; + Skeleton.prototype.sortIkConstraint = function (constraint) { + constraint.active = constraint.target.isActive() && (!constraint.data.skinRequired || (this.skin != null && spine.Utils.contains(this.skin.constraints, constraint.data, true))); + if (!constraint.active) + return; + var target = constraint.target; + this.sortBone(target); + var constrained = constraint.bones; + var parent = constrained[0]; + this.sortBone(parent); + if (constrained.length > 1) { + var 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; + }; + Skeleton.prototype.sortPathConstraint = function (constraint) { + constraint.active = constraint.target.bone.isActive() && (!constraint.data.skinRequired || (this.skin != null && spine.Utils.contains(this.skin.constraints, constraint.data, true))); + if (!constraint.active) + return; + var slot = constraint.target; + var slotIndex = slot.data.index; + var 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 (var i = 0, n = this.data.skins.length; i < n; i++) + this.sortPathConstraintAttachment(this.data.skins[i], slotIndex, slotBone); + var attachment = slot.getAttachment(); + if (attachment instanceof spine.PathAttachment) + this.sortPathConstraintAttachmentWith(attachment, slotBone); + var constrained = constraint.bones; + var boneCount = constrained.length; + for (var i = 0; i < boneCount; i++) + this.sortBone(constrained[i]); + this._updateCache.push(constraint); + for (var i = 0; i < boneCount; i++) + this.sortReset(constrained[i].children); + for (var i = 0; i < boneCount; i++) + constrained[i].sorted = true; + }; + Skeleton.prototype.sortTransformConstraint = function (constraint) { + constraint.active = constraint.target.isActive() && (!constraint.data.skinRequired || (this.skin != null && spine.Utils.contains(this.skin.constraints, constraint.data, true))); + if (!constraint.active) + return; + this.sortBone(constraint.target); + var constrained = constraint.bones; + var boneCount = constrained.length; + if (constraint.data.local) { + for (var i = 0; i < boneCount; i++) { + var child = constrained[i]; + this.sortBone(child.parent); + if (!(this._updateCache.indexOf(child) > -1)) + this.updateCacheReset.push(child); + } + } + else { + for (var i = 0; i < boneCount; i++) { + this.sortBone(constrained[i]); + } + } + this._updateCache.push(constraint); + for (var ii = 0; ii < boneCount; ii++) + this.sortReset(constrained[ii].children); + for (var ii = 0; ii < boneCount; ii++) + constrained[ii].sorted = true; + }; + Skeleton.prototype.sortPathConstraintAttachment = function (skin, slotIndex, slotBone) { + var attachments = skin.attachments[slotIndex]; + if (!attachments) + return; + for (var key in attachments) { + this.sortPathConstraintAttachmentWith(attachments[key], slotBone); + } + }; + Skeleton.prototype.sortPathConstraintAttachmentWith = function (attachment, slotBone) { + if (!(attachment instanceof spine.PathAttachment)) + return; + var pathBones = attachment.bones; + if (pathBones == null) + this.sortBone(slotBone); + else { + var bones = this.bones; + var i = 0; + while (i < pathBones.length) { + var boneCount = pathBones[i++]; + for (var n = i + boneCount; i < n; i++) { + var boneIndex = pathBones[i]; + this.sortBone(bones[boneIndex]); + } + } + } + }; + Skeleton.prototype.sortBone = function (bone) { + if (bone.sorted) + return; + var parent = bone.parent; + if (parent != null) + this.sortBone(parent); + bone.sorted = true; + this._updateCache.push(bone); + }; + Skeleton.prototype.sortReset = function (bones) { + for (var i = 0, n = bones.length; i < n; i++) { + var bone = bones[i]; + if (!bone.active) + continue; + if (bone.sorted) + this.sortReset(bone.children); + bone.sorted = false; + } + }; + Skeleton.prototype.updateWorldTransform = function () { + var updateCacheReset = this.updateCacheReset; + for (var i = 0, n = updateCacheReset.length; i < n; i++) { + var 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; + } + var updateCache = this._updateCache; + for (var i = 0, n = updateCache.length; i < n; i++) + updateCache[i].update(); + }; + Skeleton.prototype.setToSetupPose = function () { + this.setBonesToSetupPose(); + this.setSlotsToSetupPose(); + }; + Skeleton.prototype.setBonesToSetupPose = function () { + var bones = this.bones; + for (var i = 0, n = bones.length; i < n; i++) + bones[i].setToSetupPose(); + var ikConstraints = this.ikConstraints; + for (var i = 0, n = ikConstraints.length; i < n; i++) { + var 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; + } + var transformConstraints = this.transformConstraints; + for (var i = 0, n = transformConstraints.length; i < n; i++) { + var constraint = transformConstraints[i]; + var data = constraint.data; + constraint.rotateMix = data.rotateMix; + constraint.translateMix = data.translateMix; + constraint.scaleMix = data.scaleMix; + constraint.shearMix = data.shearMix; + } + var pathConstraints = this.pathConstraints; + for (var i = 0, n = pathConstraints.length; i < n; i++) { + var constraint = pathConstraints[i]; + var data = constraint.data; + constraint.position = data.position; + constraint.spacing = data.spacing; + constraint.rotateMix = data.rotateMix; + constraint.translateMix = data.translateMix; + } + }; + Skeleton.prototype.setSlotsToSetupPose = function () { + var slots = this.slots; + spine.Utils.arrayCopy(slots, 0, this.drawOrder, 0, slots.length); + for (var i = 0, n = slots.length; i < n; i++) + slots[i].setToSetupPose(); + }; + Skeleton.prototype.getRootBone = function () { + if (this.bones.length == 0) + return null; + return this.bones[0]; + }; + Skeleton.prototype.findBone = function (boneName) { + if (boneName == null) + throw new Error("boneName cannot be null."); + var bones = this.bones; + for (var i = 0, n = bones.length; i < n; i++) { + var bone = bones[i]; + if (bone.data.name == boneName) + return bone; + } + return null; + }; + Skeleton.prototype.findBoneIndex = function (boneName) { + if (boneName == null) + throw new Error("boneName cannot be null."); + var bones = this.bones; + for (var i = 0, n = bones.length; i < n; i++) + if (bones[i].data.name == boneName) + return i; + return -1; + }; + Skeleton.prototype.findSlot = function (slotName) { + if (slotName == null) + throw new Error("slotName cannot be null."); + var slots = this.slots; + for (var i = 0, n = slots.length; i < n; i++) { + var slot = slots[i]; + if (slot.data.name == slotName) + return slot; + } + return null; + }; + Skeleton.prototype.findSlotIndex = function (slotName) { + if (slotName == null) + throw new Error("slotName cannot be null."); + var slots = this.slots; + for (var i = 0, n = slots.length; i < n; i++) + if (slots[i].data.name == slotName) + return i; + return -1; + }; + Skeleton.prototype.setSkinByName = function (skinName) { + var skin = this.data.findSkin(skinName); + if (skin == null) + throw new Error("Skin not found: " + skinName); + this.setSkin(skin); + }; + Skeleton.prototype.setSkin = function (newSkin) { + if (newSkin == this.skin) + return; + if (newSkin != null) { + if (this.skin != null) + newSkin.attachAll(this, this.skin); + else { + var slots = this.slots; + for (var i = 0, n = slots.length; i < n; i++) { + var slot = slots[i]; + var name_1 = slot.data.attachmentName; + if (name_1 != null) { + var attachment = newSkin.getAttachment(i, name_1); + if (attachment != null) + slot.setAttachment(attachment); + } + } + } + } + this.skin = newSkin; + this.updateCache(); + }; + Skeleton.prototype.getAttachmentByName = function (slotName, attachmentName) { + return this.getAttachment(this.data.findSlotIndex(slotName), attachmentName); + }; + Skeleton.prototype.getAttachment = function (slotIndex, attachmentName) { + if (attachmentName == null) + throw new Error("attachmentName cannot be null."); + if (this.skin != null) { + var 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; + }; + Skeleton.prototype.setAttachment = function (slotName, attachmentName) { + if (slotName == null) + throw new Error("slotName cannot be null."); + var slots = this.slots; + for (var i = 0, n = slots.length; i < n; i++) { + var slot = slots[i]; + if (slot.data.name == slotName) { + var 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); + }; + Skeleton.prototype.findIkConstraint = function (constraintName) { + if (constraintName == null) + throw new Error("constraintName cannot be null."); + var ikConstraints = this.ikConstraints; + for (var i = 0, n = ikConstraints.length; i < n; i++) { + var ikConstraint = ikConstraints[i]; + if (ikConstraint.data.name == constraintName) + return ikConstraint; + } + return null; + }; + Skeleton.prototype.findTransformConstraint = function (constraintName) { + if (constraintName == null) + throw new Error("constraintName cannot be null."); + var transformConstraints = this.transformConstraints; + for (var i = 0, n = transformConstraints.length; i < n; i++) { + var constraint = transformConstraints[i]; + if (constraint.data.name == constraintName) + return constraint; + } + return null; + }; + Skeleton.prototype.findPathConstraint = function (constraintName) { + if (constraintName == null) + throw new Error("constraintName cannot be null."); + var pathConstraints = this.pathConstraints; + for (var i = 0, n = pathConstraints.length; i < n; i++) { + var constraint = pathConstraints[i]; + if (constraint.data.name == constraintName) + return constraint; + } + return null; + }; + Skeleton.prototype.getBounds = function (offset, size, temp) { + if (temp === void 0) { temp = new Array(2); } + if (offset == null) + throw new Error("offset cannot be null."); + if (size == null) + throw new Error("size cannot be null."); + var drawOrder = this.drawOrder; + var minX = Number.POSITIVE_INFINITY, minY = Number.POSITIVE_INFINITY, maxX = Number.NEGATIVE_INFINITY, maxY = Number.NEGATIVE_INFINITY; + for (var i = 0, n = drawOrder.length; i < n; i++) { + var slot = drawOrder[i]; + if (!slot.bone.active) + continue; + var verticesLength = 0; + var vertices = null; + var attachment = slot.getAttachment(); + if (attachment instanceof spine.RegionAttachment) { + verticesLength = 8; + vertices = spine.Utils.setArraySize(temp, verticesLength, 0); + attachment.computeWorldVertices(slot.bone, vertices, 0, 2); + } + else if (attachment instanceof spine.MeshAttachment) { + var mesh = attachment; + verticesLength = mesh.worldVerticesLength; + vertices = spine.Utils.setArraySize(temp, verticesLength, 0); + mesh.computeWorldVertices(slot, 0, verticesLength, vertices, 0, 2); + } + if (vertices != null) { + for (var ii = 0, nn = vertices.length; ii < nn; ii += 2) { + var 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); + }; + Skeleton.prototype.update = function (delta) { + this.time += delta; + }; + return Skeleton; + }()); + spine.Skeleton = Skeleton; +})(spine || (spine = {})); +var spine; +(function (spine) { + var SkeletonBinary = (function () { + function SkeletonBinary(attachmentLoader) { + this.scale = 1; + this.linkedMeshes = new Array(); + this.attachmentLoader = attachmentLoader; + } + SkeletonBinary.prototype.readSkeletonData = function (binary) { + var scale = this.scale; + var skeletonData = new spine.SkeletonData(); + skeletonData.name = ""; + var input = new BinaryInput(binary); + skeletonData.hash = input.readString(); + skeletonData.version = input.readString(); + if ("3.8.75" == skeletonData.version) + throw new Error("Unsupported skeleton data, please export with a newer version of Spine."); + skeletonData.x = input.readFloat(); + skeletonData.y = input.readFloat(); + skeletonData.width = input.readFloat(); + skeletonData.height = input.readFloat(); + var nonessential = input.readBoolean(); + if (nonessential) { + skeletonData.fps = input.readFloat(); + skeletonData.imagesPath = input.readString(); + skeletonData.audioPath = input.readString(); + } + var n = 0; + n = input.readInt(true); + for (var i = 0; i < n; i++) + input.strings.push(input.readString()); + n = input.readInt(true); + for (var i = 0; i < n; i++) { + var name_2 = input.readString(); + var parent_2 = i == 0 ? null : skeletonData.bones[input.readInt(true)]; + var data = new spine.BoneData(i, name_2, parent_2); + 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) + spine.Color.rgba8888ToColor(data.color, input.readInt32()); + skeletonData.bones.push(data); + } + n = input.readInt(true); + for (var i = 0; i < n; i++) { + var slotName = input.readString(); + var boneData = skeletonData.bones[input.readInt(true)]; + var data = new spine.SlotData(i, slotName, boneData); + spine.Color.rgba8888ToColor(data.color, input.readInt32()); + var darkColor = input.readInt32(); + if (darkColor != -1) + spine.Color.rgb888ToColor(data.darkColor = new spine.Color(), darkColor); + data.attachmentName = input.readStringRef(); + data.blendMode = SkeletonBinary.BlendModeValues[input.readInt(true)]; + skeletonData.slots.push(data); + } + n = input.readInt(true); + for (var i = 0, nn = void 0; i < n; i++) { + var data = new spine.IkConstraintData(input.readString()); + data.order = input.readInt(true); + data.skinRequired = input.readBoolean(); + nn = input.readInt(true); + for (var 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); + } + n = input.readInt(true); + for (var i = 0, nn = void 0; i < n; i++) { + var data = new spine.TransformConstraintData(input.readString()); + data.order = input.readInt(true); + data.skinRequired = input.readBoolean(); + nn = input.readInt(true); + for (var 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); + } + n = input.readInt(true); + for (var i = 0, nn = void 0; i < n; i++) { + var data = new spine.PathConstraintData(input.readString()); + data.order = input.readInt(true); + data.skinRequired = input.readBoolean(); + nn = input.readInt(true); + for (var 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 == spine.PositionMode.Fixed) + data.position *= scale; + data.spacing = input.readFloat(); + if (data.spacingMode == spine.SpacingMode.Length || data.spacingMode == spine.SpacingMode.Fixed) + data.spacing *= scale; + data.rotateMix = input.readFloat(); + data.translateMix = input.readFloat(); + skeletonData.pathConstraints.push(data); + } + var defaultSkin = this.readSkin(input, skeletonData, true, nonessential); + if (defaultSkin != null) { + skeletonData.defaultSkin = defaultSkin; + skeletonData.skins.push(defaultSkin); + } + { + var i = skeletonData.skins.length; + spine.Utils.setArraySize(skeletonData.skins, n = i + input.readInt(true)); + for (; i < n; i++) + skeletonData.skins[i] = this.readSkin(input, skeletonData, false, nonessential); + } + n = this.linkedMeshes.length; + for (var i = 0; i < n; i++) { + var linkedMesh = this.linkedMeshes[i]; + var skin = linkedMesh.skin == null ? skeletonData.defaultSkin : skeletonData.findSkin(linkedMesh.skin); + if (skin == null) + throw new Error("Skin not found: " + linkedMesh.skin); + var parent_3 = skin.getAttachment(linkedMesh.slotIndex, linkedMesh.parent); + if (parent_3 == null) + throw new Error("Parent mesh not found: " + linkedMesh.parent); + linkedMesh.mesh.deformAttachment = linkedMesh.inheritDeform ? parent_3 : linkedMesh.mesh; + linkedMesh.mesh.setParentMesh(parent_3); + linkedMesh.mesh.updateUVs(); + } + this.linkedMeshes.length = 0; + n = input.readInt(true); + for (var i = 0; i < n; i++) { + var data = new spine.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); + } + n = input.readInt(true); + for (var i = 0; i < n; i++) + skeletonData.animations.push(this.readAnimation(input, input.readString(), skeletonData)); + return skeletonData; + }; + SkeletonBinary.prototype.readSkin = function (input, skeletonData, defaultSkin, nonessential) { + var skin = null; + var slotCount = 0; + if (defaultSkin) { + slotCount = input.readInt(true); + if (slotCount == 0) + return null; + skin = new spine.Skin("default"); + } + else { + skin = new spine.Skin(input.readStringRef()); + skin.bones.length = input.readInt(true); + for (var i = 0, n = skin.bones.length; i < n; i++) + skin.bones[i] = skeletonData.bones[input.readInt(true)]; + for (var i = 0, n = input.readInt(true); i < n; i++) + skin.constraints.push(skeletonData.ikConstraints[input.readInt(true)]); + for (var i = 0, n = input.readInt(true); i < n; i++) + skin.constraints.push(skeletonData.transformConstraints[input.readInt(true)]); + for (var i = 0, n = input.readInt(true); i < n; i++) + skin.constraints.push(skeletonData.pathConstraints[input.readInt(true)]); + slotCount = input.readInt(true); + } + for (var i = 0; i < slotCount; i++) { + var slotIndex = input.readInt(true); + for (var ii = 0, nn = input.readInt(true); ii < nn; ii++) { + var name_3 = input.readStringRef(); + var attachment = this.readAttachment(input, skeletonData, skin, slotIndex, name_3, nonessential); + if (attachment != null) + skin.setAttachment(slotIndex, name_3, attachment); + } + } + return skin; + }; + SkeletonBinary.prototype.readAttachment = function (input, skeletonData, skin, slotIndex, attachmentName, nonessential) { + var scale = this.scale; + var name = input.readStringRef(); + if (name == null) + name = attachmentName; + var typeIndex = input.readByte(); + var type = SkeletonBinary.AttachmentTypeValues[typeIndex]; + switch (type) { + case spine.AttachmentType.Region: { + var path = input.readStringRef(); + var rotation = input.readFloat(); + var x = input.readFloat(); + var y = input.readFloat(); + var scaleX = input.readFloat(); + var scaleY = input.readFloat(); + var width = input.readFloat(); + var height = input.readFloat(); + var color = input.readInt32(); + if (path == null) + path = name; + var 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; + spine.Color.rgba8888ToColor(region.color, color); + region.updateOffset(); + return region; + } + case spine.AttachmentType.BoundingBox: { + var vertexCount = input.readInt(true); + var vertices = this.readVertices(input, vertexCount); + var color = nonessential ? input.readInt32() : 0; + var 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) + spine.Color.rgba8888ToColor(box.color, color); + return box; + } + case spine.AttachmentType.Mesh: { + var path = input.readStringRef(); + var color = input.readInt32(); + var vertexCount = input.readInt(true); + var uvs = this.readFloatArray(input, vertexCount << 1, 1); + var triangles = this.readShortArray(input); + var vertices = this.readVertices(input, vertexCount); + var hullLength = input.readInt(true); + var edges = null; + var width = 0, height = 0; + if (nonessential) { + edges = this.readShortArray(input); + width = input.readFloat(); + height = input.readFloat(); + } + if (path == null) + path = name; + var mesh = this.attachmentLoader.newMeshAttachment(skin, name, path); + if (mesh == null) + return null; + mesh.path = path; + spine.Color.rgba8888ToColor(mesh.color, color); + mesh.bones = vertices.bones; + mesh.vertices = vertices.vertices; + mesh.worldVerticesLength = vertexCount << 1; + mesh.triangles = triangles; + mesh.regionUVs = uvs; + mesh.updateUVs(); + mesh.hullLength = hullLength << 1; + if (nonessential) { + mesh.edges = edges; + mesh.width = width * scale; + mesh.height = height * scale; + } + return mesh; + } + case spine.AttachmentType.LinkedMesh: { + var path = input.readStringRef(); + var color = input.readInt32(); + var skinName = input.readStringRef(); + var parent_4 = input.readStringRef(); + var inheritDeform = input.readBoolean(); + var width = 0, height = 0; + if (nonessential) { + width = input.readFloat(); + height = input.readFloat(); + } + if (path == null) + path = name; + var mesh = this.attachmentLoader.newMeshAttachment(skin, name, path); + if (mesh == null) + return null; + mesh.path = path; + spine.Color.rgba8888ToColor(mesh.color, color); + if (nonessential) { + mesh.width = width * scale; + mesh.height = height * scale; + } + this.linkedMeshes.push(new LinkedMesh(mesh, skinName, slotIndex, parent_4, inheritDeform)); + return mesh; + } + case spine.AttachmentType.Path: { + var closed_1 = input.readBoolean(); + var constantSpeed = input.readBoolean(); + var vertexCount = input.readInt(true); + var vertices = this.readVertices(input, vertexCount); + var lengths = spine.Utils.newArray(vertexCount / 3, 0); + for (var i = 0, n = lengths.length; i < n; i++) + lengths[i] = input.readFloat() * scale; + var color = nonessential ? input.readInt32() : 0; + var path = this.attachmentLoader.newPathAttachment(skin, name); + if (path == null) + return null; + path.closed = closed_1; + path.constantSpeed = constantSpeed; + path.worldVerticesLength = vertexCount << 1; + path.vertices = vertices.vertices; + path.bones = vertices.bones; + path.lengths = lengths; + if (nonessential) + spine.Color.rgba8888ToColor(path.color, color); + return path; + } + case spine.AttachmentType.Point: { + var rotation = input.readFloat(); + var x = input.readFloat(); + var y = input.readFloat(); + var color = nonessential ? input.readInt32() : 0; + var point = this.attachmentLoader.newPointAttachment(skin, name); + if (point == null) + return null; + point.x = x * scale; + point.y = y * scale; + point.rotation = rotation; + if (nonessential) + spine.Color.rgba8888ToColor(point.color, color); + return point; + } + case spine.AttachmentType.Clipping: { + var endSlotIndex = input.readInt(true); + var vertexCount = input.readInt(true); + var vertices = this.readVertices(input, vertexCount); + var color = nonessential ? input.readInt32() : 0; + var 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) + spine.Color.rgba8888ToColor(clip.color, color); + return clip; + } + } + return null; + }; + SkeletonBinary.prototype.readVertices = function (input, vertexCount) { + var verticesLength = vertexCount << 1; + var vertices = new Vertices(); + var scale = this.scale; + if (!input.readBoolean()) { + vertices.vertices = this.readFloatArray(input, verticesLength, scale); + return vertices; + } + var weights = new Array(); + var bonesArray = new Array(); + for (var i = 0; i < vertexCount; i++) { + var boneCount = input.readInt(true); + bonesArray.push(boneCount); + for (var 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 = spine.Utils.toFloatArray(weights); + vertices.bones = bonesArray; + return vertices; + }; + SkeletonBinary.prototype.readFloatArray = function (input, n, scale) { + var array = new Array(n); + if (scale == 1) { + for (var i = 0; i < n; i++) + array[i] = input.readFloat(); + } + else { + for (var i = 0; i < n; i++) + array[i] = input.readFloat() * scale; + } + return array; + }; + SkeletonBinary.prototype.readShortArray = function (input) { + var n = input.readInt(true); + var array = new Array(n); + for (var i = 0; i < n; i++) + array[i] = input.readShort(); + return array; + }; + SkeletonBinary.prototype.readAnimation = function (input, name, skeletonData) { + var timelines = new Array(); + var scale = this.scale; + var duration = 0; + var tempColor1 = new spine.Color(); + var tempColor2 = new spine.Color(); + for (var i = 0, n = input.readInt(true); i < n; i++) { + var slotIndex = input.readInt(true); + for (var ii = 0, nn = input.readInt(true); ii < nn; ii++) { + var timelineType = input.readByte(); + var frameCount = input.readInt(true); + switch (timelineType) { + case SkeletonBinary.SLOT_ATTACHMENT: { + var timeline = new spine.AttachmentTimeline(frameCount); + timeline.slotIndex = slotIndex; + for (var 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: { + var timeline = new spine.ColorTimeline(frameCount); + timeline.slotIndex = slotIndex; + for (var frameIndex = 0; frameIndex < frameCount; frameIndex++) { + var time = input.readFloat(); + spine.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) * spine.ColorTimeline.ENTRIES]); + break; + } + case SkeletonBinary.SLOT_TWO_COLOR: { + var timeline = new spine.TwoColorTimeline(frameCount); + timeline.slotIndex = slotIndex; + for (var frameIndex = 0; frameIndex < frameCount; frameIndex++) { + var time = input.readFloat(); + spine.Color.rgba8888ToColor(tempColor1, input.readInt32()); + spine.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) * spine.TwoColorTimeline.ENTRIES]); + break; + } + } + } + } + for (var i = 0, n = input.readInt(true); i < n; i++) { + var boneIndex = input.readInt(true); + for (var ii = 0, nn = input.readInt(true); ii < nn; ii++) { + var timelineType = input.readByte(); + var frameCount = input.readInt(true); + switch (timelineType) { + case SkeletonBinary.BONE_ROTATE: { + var timeline = new spine.RotateTimeline(frameCount); + timeline.boneIndex = boneIndex; + for (var 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) * spine.RotateTimeline.ENTRIES]); + break; + } + case SkeletonBinary.BONE_TRANSLATE: + case SkeletonBinary.BONE_SCALE: + case SkeletonBinary.BONE_SHEAR: { + var timeline = void 0; + var timelineScale = 1; + if (timelineType == SkeletonBinary.BONE_SCALE) + timeline = new spine.ScaleTimeline(frameCount); + else if (timelineType == SkeletonBinary.BONE_SHEAR) + timeline = new spine.ShearTimeline(frameCount); + else { + timeline = new spine.TranslateTimeline(frameCount); + timelineScale = scale; + } + timeline.boneIndex = boneIndex; + for (var 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) * spine.TranslateTimeline.ENTRIES]); + break; + } + } + } + } + for (var i = 0, n = input.readInt(true); i < n; i++) { + var index = input.readInt(true); + var frameCount = input.readInt(true); + var timeline = new spine.IkConstraintTimeline(frameCount); + timeline.ikConstraintIndex = index; + for (var 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) * spine.IkConstraintTimeline.ENTRIES]); + } + for (var i = 0, n = input.readInt(true); i < n; i++) { + var index = input.readInt(true); + var frameCount = input.readInt(true); + var timeline = new spine.TransformConstraintTimeline(frameCount); + timeline.transformConstraintIndex = index; + for (var 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) * spine.TransformConstraintTimeline.ENTRIES]); + } + for (var i = 0, n = input.readInt(true); i < n; i++) { + var index = input.readInt(true); + var data = skeletonData.pathConstraints[index]; + for (var ii = 0, nn = input.readInt(true); ii < nn; ii++) { + var timelineType = input.readByte(); + var frameCount = input.readInt(true); + switch (timelineType) { + case SkeletonBinary.PATH_POSITION: + case SkeletonBinary.PATH_SPACING: { + var timeline = void 0; + var timelineScale = 1; + if (timelineType == SkeletonBinary.PATH_SPACING) { + timeline = new spine.PathConstraintSpacingTimeline(frameCount); + if (data.spacingMode == spine.SpacingMode.Length || data.spacingMode == spine.SpacingMode.Fixed) + timelineScale = scale; + } + else { + timeline = new spine.PathConstraintPositionTimeline(frameCount); + if (data.positionMode == spine.PositionMode.Fixed) + timelineScale = scale; + } + timeline.pathConstraintIndex = index; + for (var 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) * spine.PathConstraintPositionTimeline.ENTRIES]); + break; + } + case SkeletonBinary.PATH_MIX: { + var timeline = new spine.PathConstraintMixTimeline(frameCount); + timeline.pathConstraintIndex = index; + for (var 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) * spine.PathConstraintMixTimeline.ENTRIES]); + break; + } + } + } + } + for (var i = 0, n = input.readInt(true); i < n; i++) { + var skin = skeletonData.skins[input.readInt(true)]; + for (var ii = 0, nn = input.readInt(true); ii < nn; ii++) { + var slotIndex = input.readInt(true); + for (var iii = 0, nnn = input.readInt(true); iii < nnn; iii++) { + var attachment = skin.getAttachment(slotIndex, input.readStringRef()); + var weighted = attachment.bones != null; + var vertices = attachment.vertices; + var deformLength = weighted ? vertices.length / 3 * 2 : vertices.length; + var frameCount = input.readInt(true); + var timeline = new spine.DeformTimeline(frameCount); + timeline.slotIndex = slotIndex; + timeline.attachment = attachment; + for (var frameIndex = 0; frameIndex < frameCount; frameIndex++) { + var time = input.readFloat(); + var deform = void 0; + var end = input.readInt(true); + if (end == 0) + deform = weighted ? spine.Utils.newFloatArray(deformLength) : vertices; + else { + deform = spine.Utils.newFloatArray(deformLength); + var start = input.readInt(true); + end += start; + if (scale == 1) { + for (var v = start; v < end; v++) + deform[v] = input.readFloat(); + } + else { + for (var v = start; v < end; v++) + deform[v] = input.readFloat() * scale; + } + if (!weighted) { + for (var 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]); + } + } + } + var drawOrderCount = input.readInt(true); + if (drawOrderCount > 0) { + var timeline = new spine.DrawOrderTimeline(drawOrderCount); + var slotCount = skeletonData.slots.length; + for (var i = 0; i < drawOrderCount; i++) { + var time = input.readFloat(); + var offsetCount = input.readInt(true); + var drawOrder = spine.Utils.newArray(slotCount, 0); + for (var ii = slotCount - 1; ii >= 0; ii--) + drawOrder[ii] = -1; + var unchanged = spine.Utils.newArray(slotCount - offsetCount, 0); + var originalIndex = 0, unchangedIndex = 0; + for (var ii = 0; ii < offsetCount; ii++) { + var slotIndex = input.readInt(true); + while (originalIndex != slotIndex) + unchanged[unchangedIndex++] = originalIndex++; + drawOrder[originalIndex + input.readInt(true)] = originalIndex++; + } + while (originalIndex < slotCount) + unchanged[unchangedIndex++] = originalIndex++; + for (var 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]); + } + var eventCount = input.readInt(true); + if (eventCount > 0) { + var timeline = new spine.EventTimeline(eventCount); + for (var i = 0; i < eventCount; i++) { + var time = input.readFloat(); + var eventData = skeletonData.events[input.readInt(true)]; + var event_4 = new spine.Event(time, eventData); + event_4.intValue = input.readInt(false); + event_4.floatValue = input.readFloat(); + event_4.stringValue = input.readBoolean() ? input.readString() : eventData.stringValue; + if (event_4.data.audioPath != null) { + event_4.volume = input.readFloat(); + event_4.balance = input.readFloat(); + } + timeline.setFrame(i, event_4); + } + timelines.push(timeline); + duration = Math.max(duration, timeline.frames[eventCount - 1]); + } + return new spine.Animation(name, timelines, duration); + }; + SkeletonBinary.prototype.readCurve = function (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; + } + }; + SkeletonBinary.prototype.setCurve = function (timeline, frameIndex, cx1, cy1, cx2, cy2) { + timeline.setCurve(frameIndex, cx1, cy1, cx2, cy2); + }; + SkeletonBinary.AttachmentTypeValues = [0, 1, 2, 3, 4, 5, 6]; + SkeletonBinary.TransformModeValues = [spine.TransformMode.Normal, spine.TransformMode.OnlyTranslation, spine.TransformMode.NoRotationOrReflection, spine.TransformMode.NoScale, spine.TransformMode.NoScaleOrReflection]; + SkeletonBinary.PositionModeValues = [spine.PositionMode.Fixed, spine.PositionMode.Percent]; + SkeletonBinary.SpacingModeValues = [spine.SpacingMode.Length, spine.SpacingMode.Fixed, spine.SpacingMode.Percent]; + SkeletonBinary.RotateModeValues = [spine.RotateMode.Tangent, spine.RotateMode.Chain, spine.RotateMode.ChainScale]; + SkeletonBinary.BlendModeValues = [spine.BlendMode.Normal, spine.BlendMode.Additive, spine.BlendMode.Multiply, spine.BlendMode.Screen]; + SkeletonBinary.BONE_ROTATE = 0; + SkeletonBinary.BONE_TRANSLATE = 1; + SkeletonBinary.BONE_SCALE = 2; + SkeletonBinary.BONE_SHEAR = 3; + SkeletonBinary.SLOT_ATTACHMENT = 0; + SkeletonBinary.SLOT_COLOR = 1; + SkeletonBinary.SLOT_TWO_COLOR = 2; + SkeletonBinary.PATH_POSITION = 0; + SkeletonBinary.PATH_SPACING = 1; + SkeletonBinary.PATH_MIX = 2; + SkeletonBinary.CURVE_LINEAR = 0; + SkeletonBinary.CURVE_STEPPED = 1; + SkeletonBinary.CURVE_BEZIER = 2; + return SkeletonBinary; + }()); + spine.SkeletonBinary = SkeletonBinary; + var BinaryInput = (function () { + function BinaryInput(data, strings, index, buffer) { + if (strings === void 0) { strings = new Array(); } + if (index === void 0) { index = 0; } + if (buffer === void 0) { buffer = new DataView(data.buffer); } + this.strings = strings; + this.index = index; + this.buffer = buffer; + } + BinaryInput.prototype.readByte = function () { + return this.buffer.getInt8(this.index++); + }; + BinaryInput.prototype.readShort = function () { + var value = this.buffer.getInt16(this.index); + this.index += 2; + return value; + }; + BinaryInput.prototype.readInt32 = function () { + var value = this.buffer.getInt32(this.index); + this.index += 4; + return value; + }; + BinaryInput.prototype.readInt = function (optimizePositive) { + var b = this.readByte(); + var 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)); + }; + BinaryInput.prototype.readStringRef = function () { + var index = this.readInt(true); + return index == 0 ? null : this.strings[index - 1]; + }; + BinaryInput.prototype.readString = function () { + var byteCount = this.readInt(true); + switch (byteCount) { + case 0: + return null; + case 1: + return ""; + } + byteCount--; + var chars = ""; + var charCount = 0; + for (var i = 0; i < byteCount;) { + var 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; + }; + BinaryInput.prototype.readFloat = function () { + var value = this.buffer.getFloat32(this.index); + this.index += 4; + return value; + }; + BinaryInput.prototype.readBoolean = function () { + return this.readByte() != 0; + }; + return BinaryInput; + }()); + var LinkedMesh = (function () { + function LinkedMesh(mesh, skin, slotIndex, parent, inheritDeform) { + this.mesh = mesh; + this.skin = skin; + this.slotIndex = slotIndex; + this.parent = parent; + this.inheritDeform = inheritDeform; + } + return LinkedMesh; + }()); + var Vertices = (function () { + function Vertices(bones, vertices) { + if (bones === void 0) { bones = null; } + if (vertices === void 0) { vertices = null; } + this.bones = bones; + this.vertices = vertices; + } + return Vertices; + }()); +})(spine || (spine = {})); +var spine; +(function (spine) { + var SkeletonBounds = (function () { + function SkeletonBounds() { + this.minX = 0; + this.minY = 0; + this.maxX = 0; + this.maxY = 0; + this.boundingBoxes = new Array(); + this.polygons = new Array(); + this.polygonPool = new spine.Pool(function () { + return spine.Utils.newFloatArray(16); + }); + } + SkeletonBounds.prototype.update = function (skeleton, updateAabb) { + if (skeleton == null) + throw new Error("skeleton cannot be null."); + var boundingBoxes = this.boundingBoxes; + var polygons = this.polygons; + var polygonPool = this.polygonPool; + var slots = skeleton.slots; + var slotCount = slots.length; + boundingBoxes.length = 0; + polygonPool.freeAll(polygons); + polygons.length = 0; + for (var i = 0; i < slotCount; i++) { + var slot = slots[i]; + if (!slot.bone.active) + continue; + var attachment = slot.getAttachment(); + if (attachment instanceof spine.BoundingBoxAttachment) { + var boundingBox = attachment; + boundingBoxes.push(boundingBox); + var polygon = polygonPool.obtain(); + if (polygon.length != boundingBox.worldVerticesLength) { + polygon = spine.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; + } + }; + SkeletonBounds.prototype.aabbCompute = function () { + var minX = Number.POSITIVE_INFINITY, minY = Number.POSITIVE_INFINITY, maxX = Number.NEGATIVE_INFINITY, maxY = Number.NEGATIVE_INFINITY; + var polygons = this.polygons; + for (var i = 0, n = polygons.length; i < n; i++) { + var polygon = polygons[i]; + var vertices = polygon; + for (var ii = 0, nn = polygon.length; ii < nn; ii += 2) { + var x = vertices[ii]; + var 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; + }; + SkeletonBounds.prototype.aabbContainsPoint = function (x, y) { + return x >= this.minX && x <= this.maxX && y >= this.minY && y <= this.maxY; + }; + SkeletonBounds.prototype.aabbIntersectsSegment = function (x1, y1, x2, y2) { + var minX = this.minX; + var minY = this.minY; + var maxX = this.maxX; + var maxY = this.maxY; + if ((x1 <= minX && x2 <= minX) || (y1 <= minY && y2 <= minY) || (x1 >= maxX && x2 >= maxX) || (y1 >= maxY && y2 >= maxY)) + return false; + var m = (y2 - y1) / (x2 - x1); + var y = m * (minX - x1) + y1; + if (y > minY && y < maxY) + return true; + y = m * (maxX - x1) + y1; + if (y > minY && y < maxY) + return true; + var 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; + }; + SkeletonBounds.prototype.aabbIntersectsSkeleton = function (bounds) { + return this.minX < bounds.maxX && this.maxX > bounds.minX && this.minY < bounds.maxY && this.maxY > bounds.minY; + }; + SkeletonBounds.prototype.containsPoint = function (x, y) { + var polygons = this.polygons; + for (var i = 0, n = polygons.length; i < n; i++) + if (this.containsPointPolygon(polygons[i], x, y)) + return this.boundingBoxes[i]; + return null; + }; + SkeletonBounds.prototype.containsPointPolygon = function (polygon, x, y) { + var vertices = polygon; + var nn = polygon.length; + var prevIndex = nn - 2; + var inside = false; + for (var ii = 0; ii < nn; ii += 2) { + var vertexY = vertices[ii + 1]; + var prevY = vertices[prevIndex + 1]; + if ((vertexY < y && prevY >= y) || (prevY < y && vertexY >= y)) { + var vertexX = vertices[ii]; + if (vertexX + (y - vertexY) / (prevY - vertexY) * (vertices[prevIndex] - vertexX) < x) + inside = !inside; + } + prevIndex = ii; + } + return inside; + }; + SkeletonBounds.prototype.intersectsSegment = function (x1, y1, x2, y2) { + var polygons = this.polygons; + for (var i = 0, n = polygons.length; i < n; i++) + if (this.intersectsSegmentPolygon(polygons[i], x1, y1, x2, y2)) + return this.boundingBoxes[i]; + return null; + }; + SkeletonBounds.prototype.intersectsSegmentPolygon = function (polygon, x1, y1, x2, y2) { + var vertices = polygon; + var nn = polygon.length; + var width12 = x1 - x2, height12 = y1 - y2; + var det1 = x1 * y2 - y1 * x2; + var x3 = vertices[nn - 2], y3 = vertices[nn - 1]; + for (var ii = 0; ii < nn; ii += 2) { + var x4 = vertices[ii], y4 = vertices[ii + 1]; + var det2 = x3 * y4 - y3 * x4; + var width34 = x3 - x4, height34 = y3 - y4; + var det3 = width12 * height34 - height12 * width34; + var x = (det1 * width34 - width12 * det2) / det3; + if (((x >= x3 && x <= x4) || (x >= x4 && x <= x3)) && ((x >= x1 && x <= x2) || (x >= x2 && x <= x1))) { + var 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; + }; + SkeletonBounds.prototype.getPolygon = function (boundingBox) { + if (boundingBox == null) + throw new Error("boundingBox cannot be null."); + var index = this.boundingBoxes.indexOf(boundingBox); + return index == -1 ? null : this.polygons[index]; + }; + SkeletonBounds.prototype.getWidth = function () { + return this.maxX - this.minX; + }; + SkeletonBounds.prototype.getHeight = function () { + return this.maxY - this.minY; + }; + return SkeletonBounds; + }()); + spine.SkeletonBounds = SkeletonBounds; +})(spine || (spine = {})); +var spine; +(function (spine) { + var SkeletonClipping = (function () { + function SkeletonClipping() { + this.triangulator = new spine.Triangulator(); + this.clippingPolygon = new Array(); + this.clipOutput = new Array(); + this.clippedVertices = new Array(); + this.clippedTriangles = new Array(); + this.scratch = new Array(); + } + SkeletonClipping.prototype.clipStart = function (slot, clip) { + if (this.clipAttachment != null) + return 0; + this.clipAttachment = clip; + var n = clip.worldVerticesLength; + var vertices = spine.Utils.setArraySize(this.clippingPolygon, n); + clip.computeWorldVertices(slot, 0, n, vertices, 0, 2); + var clippingPolygon = this.clippingPolygon; + SkeletonClipping.makeClockwise(clippingPolygon); + var clippingPolygons = this.clippingPolygons = this.triangulator.decompose(clippingPolygon, this.triangulator.triangulate(clippingPolygon)); + for (var i = 0, n_2 = clippingPolygons.length; i < n_2; i++) { + var polygon = clippingPolygons[i]; + SkeletonClipping.makeClockwise(polygon); + polygon.push(polygon[0]); + polygon.push(polygon[1]); + } + return clippingPolygons.length; + }; + SkeletonClipping.prototype.clipEndWithSlot = function (slot) { + if (this.clipAttachment != null && this.clipAttachment.endSlot == slot.data) + this.clipEnd(); + }; + SkeletonClipping.prototype.clipEnd = function () { + if (this.clipAttachment == null) + return; + this.clipAttachment = null; + this.clippingPolygons = null; + this.clippedVertices.length = 0; + this.clippedTriangles.length = 0; + this.clippingPolygon.length = 0; + }; + SkeletonClipping.prototype.isClipping = function () { + return this.clipAttachment != null; + }; + SkeletonClipping.prototype.clipTriangles = function (vertices, verticesLength, triangles, trianglesLength, uvs, light, dark, twoColor) { + var clipOutput = this.clipOutput, clippedVertices = this.clippedVertices; + var clippedTriangles = this.clippedTriangles; + var polygons = this.clippingPolygons; + var polygonsCount = this.clippingPolygons.length; + var vertexSize = twoColor ? 12 : 8; + var index = 0; + clippedVertices.length = 0; + clippedTriangles.length = 0; + outer: for (var i = 0; i < trianglesLength; i += 3) { + var vertexOffset = triangles[i] << 1; + var x1 = vertices[vertexOffset], y1 = vertices[vertexOffset + 1]; + var u1 = uvs[vertexOffset], v1 = uvs[vertexOffset + 1]; + vertexOffset = triangles[i + 1] << 1; + var x2 = vertices[vertexOffset], y2 = vertices[vertexOffset + 1]; + var u2 = uvs[vertexOffset], v2 = uvs[vertexOffset + 1]; + vertexOffset = triangles[i + 2] << 1; + var x3 = vertices[vertexOffset], y3 = vertices[vertexOffset + 1]; + var u3 = uvs[vertexOffset], v3 = uvs[vertexOffset + 1]; + for (var p = 0; p < polygonsCount; p++) { + var s = clippedVertices.length; + if (this.clip(x1, y1, x2, y2, x3, y3, polygons[p], clipOutput)) { + var clipOutputLength = clipOutput.length; + if (clipOutputLength == 0) + continue; + var d0 = y2 - y3, d1 = x3 - x2, d2 = x1 - x3, d4 = y3 - y1; + var d = 1 / (d0 * d2 + d1 * (y1 - y3)); + var clipOutputCount = clipOutputLength >> 1; + var clipOutputItems = this.clipOutput; + var clippedVerticesItems = spine.Utils.setArraySize(clippedVertices, s + clipOutputCount * vertexSize); + for (var ii = 0; ii < clipOutputLength; ii += 2) { + var x = clipOutputItems[ii], y = clipOutputItems[ii + 1]; + clippedVerticesItems[s] = x; + clippedVerticesItems[s + 1] = y; + clippedVerticesItems[s + 2] = light.r; + clippedVerticesItems[s + 3] = light.g; + clippedVerticesItems[s + 4] = light.b; + clippedVerticesItems[s + 5] = light.a; + var c0 = x - x3, c1 = y - y3; + var a = (d0 * c0 + d1 * c1) * d; + var b = (d4 * c0 + d2 * c1) * d; + var c = 1 - a - b; + clippedVerticesItems[s + 6] = u1 * a + u2 * b + u3 * c; + clippedVerticesItems[s + 7] = v1 * a + v2 * b + v3 * c; + if (twoColor) { + clippedVerticesItems[s + 8] = dark.r; + clippedVerticesItems[s + 9] = dark.g; + clippedVerticesItems[s + 10] = dark.b; + clippedVerticesItems[s + 11] = dark.a; + } + s += vertexSize; + } + s = clippedTriangles.length; + var clippedTrianglesItems = spine.Utils.setArraySize(clippedTriangles, s + 3 * (clipOutputCount - 2)); + clipOutputCount--; + for (var ii = 1; ii < clipOutputCount; ii++) { + clippedTrianglesItems[s] = index; + clippedTrianglesItems[s + 1] = (index + ii); + clippedTrianglesItems[s + 2] = (index + ii + 1); + s += 3; + } + index += clipOutputCount + 1; + } + else { + var clippedVerticesItems = spine.Utils.setArraySize(clippedVertices, s + 3 * vertexSize); + clippedVerticesItems[s] = x1; + clippedVerticesItems[s + 1] = y1; + clippedVerticesItems[s + 2] = light.r; + clippedVerticesItems[s + 3] = light.g; + clippedVerticesItems[s + 4] = light.b; + clippedVerticesItems[s + 5] = light.a; + if (!twoColor) { + clippedVerticesItems[s + 6] = u1; + clippedVerticesItems[s + 7] = v1; + clippedVerticesItems[s + 8] = x2; + clippedVerticesItems[s + 9] = y2; + clippedVerticesItems[s + 10] = light.r; + clippedVerticesItems[s + 11] = light.g; + clippedVerticesItems[s + 12] = light.b; + clippedVerticesItems[s + 13] = light.a; + clippedVerticesItems[s + 14] = u2; + clippedVerticesItems[s + 15] = v2; + clippedVerticesItems[s + 16] = x3; + clippedVerticesItems[s + 17] = y3; + clippedVerticesItems[s + 18] = light.r; + clippedVerticesItems[s + 19] = light.g; + clippedVerticesItems[s + 20] = light.b; + clippedVerticesItems[s + 21] = light.a; + clippedVerticesItems[s + 22] = u3; + clippedVerticesItems[s + 23] = v3; + } + else { + clippedVerticesItems[s + 6] = u1; + clippedVerticesItems[s + 7] = v1; + clippedVerticesItems[s + 8] = dark.r; + clippedVerticesItems[s + 9] = dark.g; + clippedVerticesItems[s + 10] = dark.b; + clippedVerticesItems[s + 11] = dark.a; + clippedVerticesItems[s + 12] = x2; + clippedVerticesItems[s + 13] = y2; + clippedVerticesItems[s + 14] = light.r; + clippedVerticesItems[s + 15] = light.g; + clippedVerticesItems[s + 16] = light.b; + clippedVerticesItems[s + 17] = light.a; + clippedVerticesItems[s + 18] = u2; + clippedVerticesItems[s + 19] = v2; + clippedVerticesItems[s + 20] = dark.r; + clippedVerticesItems[s + 21] = dark.g; + clippedVerticesItems[s + 22] = dark.b; + clippedVerticesItems[s + 23] = dark.a; + clippedVerticesItems[s + 24] = x3; + clippedVerticesItems[s + 25] = y3; + clippedVerticesItems[s + 26] = light.r; + clippedVerticesItems[s + 27] = light.g; + clippedVerticesItems[s + 28] = light.b; + clippedVerticesItems[s + 29] = light.a; + clippedVerticesItems[s + 30] = u3; + clippedVerticesItems[s + 31] = v3; + clippedVerticesItems[s + 32] = dark.r; + clippedVerticesItems[s + 33] = dark.g; + clippedVerticesItems[s + 34] = dark.b; + clippedVerticesItems[s + 35] = dark.a; + } + s = clippedTriangles.length; + var clippedTrianglesItems = spine.Utils.setArraySize(clippedTriangles, s + 3); + clippedTrianglesItems[s] = index; + clippedTrianglesItems[s + 1] = (index + 1); + clippedTrianglesItems[s + 2] = (index + 2); + index += 3; + continue outer; + } + } + } + }; + SkeletonClipping.prototype.clip = function (x1, y1, x2, y2, x3, y3, clippingArea, output) { + var originalOutput = output; + var clipped = false; + var input = null; + if (clippingArea.length % 4 >= 2) { + input = output; + output = this.scratch; + } + else + input = this.scratch; + input.length = 0; + input.push(x1); + input.push(y1); + input.push(x2); + input.push(y2); + input.push(x3); + input.push(y3); + input.push(x1); + input.push(y1); + output.length = 0; + var clippingVertices = clippingArea; + var clippingVerticesLast = clippingArea.length - 4; + for (var i = 0;; i += 2) { + var edgeX = clippingVertices[i], edgeY = clippingVertices[i + 1]; + var edgeX2 = clippingVertices[i + 2], edgeY2 = clippingVertices[i + 3]; + var deltaX = edgeX - edgeX2, deltaY = edgeY - edgeY2; + var inputVertices = input; + var inputVerticesLength = input.length - 2, outputStart = output.length; + for (var ii = 0; ii < inputVerticesLength; ii += 2) { + var inputX = inputVertices[ii], inputY = inputVertices[ii + 1]; + var inputX2 = inputVertices[ii + 2], inputY2 = inputVertices[ii + 3]; + var side2 = deltaX * (inputY2 - edgeY2) - deltaY * (inputX2 - edgeX2) > 0; + if (deltaX * (inputY - edgeY2) - deltaY * (inputX - edgeX2) > 0) { + if (side2) { + output.push(inputX2); + output.push(inputY2); + continue; + } + var c0 = inputY2 - inputY, c2 = inputX2 - inputX; + var s = c0 * (edgeX2 - edgeX) - c2 * (edgeY2 - edgeY); + if (Math.abs(s) > 0.000001) { + var ua = (c2 * (edgeY - inputY) - c0 * (edgeX - inputX)) / s; + output.push(edgeX + (edgeX2 - edgeX) * ua); + output.push(edgeY + (edgeY2 - edgeY) * ua); + } + else { + output.push(edgeX); + output.push(edgeY); + } + } + else if (side2) { + var c0 = inputY2 - inputY, c2 = inputX2 - inputX; + var s = c0 * (edgeX2 - edgeX) - c2 * (edgeY2 - edgeY); + if (Math.abs(s) > 0.000001) { + var ua = (c2 * (edgeY - inputY) - c0 * (edgeX - inputX)) / s; + output.push(edgeX + (edgeX2 - edgeX) * ua); + output.push(edgeY + (edgeY2 - edgeY) * ua); + } + else { + output.push(edgeX); + output.push(edgeY); + } + output.push(inputX2); + output.push(inputY2); + } + clipped = true; + } + if (outputStart == output.length) { + originalOutput.length = 0; + return true; + } + output.push(output[0]); + output.push(output[1]); + if (i == clippingVerticesLast) + break; + var temp = output; + output = input; + output.length = 0; + input = temp; + } + if (originalOutput != output) { + originalOutput.length = 0; + for (var i = 0, n = output.length - 2; i < n; i++) + originalOutput[i] = output[i]; + } + else + originalOutput.length = originalOutput.length - 2; + return clipped; + }; + SkeletonClipping.makeClockwise = function (polygon) { + var vertices = polygon; + var verticeslength = polygon.length; + var area = vertices[verticeslength - 2] * vertices[1] - vertices[0] * vertices[verticeslength - 1], p1x = 0, p1y = 0, p2x = 0, p2y = 0; + for (var i = 0, n = verticeslength - 3; i < n; i += 2) { + p1x = vertices[i]; + p1y = vertices[i + 1]; + p2x = vertices[i + 2]; + p2y = vertices[i + 3]; + area += p1x * p2y - p2x * p1y; + } + if (area < 0) + return; + for (var i = 0, lastX = verticeslength - 2, n = verticeslength >> 1; i < n; i += 2) { + var x = vertices[i], y = vertices[i + 1]; + var other = lastX - i; + vertices[i] = vertices[other]; + vertices[i + 1] = vertices[other + 1]; + vertices[other] = x; + vertices[other + 1] = y; + } + }; + return SkeletonClipping; + }()); + spine.SkeletonClipping = SkeletonClipping; +})(spine || (spine = {})); +var spine; +(function (spine) { + var SkeletonData = (function () { + function SkeletonData() { + this.bones = new Array(); + this.slots = new Array(); + this.skins = new Array(); + this.events = new Array(); + this.animations = new Array(); + this.ikConstraints = new Array(); + this.transformConstraints = new Array(); + this.pathConstraints = new Array(); + this.fps = 0; + } + SkeletonData.prototype.findBone = function (boneName) { + if (boneName == null) + throw new Error("boneName cannot be null."); + var bones = this.bones; + for (var i = 0, n = bones.length; i < n; i++) { + var bone = bones[i]; + if (bone.name == boneName) + return bone; + } + return null; + }; + SkeletonData.prototype.findBoneIndex = function (boneName) { + if (boneName == null) + throw new Error("boneName cannot be null."); + var bones = this.bones; + for (var i = 0, n = bones.length; i < n; i++) + if (bones[i].name == boneName) + return i; + return -1; + }; + SkeletonData.prototype.findSlot = function (slotName) { + if (slotName == null) + throw new Error("slotName cannot be null."); + var slots = this.slots; + for (var i = 0, n = slots.length; i < n; i++) { + var slot = slots[i]; + if (slot.name == slotName) + return slot; + } + return null; + }; + SkeletonData.prototype.findSlotIndex = function (slotName) { + if (slotName == null) + throw new Error("slotName cannot be null."); + var slots = this.slots; + for (var i = 0, n = slots.length; i < n; i++) + if (slots[i].name == slotName) + return i; + return -1; + }; + SkeletonData.prototype.findSkin = function (skinName) { + if (skinName == null) + throw new Error("skinName cannot be null."); + var skins = this.skins; + for (var i = 0, n = skins.length; i < n; i++) { + var skin = skins[i]; + if (skin.name == skinName) + return skin; + } + return null; + }; + SkeletonData.prototype.findEvent = function (eventDataName) { + if (eventDataName == null) + throw new Error("eventDataName cannot be null."); + var events = this.events; + for (var i = 0, n = events.length; i < n; i++) { + var event_5 = events[i]; + if (event_5.name == eventDataName) + return event_5; + } + return null; + }; + SkeletonData.prototype.findAnimation = function (animationName) { + if (animationName == null) + throw new Error("animationName cannot be null."); + var animations = this.animations; + for (var i = 0, n = animations.length; i < n; i++) { + var animation = animations[i]; + if (animation.name == animationName) + return animation; + } + return null; + }; + SkeletonData.prototype.findIkConstraint = function (constraintName) { + if (constraintName == null) + throw new Error("constraintName cannot be null."); + var ikConstraints = this.ikConstraints; + for (var i = 0, n = ikConstraints.length; i < n; i++) { + var constraint = ikConstraints[i]; + if (constraint.name == constraintName) + return constraint; + } + return null; + }; + SkeletonData.prototype.findTransformConstraint = function (constraintName) { + if (constraintName == null) + throw new Error("constraintName cannot be null."); + var transformConstraints = this.transformConstraints; + for (var i = 0, n = transformConstraints.length; i < n; i++) { + var constraint = transformConstraints[i]; + if (constraint.name == constraintName) + return constraint; + } + return null; + }; + SkeletonData.prototype.findPathConstraint = function (constraintName) { + if (constraintName == null) + throw new Error("constraintName cannot be null."); + var pathConstraints = this.pathConstraints; + for (var i = 0, n = pathConstraints.length; i < n; i++) { + var constraint = pathConstraints[i]; + if (constraint.name == constraintName) + return constraint; + } + return null; + }; + SkeletonData.prototype.findPathConstraintIndex = function (pathConstraintName) { + if (pathConstraintName == null) + throw new Error("pathConstraintName cannot be null."); + var pathConstraints = this.pathConstraints; + for (var i = 0, n = pathConstraints.length; i < n; i++) + if (pathConstraints[i].name == pathConstraintName) + return i; + return -1; + }; + return SkeletonData; + }()); + spine.SkeletonData = SkeletonData; +})(spine || (spine = {})); +var spine; +(function (spine) { + var SkeletonJson = (function () { + function SkeletonJson(attachmentLoader) { + this.scale = 1; + this.linkedMeshes = new Array(); + this.attachmentLoader = attachmentLoader; + } + SkeletonJson.prototype.readSkeletonData = function (json) { + var scale = this.scale; + var skeletonData = new spine.SkeletonData(); + var root = typeof (json) === "string" ? JSON.parse(json) : json; + var skeletonMap = root.skeleton; + if (skeletonMap != null) { + skeletonData.hash = skeletonMap.hash; + skeletonData.version = skeletonMap.spine; + if ("3.8.75" == skeletonData.version) + throw new Error("Unsupported skeleton data, please export with a newer version of Spine."); + skeletonData.x = skeletonMap.x; + skeletonData.y = skeletonMap.y; + skeletonData.width = skeletonMap.width; + skeletonData.height = skeletonMap.height; + skeletonData.fps = skeletonMap.fps; + skeletonData.imagesPath = skeletonMap.images; + } + if (root.bones) { + for (var i = 0; i < root.bones.length; i++) { + var boneMap = root.bones[i]; + var parent_5 = null; + var parentName = this.getValue(boneMap, "parent", null); + if (parentName != null) { + parent_5 = skeletonData.findBone(parentName); + if (parent_5 == null) + throw new Error("Parent bone not found: " + parentName); + } + var data = new spine.BoneData(skeletonData.bones.length, boneMap.name, parent_5); + 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); + } + } + if (root.slots) { + for (var i = 0; i < root.slots.length; i++) { + var slotMap = root.slots[i]; + var slotName = slotMap.name; + var boneName = slotMap.bone; + var boneData = skeletonData.findBone(boneName); + if (boneData == null) + throw new Error("Slot bone not found: " + boneName); + var data = new spine.SlotData(skeletonData.slots.length, slotName, boneData); + var color = this.getValue(slotMap, "color", null); + if (color != null) + data.color.setFromString(color); + var dark = this.getValue(slotMap, "dark", null); + if (dark != null) { + data.darkColor = new spine.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); + } + } + if (root.ik) { + for (var i = 0; i < root.ik.length; i++) { + var constraintMap = root.ik[i]; + var data = new spine.IkConstraintData(constraintMap.name); + data.order = this.getValue(constraintMap, "order", 0); + data.skinRequired = this.getValue(constraintMap, "skin", false); + for (var j = 0; j < constraintMap.bones.length; j++) { + var boneName = constraintMap.bones[j]; + var bone = skeletonData.findBone(boneName); + if (bone == null) + throw new Error("IK bone not found: " + boneName); + data.bones.push(bone); + } + var 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); + } + } + if (root.transform) { + for (var i = 0; i < root.transform.length; i++) { + var constraintMap = root.transform[i]; + var data = new spine.TransformConstraintData(constraintMap.name); + data.order = this.getValue(constraintMap, "order", 0); + data.skinRequired = this.getValue(constraintMap, "skin", false); + for (var j = 0; j < constraintMap.bones.length; j++) { + var boneName = constraintMap.bones[j]; + var bone = skeletonData.findBone(boneName); + if (bone == null) + throw new Error("Transform constraint bone not found: " + boneName); + data.bones.push(bone); + } + var 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); + } + } + if (root.path) { + for (var i = 0; i < root.path.length; i++) { + var constraintMap = root.path[i]; + var data = new spine.PathConstraintData(constraintMap.name); + data.order = this.getValue(constraintMap, "order", 0); + data.skinRequired = this.getValue(constraintMap, "skin", false); + for (var j = 0; j < constraintMap.bones.length; j++) { + var boneName = constraintMap.bones[j]; + var bone = skeletonData.findBone(boneName); + if (bone == null) + throw new Error("Transform constraint bone not found: " + boneName); + data.bones.push(bone); + } + var 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 == spine.PositionMode.Fixed) + data.position *= scale; + data.spacing = this.getValue(constraintMap, "spacing", 0); + if (data.spacingMode == spine.SpacingMode.Length || data.spacingMode == spine.SpacingMode.Fixed) + data.spacing *= scale; + data.rotateMix = this.getValue(constraintMap, "rotateMix", 1); + data.translateMix = this.getValue(constraintMap, "translateMix", 1); + skeletonData.pathConstraints.push(data); + } + } + if (root.skins) { + for (var i = 0; i < root.skins.length; i++) { + var skinMap = root.skins[i]; + var skin = new spine.Skin(skinMap.name); + if (skinMap.bones) { + for (var ii = 0; ii < skinMap.bones.length; ii++) { + var 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 (var ii = 0; ii < skinMap.ik.length; ii++) { + var 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 (var ii = 0; ii < skinMap.transform.length; ii++) { + var 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 (var ii = 0; ii < skinMap.path.length; ii++) { + var 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 (var slotName in skinMap.attachments) { + var slot = skeletonData.findSlot(slotName); + if (slot == null) + throw new Error("Slot not found: " + slotName); + var slotMap = skinMap.attachments[slotName]; + for (var entryName in slotMap) { + var 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; + } + } + for (var i = 0, n = this.linkedMeshes.length; i < n; i++) { + var linkedMesh = this.linkedMeshes[i]; + var skin = linkedMesh.skin == null ? skeletonData.defaultSkin : skeletonData.findSkin(linkedMesh.skin); + if (skin == null) + throw new Error("Skin not found: " + linkedMesh.skin); + var parent_6 = skin.getAttachment(linkedMesh.slotIndex, linkedMesh.parent); + if (parent_6 == null) + throw new Error("Parent mesh not found: " + linkedMesh.parent); + linkedMesh.mesh.deformAttachment = linkedMesh.inheritDeform ? parent_6 : linkedMesh.mesh; + linkedMesh.mesh.setParentMesh(parent_6); + linkedMesh.mesh.updateUVs(); + } + this.linkedMeshes.length = 0; + if (root.events) { + for (var eventName in root.events) { + var eventMap = root.events[eventName]; + var data = new spine.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); + } + } + if (root.animations) { + for (var animationName in root.animations) { + var animationMap = root.animations[animationName]; + this.readAnimation(animationMap, animationName, skeletonData); + } + } + return skeletonData; + }; + SkeletonJson.prototype.readAttachment = function (map, skin, slotIndex, name, skeletonData) { + var scale = this.scale; + name = this.getValue(map, "name", name); + var type = this.getValue(map, "type", "region"); + switch (type) { + case "region": { + var path = this.getValue(map, "path", name); + var 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; + var color = this.getValue(map, "color", null); + if (color != null) + region.color.setFromString(color); + region.updateOffset(); + return region; + } + case "boundingbox": { + var box = this.attachmentLoader.newBoundingBoxAttachment(skin, name); + if (box == null) + return null; + this.readVertices(map, box, map.vertexCount << 1); + var color = this.getValue(map, "color", null); + if (color != null) + box.color.setFromString(color); + return box; + } + case "mesh": + case "linkedmesh": { + var path = this.getValue(map, "path", name); + var mesh = this.attachmentLoader.newMeshAttachment(skin, name, path); + if (mesh == null) + return null; + mesh.path = path; + var 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; + var parent_7 = this.getValue(map, "parent", null); + if (parent_7 != null) { + this.linkedMeshes.push(new LinkedMesh(mesh, this.getValue(map, "skin", null), slotIndex, parent_7, this.getValue(map, "deform", true))); + return mesh; + } + var uvs = map.uvs; + this.readVertices(map, mesh, uvs.length); + mesh.triangles = map.triangles; + mesh.regionUVs = uvs; + mesh.updateUVs(); + mesh.edges = this.getValue(map, "edges", null); + mesh.hullLength = this.getValue(map, "hull", 0) * 2; + return mesh; + } + case "path": { + var 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); + var vertexCount = map.vertexCount; + this.readVertices(map, path, vertexCount << 1); + var lengths = spine.Utils.newArray(vertexCount / 3, 0); + for (var i = 0; i < map.lengths.length; i++) + lengths[i] = map.lengths[i] * scale; + path.lengths = lengths; + var color = this.getValue(map, "color", null); + if (color != null) + path.color.setFromString(color); + return path; + } + case "point": { + var 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); + var color = this.getValue(map, "color", null); + if (color != null) + point.color.setFromString(color); + return point; + } + case "clipping": { + var clip = this.attachmentLoader.newClippingAttachment(skin, name); + if (clip == null) + return null; + var end = this.getValue(map, "end", null); + if (end != null) { + var slot = skeletonData.findSlot(end); + if (slot == null) + throw new Error("Clipping end slot not found: " + end); + clip.endSlot = slot; + } + var vertexCount = map.vertexCount; + this.readVertices(map, clip, vertexCount << 1); + var color = this.getValue(map, "color", null); + if (color != null) + clip.color.setFromString(color); + return clip; + } + } + return null; + }; + SkeletonJson.prototype.readVertices = function (map, attachment, verticesLength) { + var scale = this.scale; + attachment.worldVerticesLength = verticesLength; + var vertices = map.vertices; + if (verticesLength == vertices.length) { + var scaledVertices = spine.Utils.toFloatArray(vertices); + if (scale != 1) { + for (var i = 0, n = vertices.length; i < n; i++) + scaledVertices[i] *= scale; + } + attachment.vertices = scaledVertices; + return; + } + var weights = new Array(); + var bones = new Array(); + for (var i = 0, n = vertices.length; i < n;) { + var boneCount = vertices[i++]; + bones.push(boneCount); + for (var 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 = spine.Utils.toFloatArray(weights); + }; + SkeletonJson.prototype.readAnimation = function (map, name, skeletonData) { + var scale = this.scale; + var timelines = new Array(); + var duration = 0; + if (map.slots) { + for (var slotName in map.slots) { + var slotMap = map.slots[slotName]; + var slotIndex = skeletonData.findSlotIndex(slotName); + if (slotIndex == -1) + throw new Error("Slot not found: " + slotName); + for (var timelineName in slotMap) { + var timelineMap = slotMap[timelineName]; + if (timelineName == "attachment") { + var timeline = new spine.AttachmentTimeline(timelineMap.length); + timeline.slotIndex = slotIndex; + var frameIndex = 0; + for (var i = 0; i < timelineMap.length; i++) { + var 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") { + var timeline = new spine.ColorTimeline(timelineMap.length); + timeline.slotIndex = slotIndex; + var frameIndex = 0; + for (var i = 0; i < timelineMap.length; i++) { + var valueMap = timelineMap[i]; + var color = new spine.Color(); + color.setFromString(valueMap.color); + 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) * spine.ColorTimeline.ENTRIES]); + } + else if (timelineName == "twoColor") { + var timeline = new spine.TwoColorTimeline(timelineMap.length); + timeline.slotIndex = slotIndex; + var frameIndex = 0; + for (var i = 0; i < timelineMap.length; i++) { + var valueMap = timelineMap[i]; + var light = new spine.Color(); + var dark = new spine.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) * spine.TwoColorTimeline.ENTRIES]); + } + else + throw new Error("Invalid timeline type for a slot: " + timelineName + " (" + slotName + ")"); + } + } + } + if (map.bones) { + for (var boneName in map.bones) { + var boneMap = map.bones[boneName]; + var boneIndex = skeletonData.findBoneIndex(boneName); + if (boneIndex == -1) + throw new Error("Bone not found: " + boneName); + for (var timelineName in boneMap) { + var timelineMap = boneMap[timelineName]; + if (timelineName === "rotate") { + var timeline = new spine.RotateTimeline(timelineMap.length); + timeline.boneIndex = boneIndex; + var frameIndex = 0; + for (var i = 0; i < timelineMap.length; i++) { + var 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) * spine.RotateTimeline.ENTRIES]); + } + else if (timelineName === "translate" || timelineName === "scale" || timelineName === "shear") { + var timeline = null; + var timelineScale = 1, defaultValue = 0; + if (timelineName === "scale") { + timeline = new spine.ScaleTimeline(timelineMap.length); + defaultValue = 1; + } + else if (timelineName === "shear") + timeline = new spine.ShearTimeline(timelineMap.length); + else { + timeline = new spine.TranslateTimeline(timelineMap.length); + timelineScale = scale; + } + timeline.boneIndex = boneIndex; + var frameIndex = 0; + for (var i = 0; i < timelineMap.length; i++) { + var valueMap = timelineMap[i]; + var 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) * spine.TranslateTimeline.ENTRIES]); + } + else + throw new Error("Invalid timeline type for a bone: " + timelineName + " (" + boneName + ")"); + } + } + } + if (map.ik) { + for (var constraintName in map.ik) { + var constraintMap = map.ik[constraintName]; + var constraint = skeletonData.findIkConstraint(constraintName); + var timeline = new spine.IkConstraintTimeline(constraintMap.length); + timeline.ikConstraintIndex = skeletonData.ikConstraints.indexOf(constraint); + var frameIndex = 0; + for (var i = 0; i < constraintMap.length; i++) { + var 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) * spine.IkConstraintTimeline.ENTRIES]); + } + } + if (map.transform) { + for (var constraintName in map.transform) { + var constraintMap = map.transform[constraintName]; + var constraint = skeletonData.findTransformConstraint(constraintName); + var timeline = new spine.TransformConstraintTimeline(constraintMap.length); + timeline.transformConstraintIndex = skeletonData.transformConstraints.indexOf(constraint); + var frameIndex = 0; + for (var i = 0; i < constraintMap.length; i++) { + var 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) * spine.TransformConstraintTimeline.ENTRIES]); + } + } + if (map.path) { + for (var constraintName in map.path) { + var constraintMap = map.path[constraintName]; + var index = skeletonData.findPathConstraintIndex(constraintName); + if (index == -1) + throw new Error("Path constraint not found: " + constraintName); + var data = skeletonData.pathConstraints[index]; + for (var timelineName in constraintMap) { + var timelineMap = constraintMap[timelineName]; + if (timelineName === "position" || timelineName === "spacing") { + var timeline = null; + var timelineScale = 1; + if (timelineName === "spacing") { + timeline = new spine.PathConstraintSpacingTimeline(timelineMap.length); + if (data.spacingMode == spine.SpacingMode.Length || data.spacingMode == spine.SpacingMode.Fixed) + timelineScale = scale; + } + else { + timeline = new spine.PathConstraintPositionTimeline(timelineMap.length); + if (data.positionMode == spine.PositionMode.Fixed) + timelineScale = scale; + } + timeline.pathConstraintIndex = index; + var frameIndex = 0; + for (var i = 0; i < timelineMap.length; i++) { + var 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) * spine.PathConstraintPositionTimeline.ENTRIES]); + } + else if (timelineName === "mix") { + var timeline = new spine.PathConstraintMixTimeline(timelineMap.length); + timeline.pathConstraintIndex = index; + var frameIndex = 0; + for (var i = 0; i < timelineMap.length; i++) { + var 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) * spine.PathConstraintMixTimeline.ENTRIES]); + } + } + } + } + if (map.deform) { + for (var deformName in map.deform) { + var deformMap = map.deform[deformName]; + var skin = skeletonData.findSkin(deformName); + if (skin == null) + throw new Error("Skin not found: " + deformName); + for (var slotName in deformMap) { + var slotMap = deformMap[slotName]; + var slotIndex = skeletonData.findSlotIndex(slotName); + if (slotIndex == -1) + throw new Error("Slot not found: " + slotMap.name); + for (var timelineName in slotMap) { + var timelineMap = slotMap[timelineName]; + var attachment = skin.getAttachment(slotIndex, timelineName); + if (attachment == null) + throw new Error("Deform attachment not found: " + timelineMap.name); + var weighted = attachment.bones != null; + var vertices = attachment.vertices; + var deformLength = weighted ? vertices.length / 3 * 2 : vertices.length; + var timeline = new spine.DeformTimeline(timelineMap.length); + timeline.slotIndex = slotIndex; + timeline.attachment = attachment; + var frameIndex = 0; + for (var j = 0; j < timelineMap.length; j++) { + var valueMap = timelineMap[j]; + var deform = void 0; + var verticesValue = this.getValue(valueMap, "vertices", null); + if (verticesValue == null) + deform = weighted ? spine.Utils.newFloatArray(deformLength) : vertices; + else { + deform = spine.Utils.newFloatArray(deformLength); + var start = this.getValue(valueMap, "offset", 0); + spine.Utils.arrayCopy(verticesValue, 0, deform, start, verticesValue.length); + if (scale != 1) { + for (var i = start, n = i + verticesValue.length; i < n; i++) + deform[i] *= scale; + } + if (!weighted) { + for (var 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]); + } + } + } + } + var drawOrderNode = map.drawOrder; + if (drawOrderNode == null) + drawOrderNode = map.draworder; + if (drawOrderNode != null) { + var timeline = new spine.DrawOrderTimeline(drawOrderNode.length); + var slotCount = skeletonData.slots.length; + var frameIndex = 0; + for (var j = 0; j < drawOrderNode.length; j++) { + var drawOrderMap = drawOrderNode[j]; + var drawOrder = null; + var offsets = this.getValue(drawOrderMap, "offsets", null); + if (offsets != null) { + drawOrder = spine.Utils.newArray(slotCount, -1); + var unchanged = spine.Utils.newArray(slotCount - offsets.length, 0); + var originalIndex = 0, unchangedIndex = 0; + for (var i = 0; i < offsets.length; i++) { + var offsetMap = offsets[i]; + var slotIndex = skeletonData.findSlotIndex(offsetMap.slot); + if (slotIndex == -1) + throw new Error("Slot not found: " + offsetMap.slot); + while (originalIndex != slotIndex) + unchanged[unchangedIndex++] = originalIndex++; + drawOrder[originalIndex + offsetMap.offset] = originalIndex++; + } + while (originalIndex < slotCount) + unchanged[unchangedIndex++] = originalIndex++; + for (var 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]); + } + if (map.events) { + var timeline = new spine.EventTimeline(map.events.length); + var frameIndex = 0; + for (var i = 0; i < map.events.length; i++) { + var eventMap = map.events[i]; + var eventData = skeletonData.findEvent(eventMap.name); + if (eventData == null) + throw new Error("Event not found: " + eventMap.name); + var event_6 = new spine.Event(spine.Utils.toSinglePrecision(this.getValue(eventMap, "time", 0)), eventData); + event_6.intValue = this.getValue(eventMap, "int", eventData.intValue); + event_6.floatValue = this.getValue(eventMap, "float", eventData.floatValue); + event_6.stringValue = this.getValue(eventMap, "string", eventData.stringValue); + if (event_6.data.audioPath != null) { + event_6.volume = this.getValue(eventMap, "volume", 1); + event_6.balance = this.getValue(eventMap, "balance", 0); + } + timeline.setFrame(frameIndex++, event_6); + } + 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 spine.Animation(name, timelines, duration)); + }; + SkeletonJson.prototype.readCurve = function (map, timeline, frameIndex) { + if (!map.hasOwnProperty("curve")) + return; + if (map.curve == "stepped") + timeline.setStepped(frameIndex); + else { + var curve = map.curve; + timeline.setCurve(frameIndex, curve, this.getValue(map, "c2", 0), this.getValue(map, "c3", 1), this.getValue(map, "c4", 1)); + } + }; + SkeletonJson.prototype.getValue = function (map, prop, defaultValue) { + return map[prop] !== undefined ? map[prop] : defaultValue; + }; + SkeletonJson.blendModeFromString = function (str) { + str = str.toLowerCase(); + if (str == "normal") + return spine.BlendMode.Normal; + if (str == "additive") + return spine.BlendMode.Additive; + if (str == "multiply") + return spine.BlendMode.Multiply; + if (str == "screen") + return spine.BlendMode.Screen; + throw new Error("Unknown blend mode: " + str); + }; + SkeletonJson.positionModeFromString = function (str) { + str = str.toLowerCase(); + if (str == "fixed") + return spine.PositionMode.Fixed; + if (str == "percent") + return spine.PositionMode.Percent; + throw new Error("Unknown position mode: " + str); + }; + SkeletonJson.spacingModeFromString = function (str) { + str = str.toLowerCase(); + if (str == "length") + return spine.SpacingMode.Length; + if (str == "fixed") + return spine.SpacingMode.Fixed; + if (str == "percent") + return spine.SpacingMode.Percent; + throw new Error("Unknown position mode: " + str); + }; + SkeletonJson.rotateModeFromString = function (str) { + str = str.toLowerCase(); + if (str == "tangent") + return spine.RotateMode.Tangent; + if (str == "chain") + return spine.RotateMode.Chain; + if (str == "chainscale") + return spine.RotateMode.ChainScale; + throw new Error("Unknown rotate mode: " + str); + }; + SkeletonJson.transformModeFromString = function (str) { + str = str.toLowerCase(); + if (str == "normal") + return spine.TransformMode.Normal; + if (str == "onlytranslation") + return spine.TransformMode.OnlyTranslation; + if (str == "norotationorreflection") + return spine.TransformMode.NoRotationOrReflection; + if (str == "noscale") + return spine.TransformMode.NoScale; + if (str == "noscaleorreflection") + return spine.TransformMode.NoScaleOrReflection; + throw new Error("Unknown transform mode: " + str); + }; + return SkeletonJson; + }()); + spine.SkeletonJson = SkeletonJson; + var LinkedMesh = (function () { + function LinkedMesh(mesh, skin, slotIndex, parent, inheritDeform) { + this.mesh = mesh; + this.skin = skin; + this.slotIndex = slotIndex; + this.parent = parent; + this.inheritDeform = inheritDeform; + } + return LinkedMesh; + }()); +})(spine || (spine = {})); +var spine; +(function (spine) { + var SkinEntry = (function () { + function SkinEntry(slotIndex, name, attachment) { + this.slotIndex = slotIndex; + this.name = name; + this.attachment = attachment; + } + return SkinEntry; + }()); + spine.SkinEntry = SkinEntry; + var Skin = (function () { + function Skin(name) { + this.attachments = new Array(); + this.bones = Array(); + this.constraints = new Array(); + if (name == null) + throw new Error("name cannot be null."); + this.name = name; + } + Skin.prototype.setAttachment = function (slotIndex, name, attachment) { + if (attachment == null) + throw new Error("attachment cannot be null."); + var attachments = this.attachments; + if (slotIndex >= attachments.length) + attachments.length = slotIndex + 1; + if (!attachments[slotIndex]) + attachments[slotIndex] = {}; + attachments[slotIndex][name] = attachment; + }; + Skin.prototype.addSkin = function (skin) { + for (var i = 0; i < skin.bones.length; i++) { + var bone = skin.bones[i]; + var contained = false; + for (var j = 0; j < this.bones.length; j++) { + if (this.bones[j] == bone) { + contained = true; + break; + } + } + if (!contained) + this.bones.push(bone); + } + for (var i = 0; i < skin.constraints.length; i++) { + var constraint = skin.constraints[i]; + var contained = false; + for (var j = 0; j < this.constraints.length; j++) { + if (this.constraints[j] == constraint) { + contained = true; + break; + } + } + if (!contained) + this.constraints.push(constraint); + } + var attachments = skin.getAttachments(); + for (var i = 0; i < attachments.length; i++) { + var attachment = attachments[i]; + this.setAttachment(attachment.slotIndex, attachment.name, attachment.attachment); + } + }; + Skin.prototype.copySkin = function (skin) { + for (var i = 0; i < skin.bones.length; i++) { + var bone = skin.bones[i]; + var contained = false; + for (var j = 0; j < this.bones.length; j++) { + if (this.bones[j] == bone) { + contained = true; + break; + } + } + if (!contained) + this.bones.push(bone); + } + for (var i = 0; i < skin.constraints.length; i++) { + var constraint = skin.constraints[i]; + var contained = false; + for (var j = 0; j < this.constraints.length; j++) { + if (this.constraints[j] == constraint) { + contained = true; + break; + } + } + if (!contained) + this.constraints.push(constraint); + } + var attachments = skin.getAttachments(); + for (var i = 0; i < attachments.length; i++) { + var attachment = attachments[i]; + if (attachment.attachment == null) + continue; + if (attachment.attachment instanceof spine.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); + } + } + }; + Skin.prototype.getAttachment = function (slotIndex, name) { + var dictionary = this.attachments[slotIndex]; + return dictionary ? dictionary[name] : null; + }; + Skin.prototype.removeAttachment = function (slotIndex, name) { + var dictionary = this.attachments[slotIndex]; + if (dictionary) + dictionary[name] = null; + }; + Skin.prototype.getAttachments = function () { + var entries = new Array(); + for (var i = 0; i < this.attachments.length; i++) { + var slotAttachments = this.attachments[i]; + if (slotAttachments) { + for (var name_4 in slotAttachments) { + var attachment = slotAttachments[name_4]; + if (attachment) + entries.push(new SkinEntry(i, name_4, attachment)); + } + } + } + return entries; + }; + Skin.prototype.getAttachmentsForSlot = function (slotIndex, attachments) { + var slotAttachments = this.attachments[slotIndex]; + if (slotAttachments) { + for (var name_5 in slotAttachments) { + var attachment = slotAttachments[name_5]; + if (attachment) + attachments.push(new SkinEntry(slotIndex, name_5, attachment)); + } + } + }; + Skin.prototype.clear = function () { + this.attachments.length = 0; + this.bones.length = 0; + this.constraints.length = 0; + }; + Skin.prototype.attachAll = function (skeleton, oldSkin) { + var slotIndex = 0; + for (var i = 0; i < skeleton.slots.length; i++) { + var slot = skeleton.slots[i]; + var slotAttachment = slot.getAttachment(); + if (slotAttachment && slotIndex < oldSkin.attachments.length) { + var dictionary = oldSkin.attachments[slotIndex]; + for (var key in dictionary) { + var skinAttachment = dictionary[key]; + if (slotAttachment == skinAttachment) { + var attachment = this.getAttachment(slotIndex, key); + if (attachment != null) + slot.setAttachment(attachment); + break; + } + } + } + slotIndex++; + } + }; + return Skin; + }()); + spine.Skin = Skin; +})(spine || (spine = {})); +var spine; +(function (spine) { + var Slot = (function () { + function Slot(data, bone) { + this.deform = new Array(); + 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 spine.Color(); + this.darkColor = data.darkColor == null ? null : new spine.Color(); + this.setToSetupPose(); + } + Slot.prototype.getSkeleton = function () { + return this.bone.skeleton; + }; + Slot.prototype.getAttachment = function () { + return this.attachment; + }; + Slot.prototype.setAttachment = function (attachment) { + if (this.attachment == attachment) + return; + this.attachment = attachment; + this.attachmentTime = this.bone.skeleton.time; + this.deform.length = 0; + }; + Slot.prototype.setAttachmentTime = function (time) { + this.attachmentTime = this.bone.skeleton.time - time; + }; + Slot.prototype.getAttachmentTime = function () { + return this.bone.skeleton.time - this.attachmentTime; + }; + Slot.prototype.setToSetupPose = function () { + 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)); + } + }; + return Slot; + }()); + spine.Slot = Slot; +})(spine || (spine = {})); +var spine; +(function (spine) { + var SlotData = (function () { + function SlotData(index, name, boneData) { + this.color = new spine.Color(1, 1, 1, 1); + 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; + } + return SlotData; + }()); + spine.SlotData = SlotData; +})(spine || (spine = {})); +var spine; +(function (spine) { + var Texture = (function () { + function Texture(image) { + this._image = image; + } + Texture.prototype.getImage = function () { + return this._image; + }; + Texture.filterFromString = function (text) { + switch (text.toLowerCase()) { + case "nearest": return TextureFilter.Nearest; + case "linear": return TextureFilter.Linear; + case "mipmap": return TextureFilter.MipMap; + case "mipmapnearestnearest": return TextureFilter.MipMapNearestNearest; + case "mipmaplinearnearest": return TextureFilter.MipMapLinearNearest; + case "mipmapnearestlinear": return TextureFilter.MipMapNearestLinear; + case "mipmaplinearlinear": return TextureFilter.MipMapLinearLinear; + default: throw new Error("Unknown texture filter " + text); + } + }; + Texture.wrapFromString = function (text) { + switch (text.toLowerCase()) { + case "mirroredtepeat": return TextureWrap.MirroredRepeat; + case "clamptoedge": return TextureWrap.ClampToEdge; + case "repeat": return TextureWrap.Repeat; + default: throw new Error("Unknown texture wrap " + text); + } + }; + return Texture; + }()); + spine.Texture = Texture; + var TextureFilter; + (function (TextureFilter) { + TextureFilter[TextureFilter["Nearest"] = 9728] = "Nearest"; + TextureFilter[TextureFilter["Linear"] = 9729] = "Linear"; + TextureFilter[TextureFilter["MipMap"] = 9987] = "MipMap"; + TextureFilter[TextureFilter["MipMapNearestNearest"] = 9984] = "MipMapNearestNearest"; + TextureFilter[TextureFilter["MipMapLinearNearest"] = 9985] = "MipMapLinearNearest"; + TextureFilter[TextureFilter["MipMapNearestLinear"] = 9986] = "MipMapNearestLinear"; + TextureFilter[TextureFilter["MipMapLinearLinear"] = 9987] = "MipMapLinearLinear"; + })(TextureFilter = spine.TextureFilter || (spine.TextureFilter = {})); + var TextureWrap; + (function (TextureWrap) { + TextureWrap[TextureWrap["MirroredRepeat"] = 33648] = "MirroredRepeat"; + TextureWrap[TextureWrap["ClampToEdge"] = 33071] = "ClampToEdge"; + TextureWrap[TextureWrap["Repeat"] = 10497] = "Repeat"; + })(TextureWrap = spine.TextureWrap || (spine.TextureWrap = {})); + var TextureRegion = (function () { + function TextureRegion() { + this.u = 0; + this.v = 0; + this.u2 = 0; + this.v2 = 0; + this.width = 0; + this.height = 0; + this.rotate = false; + this.offsetX = 0; + this.offsetY = 0; + this.originalWidth = 0; + this.originalHeight = 0; + } + return TextureRegion; + }()); + spine.TextureRegion = TextureRegion; + var FakeTexture = (function (_super) { + __extends(FakeTexture, _super); + function FakeTexture() { + return _super !== null && _super.apply(this, arguments) || this; + } + FakeTexture.prototype.setFilters = function (minFilter, magFilter) { }; + FakeTexture.prototype.setWraps = function (uWrap, vWrap) { }; + FakeTexture.prototype.dispose = function () { }; + return FakeTexture; + }(Texture)); + spine.FakeTexture = FakeTexture; +})(spine || (spine = {})); +var spine; +(function (spine) { + var TextureAtlas = (function () { + function TextureAtlas(atlasText, textureLoader) { + this.pages = new Array(); + this.regions = new Array(); + this.load(atlasText, textureLoader); + } + TextureAtlas.prototype.load = function (atlasText, textureLoader) { + if (textureLoader == null) + throw new Error("textureLoader cannot be null."); + var reader = new TextureAtlasReader(atlasText); + var tuple = new Array(4); + var page = null; + while (true) { + var line = reader.readLine(); + if (line == null) + break; + line = line.trim(); + if (line.length == 0) + page = null; + else if (!page) { + page = new TextureAtlasPage(); + page.name = line; + if (reader.readTuple(tuple) == 2) { + page.width = parseInt(tuple[0]); + page.height = parseInt(tuple[1]); + reader.readTuple(tuple); + } + reader.readTuple(tuple); + page.minFilter = spine.Texture.filterFromString(tuple[0]); + page.magFilter = spine.Texture.filterFromString(tuple[1]); + var direction = reader.readValue(); + page.uWrap = spine.TextureWrap.ClampToEdge; + page.vWrap = spine.TextureWrap.ClampToEdge; + if (direction == "x") + page.uWrap = spine.TextureWrap.Repeat; + else if (direction == "y") + page.vWrap = spine.TextureWrap.Repeat; + else if (direction == "xy") + page.uWrap = page.vWrap = spine.TextureWrap.Repeat; + page.texture = textureLoader(line); + page.texture.setFilters(page.minFilter, page.magFilter); + page.texture.setWraps(page.uWrap, page.vWrap); + page.width = page.texture.getImage().width; + page.height = page.texture.getImage().height; + this.pages.push(page); + } + else { + var region = new TextureAtlasRegion(); + region.name = line; + region.page = page; + var rotateValue = reader.readValue(); + if (rotateValue.toLocaleLowerCase() == "true") { + region.degrees = 90; + } + else if (rotateValue.toLocaleLowerCase() == "false") { + region.degrees = 0; + } + else { + region.degrees = parseFloat(rotateValue); + } + region.rotate = region.degrees == 90; + reader.readTuple(tuple); + var x = parseInt(tuple[0]); + var y = parseInt(tuple[1]); + reader.readTuple(tuple); + var width = parseInt(tuple[0]); + var height = parseInt(tuple[1]); + region.u = x / page.width; + region.v = y / page.height; + if (region.rotate) { + region.u2 = (x + height) / page.width; + region.v2 = (y + width) / page.height; + } + else { + region.u2 = (x + width) / page.width; + region.v2 = (y + height) / page.height; + } + region.x = x; + region.y = y; + region.width = Math.abs(width); + region.height = Math.abs(height); + if (reader.readTuple(tuple) == 4) { + if (reader.readTuple(tuple) == 4) { + reader.readTuple(tuple); + } + } + region.originalWidth = parseInt(tuple[0]); + region.originalHeight = parseInt(tuple[1]); + reader.readTuple(tuple); + region.offsetX = parseInt(tuple[0]); + region.offsetY = parseInt(tuple[1]); + region.index = parseInt(reader.readValue()); + region.texture = page.texture; + this.regions.push(region); + } + } + }; + TextureAtlas.prototype.findRegion = function (name) { + for (var i = 0; i < this.regions.length; i++) { + if (this.regions[i].name == name) { + return this.regions[i]; + } + } + return null; + }; + TextureAtlas.prototype.dispose = function () { + for (var i = 0; i < this.pages.length; i++) { + this.pages[i].texture.dispose(); + } + }; + return TextureAtlas; + }()); + spine.TextureAtlas = TextureAtlas; + var TextureAtlasReader = (function () { + function TextureAtlasReader(text) { + this.index = 0; + this.lines = text.split(/\r\n|\r|\n/); + } + TextureAtlasReader.prototype.readLine = function () { + if (this.index >= this.lines.length) + return null; + return this.lines[this.index++]; + }; + TextureAtlasReader.prototype.readValue = function () { + var line = this.readLine(); + var colon = line.indexOf(":"); + if (colon == -1) + throw new Error("Invalid line: " + line); + return line.substring(colon + 1).trim(); + }; + TextureAtlasReader.prototype.readTuple = function (tuple) { + var line = this.readLine(); + var colon = line.indexOf(":"); + if (colon == -1) + throw new Error("Invalid line: " + line); + var i = 0, lastMatch = colon + 1; + for (; i < 3; i++) { + var comma = line.indexOf(",", lastMatch); + if (comma == -1) + break; + tuple[i] = line.substr(lastMatch, comma - lastMatch).trim(); + lastMatch = comma + 1; + } + tuple[i] = line.substring(lastMatch).trim(); + return i + 1; + }; + return TextureAtlasReader; + }()); + var TextureAtlasPage = (function () { + function TextureAtlasPage() { + } + return TextureAtlasPage; + }()); + spine.TextureAtlasPage = TextureAtlasPage; + var TextureAtlasRegion = (function (_super) { + __extends(TextureAtlasRegion, _super); + function TextureAtlasRegion() { + return _super !== null && _super.apply(this, arguments) || this; + } + return TextureAtlasRegion; + }(spine.TextureRegion)); + spine.TextureAtlasRegion = TextureAtlasRegion; +})(spine || (spine = {})); +var spine; +(function (spine) { + var TransformConstraint = (function () { + function TransformConstraint(data, skeleton) { + this.rotateMix = 0; + this.translateMix = 0; + this.scaleMix = 0; + this.shearMix = 0; + this.temp = new spine.Vector2(); + this.active = false; + 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 (var i = 0; i < data.bones.length; i++) + this.bones.push(skeleton.findBone(data.bones[i].name)); + this.target = skeleton.findBone(data.target.name); + } + TransformConstraint.prototype.isActive = function () { + return this.active; + }; + TransformConstraint.prototype.apply = function () { + this.update(); + }; + TransformConstraint.prototype.update = function () { + if (this.data.local) { + if (this.data.relative) + this.applyRelativeLocal(); + else + this.applyAbsoluteLocal(); + } + else { + if (this.data.relative) + this.applyRelativeWorld(); + else + this.applyAbsoluteWorld(); + } + }; + TransformConstraint.prototype.applyAbsoluteWorld = function () { + var rotateMix = this.rotateMix, translateMix = this.translateMix, scaleMix = this.scaleMix, shearMix = this.shearMix; + var target = this.target; + var ta = target.a, tb = target.b, tc = target.c, td = target.d; + var degRadReflect = ta * td - tb * tc > 0 ? spine.MathUtils.degRad : -spine.MathUtils.degRad; + var offsetRotation = this.data.offsetRotation * degRadReflect; + var offsetShearY = this.data.offsetShearY * degRadReflect; + var bones = this.bones; + for (var i = 0, n = bones.length; i < n; i++) { + var bone = bones[i]; + var modified = false; + if (rotateMix != 0) { + var a = bone.a, b = bone.b, c = bone.c, d = bone.d; + var r = Math.atan2(tc, ta) - Math.atan2(c, a) + offsetRotation; + if (r > spine.MathUtils.PI) + r -= spine.MathUtils.PI2; + else if (r < -spine.MathUtils.PI) + r += spine.MathUtils.PI2; + r *= rotateMix; + var cos = Math.cos(r), sin = Math.sin(r); + bone.a = cos * a - sin * c; + bone.b = cos * b - sin * d; + bone.c = sin * a + cos * c; + bone.d = sin * b + cos * d; + modified = true; + } + if (translateMix != 0) { + var temp = this.temp; + target.localToWorld(temp.set(this.data.offsetX, this.data.offsetY)); + bone.worldX += (temp.x - bone.worldX) * translateMix; + bone.worldY += (temp.y - bone.worldY) * translateMix; + modified = true; + } + if (scaleMix > 0) { + var s = Math.sqrt(bone.a * bone.a + bone.c * bone.c); + var ts = Math.sqrt(ta * ta + tc * tc); + if (s > 0.00001) + s = (s + (ts - s + this.data.offsetScaleX) * scaleMix) / s; + bone.a *= s; + bone.c *= s; + s = Math.sqrt(bone.b * bone.b + bone.d * bone.d); + ts = Math.sqrt(tb * tb + td * td); + if (s > 0.00001) + s = (s + (ts - s + this.data.offsetScaleY) * scaleMix) / s; + bone.b *= s; + bone.d *= s; + modified = true; + } + if (shearMix > 0) { + var b = bone.b, d = bone.d; + var by = Math.atan2(d, b); + var r = Math.atan2(td, tb) - Math.atan2(tc, ta) - (by - Math.atan2(bone.c, bone.a)); + if (r > spine.MathUtils.PI) + r -= spine.MathUtils.PI2; + else if (r < -spine.MathUtils.PI) + r += spine.MathUtils.PI2; + r = by + (r + offsetShearY) * shearMix; + var s = Math.sqrt(b * b + d * d); + bone.b = Math.cos(r) * s; + bone.d = Math.sin(r) * s; + modified = true; + } + if (modified) + bone.appliedValid = false; + } + }; + TransformConstraint.prototype.applyRelativeWorld = function () { + var rotateMix = this.rotateMix, translateMix = this.translateMix, scaleMix = this.scaleMix, shearMix = this.shearMix; + var target = this.target; + var ta = target.a, tb = target.b, tc = target.c, td = target.d; + var degRadReflect = ta * td - tb * tc > 0 ? spine.MathUtils.degRad : -spine.MathUtils.degRad; + var offsetRotation = this.data.offsetRotation * degRadReflect, offsetShearY = this.data.offsetShearY * degRadReflect; + var bones = this.bones; + for (var i = 0, n = bones.length; i < n; i++) { + var bone = bones[i]; + var modified = false; + if (rotateMix != 0) { + var a = bone.a, b = bone.b, c = bone.c, d = bone.d; + var r = Math.atan2(tc, ta) + offsetRotation; + if (r > spine.MathUtils.PI) + r -= spine.MathUtils.PI2; + else if (r < -spine.MathUtils.PI) + r += spine.MathUtils.PI2; + r *= rotateMix; + var cos = Math.cos(r), sin = Math.sin(r); + bone.a = cos * a - sin * c; + bone.b = cos * b - sin * d; + bone.c = sin * a + cos * c; + bone.d = sin * b + cos * d; + modified = true; + } + if (translateMix != 0) { + var temp = this.temp; + target.localToWorld(temp.set(this.data.offsetX, this.data.offsetY)); + bone.worldX += temp.x * translateMix; + bone.worldY += temp.y * translateMix; + modified = true; + } + if (scaleMix > 0) { + var s = (Math.sqrt(ta * ta + tc * tc) - 1 + this.data.offsetScaleX) * scaleMix + 1; + bone.a *= s; + bone.c *= s; + s = (Math.sqrt(tb * tb + td * td) - 1 + this.data.offsetScaleY) * scaleMix + 1; + bone.b *= s; + bone.d *= s; + modified = true; + } + if (shearMix > 0) { + var r = Math.atan2(td, tb) - Math.atan2(tc, ta); + if (r > spine.MathUtils.PI) + r -= spine.MathUtils.PI2; + else if (r < -spine.MathUtils.PI) + r += spine.MathUtils.PI2; + var b = bone.b, d = bone.d; + r = Math.atan2(d, b) + (r - spine.MathUtils.PI / 2 + offsetShearY) * shearMix; + var s = Math.sqrt(b * b + d * d); + bone.b = Math.cos(r) * s; + bone.d = Math.sin(r) * s; + modified = true; + } + if (modified) + bone.appliedValid = false; + } + }; + TransformConstraint.prototype.applyAbsoluteLocal = function () { + var rotateMix = this.rotateMix, translateMix = this.translateMix, scaleMix = this.scaleMix, shearMix = this.shearMix; + var target = this.target; + if (!target.appliedValid) + target.updateAppliedTransform(); + var bones = this.bones; + for (var i = 0, n = bones.length; i < n; i++) { + var bone = bones[i]; + if (!bone.appliedValid) + bone.updateAppliedTransform(); + var rotation = bone.arotation; + if (rotateMix != 0) { + var r = target.arotation - rotation + this.data.offsetRotation; + r -= (16384 - ((16384.499999999996 - r / 360) | 0)) * 360; + rotation += r * rotateMix; + } + var 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; + } + var 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; + } + var shearY = bone.ashearY; + if (shearMix != 0) { + var 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); + } + }; + TransformConstraint.prototype.applyRelativeLocal = function () { + var rotateMix = this.rotateMix, translateMix = this.translateMix, scaleMix = this.scaleMix, shearMix = this.shearMix; + var target = this.target; + if (!target.appliedValid) + target.updateAppliedTransform(); + var bones = this.bones; + for (var i = 0, n = bones.length; i < n; i++) { + var bone = bones[i]; + if (!bone.appliedValid) + bone.updateAppliedTransform(); + var rotation = bone.arotation; + if (rotateMix != 0) + rotation += (target.arotation + this.data.offsetRotation) * rotateMix; + var x = bone.ax, y = bone.ay; + if (translateMix != 0) { + x += (target.ax + this.data.offsetX) * translateMix; + y += (target.ay + this.data.offsetY) * translateMix; + } + var 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; + } + var shearY = bone.ashearY; + if (shearMix != 0) + shearY += (target.ashearY + this.data.offsetShearY) * shearMix; + bone.updateWorldTransformWith(x, y, rotation, scaleX, scaleY, bone.ashearX, shearY); + } + }; + return TransformConstraint; + }()); + spine.TransformConstraint = TransformConstraint; +})(spine || (spine = {})); +var spine; +(function (spine) { + var TransformConstraintData = (function (_super) { + __extends(TransformConstraintData, _super); + function TransformConstraintData(name) { + var _this = _super.call(this, name, 0, false) || this; + _this.bones = new Array(); + _this.rotateMix = 0; + _this.translateMix = 0; + _this.scaleMix = 0; + _this.shearMix = 0; + _this.offsetRotation = 0; + _this.offsetX = 0; + _this.offsetY = 0; + _this.offsetScaleX = 0; + _this.offsetScaleY = 0; + _this.offsetShearY = 0; + _this.relative = false; + _this.local = false; + return _this; + } + return TransformConstraintData; + }(spine.ConstraintData)); + spine.TransformConstraintData = TransformConstraintData; +})(spine || (spine = {})); +var spine; +(function (spine) { + var Triangulator = (function () { + function Triangulator() { + this.convexPolygons = new Array(); + this.convexPolygonsIndices = new Array(); + this.indicesArray = new Array(); + this.isConcaveArray = new Array(); + this.triangles = new Array(); + this.polygonPool = new spine.Pool(function () { + return new Array(); + }); + this.polygonIndicesPool = new spine.Pool(function () { + return new Array(); + }); + } + Triangulator.prototype.triangulate = function (verticesArray) { + var vertices = verticesArray; + var vertexCount = verticesArray.length >> 1; + var indices = this.indicesArray; + indices.length = 0; + for (var i = 0; i < vertexCount; i++) + indices[i] = i; + var isConcave = this.isConcaveArray; + isConcave.length = 0; + for (var i = 0, n = vertexCount; i < n; ++i) + isConcave[i] = Triangulator.isConcave(i, vertexCount, vertices, indices); + var triangles = this.triangles; + triangles.length = 0; + while (vertexCount > 3) { + var previous = vertexCount - 1, i = 0, next = 1; + while (true) { + outer: if (!isConcave[i]) { + var p1 = indices[previous] << 1, p2 = indices[i] << 1, p3 = indices[next] << 1; + var p1x = vertices[p1], p1y = vertices[p1 + 1]; + var p2x = vertices[p2], p2y = vertices[p2 + 1]; + var p3x = vertices[p3], p3y = vertices[p3 + 1]; + for (var ii = (next + 1) % vertexCount; ii != previous; ii = (ii + 1) % vertexCount) { + if (!isConcave[ii]) + continue; + var v = indices[ii] << 1; + var vx = vertices[v], vy = vertices[v + 1]; + if (Triangulator.positiveArea(p3x, p3y, p1x, p1y, vx, vy)) { + if (Triangulator.positiveArea(p1x, p1y, p2x, p2y, vx, vy)) { + if (Triangulator.positiveArea(p2x, p2y, p3x, p3y, vx, vy)) + break outer; + } + } + } + break; + } + if (next == 0) { + do { + if (!isConcave[i]) + break; + i--; + } while (i > 0); + break; + } + previous = i; + i = next; + next = (next + 1) % vertexCount; + } + triangles.push(indices[(vertexCount + i - 1) % vertexCount]); + triangles.push(indices[i]); + triangles.push(indices[(i + 1) % vertexCount]); + indices.splice(i, 1); + isConcave.splice(i, 1); + vertexCount--; + var previousIndex = (vertexCount + i - 1) % vertexCount; + var nextIndex = i == vertexCount ? 0 : i; + isConcave[previousIndex] = Triangulator.isConcave(previousIndex, vertexCount, vertices, indices); + isConcave[nextIndex] = Triangulator.isConcave(nextIndex, vertexCount, vertices, indices); + } + if (vertexCount == 3) { + triangles.push(indices[2]); + triangles.push(indices[0]); + triangles.push(indices[1]); + } + return triangles; + }; + Triangulator.prototype.decompose = function (verticesArray, triangles) { + var vertices = verticesArray; + var convexPolygons = this.convexPolygons; + this.polygonPool.freeAll(convexPolygons); + convexPolygons.length = 0; + var convexPolygonsIndices = this.convexPolygonsIndices; + this.polygonIndicesPool.freeAll(convexPolygonsIndices); + convexPolygonsIndices.length = 0; + var polygonIndices = this.polygonIndicesPool.obtain(); + polygonIndices.length = 0; + var polygon = this.polygonPool.obtain(); + polygon.length = 0; + var fanBaseIndex = -1, lastWinding = 0; + for (var i = 0, n = triangles.length; i < n; i += 3) { + var t1 = triangles[i] << 1, t2 = triangles[i + 1] << 1, t3 = triangles[i + 2] << 1; + var x1 = vertices[t1], y1 = vertices[t1 + 1]; + var x2 = vertices[t2], y2 = vertices[t2 + 1]; + var x3 = vertices[t3], y3 = vertices[t3 + 1]; + var merged = false; + if (fanBaseIndex == t1) { + var o = polygon.length - 4; + var winding1 = Triangulator.winding(polygon[o], polygon[o + 1], polygon[o + 2], polygon[o + 3], x3, y3); + var winding2 = Triangulator.winding(x3, y3, polygon[0], polygon[1], polygon[2], polygon[3]); + if (winding1 == lastWinding && winding2 == lastWinding) { + polygon.push(x3); + polygon.push(y3); + polygonIndices.push(t3); + merged = true; + } + } + if (!merged) { + if (polygon.length > 0) { + convexPolygons.push(polygon); + convexPolygonsIndices.push(polygonIndices); + } + else { + this.polygonPool.free(polygon); + this.polygonIndicesPool.free(polygonIndices); + } + polygon = this.polygonPool.obtain(); + polygon.length = 0; + polygon.push(x1); + polygon.push(y1); + polygon.push(x2); + polygon.push(y2); + polygon.push(x3); + polygon.push(y3); + polygonIndices = this.polygonIndicesPool.obtain(); + polygonIndices.length = 0; + polygonIndices.push(t1); + polygonIndices.push(t2); + polygonIndices.push(t3); + lastWinding = Triangulator.winding(x1, y1, x2, y2, x3, y3); + fanBaseIndex = t1; + } + } + if (polygon.length > 0) { + convexPolygons.push(polygon); + convexPolygonsIndices.push(polygonIndices); + } + for (var i = 0, n = convexPolygons.length; i < n; i++) { + polygonIndices = convexPolygonsIndices[i]; + if (polygonIndices.length == 0) + continue; + var firstIndex = polygonIndices[0]; + var lastIndex = polygonIndices[polygonIndices.length - 1]; + polygon = convexPolygons[i]; + var o = polygon.length - 4; + var prevPrevX = polygon[o], prevPrevY = polygon[o + 1]; + var prevX = polygon[o + 2], prevY = polygon[o + 3]; + var firstX = polygon[0], firstY = polygon[1]; + var secondX = polygon[2], secondY = polygon[3]; + var winding = Triangulator.winding(prevPrevX, prevPrevY, prevX, prevY, firstX, firstY); + for (var ii = 0; ii < n; ii++) { + if (ii == i) + continue; + var otherIndices = convexPolygonsIndices[ii]; + if (otherIndices.length != 3) + continue; + var otherFirstIndex = otherIndices[0]; + var otherSecondIndex = otherIndices[1]; + var otherLastIndex = otherIndices[2]; + var otherPoly = convexPolygons[ii]; + var x3 = otherPoly[otherPoly.length - 2], y3 = otherPoly[otherPoly.length - 1]; + if (otherFirstIndex != firstIndex || otherSecondIndex != lastIndex) + continue; + var winding1 = Triangulator.winding(prevPrevX, prevPrevY, prevX, prevY, x3, y3); + var winding2 = Triangulator.winding(x3, y3, firstX, firstY, secondX, secondY); + if (winding1 == winding && winding2 == winding) { + otherPoly.length = 0; + otherIndices.length = 0; + polygon.push(x3); + polygon.push(y3); + polygonIndices.push(otherLastIndex); + prevPrevX = prevX; + prevPrevY = prevY; + prevX = x3; + prevY = y3; + ii = 0; + } + } + } + for (var i = convexPolygons.length - 1; i >= 0; i--) { + polygon = convexPolygons[i]; + if (polygon.length == 0) { + convexPolygons.splice(i, 1); + this.polygonPool.free(polygon); + polygonIndices = convexPolygonsIndices[i]; + convexPolygonsIndices.splice(i, 1); + this.polygonIndicesPool.free(polygonIndices); + } + } + return convexPolygons; + }; + Triangulator.isConcave = function (index, vertexCount, vertices, indices) { + var previous = indices[(vertexCount + index - 1) % vertexCount] << 1; + var current = indices[index] << 1; + var next = indices[(index + 1) % vertexCount] << 1; + return !this.positiveArea(vertices[previous], vertices[previous + 1], vertices[current], vertices[current + 1], vertices[next], vertices[next + 1]); + }; + Triangulator.positiveArea = function (p1x, p1y, p2x, p2y, p3x, p3y) { + return p1x * (p3y - p2y) + p2x * (p1y - p3y) + p3x * (p2y - p1y) >= 0; + }; + Triangulator.winding = function (p1x, p1y, p2x, p2y, p3x, p3y) { + var px = p2x - p1x, py = p2y - p1y; + return p3x * py - p3y * px + px * p1y - p1x * py >= 0 ? 1 : -1; + }; + return Triangulator; + }()); + spine.Triangulator = Triangulator; +})(spine || (spine = {})); +var spine; +(function (spine) { + var IntSet = (function () { + function IntSet() { + this.array = new Array(); + } + IntSet.prototype.add = function (value) { + var contains = this.contains(value); + this.array[value | 0] = value | 0; + return !contains; + }; + IntSet.prototype.contains = function (value) { + return this.array[value | 0] != undefined; + }; + IntSet.prototype.remove = function (value) { + this.array[value | 0] = undefined; + }; + IntSet.prototype.clear = function () { + this.array.length = 0; + }; + return IntSet; + }()); + spine.IntSet = IntSet; + var Color = (function () { + function Color(r, g, b, a) { + if (r === void 0) { r = 0; } + if (g === void 0) { g = 0; } + if (b === void 0) { b = 0; } + if (a === void 0) { a = 0; } + this.r = r; + this.g = g; + this.b = b; + this.a = a; + } + Color.prototype.set = function (r, g, b, a) { + this.r = r; + this.g = g; + this.b = b; + this.a = a; + this.clamp(); + return this; + }; + Color.prototype.setFromColor = function (c) { + this.r = c.r; + this.g = c.g; + this.b = c.b; + this.a = c.a; + return this; + }; + Color.prototype.setFromString = function (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; + }; + Color.prototype.add = function (r, g, b, a) { + this.r += r; + this.g += g; + this.b += b; + this.a += a; + this.clamp(); + return this; + }; + Color.prototype.clamp = function () { + 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; + }; + Color.rgba8888ToColor = function (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; + }; + Color.rgb888ToColor = function (color, value) { + color.r = ((value & 0x00ff0000) >>> 16) / 255; + color.g = ((value & 0x0000ff00) >>> 8) / 255; + color.b = ((value & 0x000000ff)) / 255; + }; + Color.WHITE = new Color(1, 1, 1, 1); + Color.RED = new Color(1, 0, 0, 1); + Color.GREEN = new Color(0, 1, 0, 1); + Color.BLUE = new Color(0, 0, 1, 1); + Color.MAGENTA = new Color(1, 0, 1, 1); + return Color; + }()); + spine.Color = Color; + var MathUtils = (function () { + function MathUtils() { + } + MathUtils.clamp = function (value, min, max) { + if (value < min) + return min; + if (value > max) + return max; + return value; + }; + MathUtils.cosDeg = function (degrees) { + return Math.cos(degrees * MathUtils.degRad); + }; + MathUtils.sinDeg = function (degrees) { + return Math.sin(degrees * MathUtils.degRad); + }; + MathUtils.signum = function (value) { + return value > 0 ? 1 : value < 0 ? -1 : 0; + }; + MathUtils.toInt = function (x) { + return x > 0 ? Math.floor(x) : Math.ceil(x); + }; + MathUtils.cbrt = function (x) { + var y = Math.pow(Math.abs(x), 1 / 3); + return x < 0 ? -y : y; + }; + MathUtils.randomTriangular = function (min, max) { + return MathUtils.randomTriangularWith(min, max, (min + max) * 0.5); + }; + MathUtils.randomTriangularWith = function (min, max, mode) { + var u = Math.random(); + var 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.PI = 3.1415927; + MathUtils.PI2 = MathUtils.PI * 2; + MathUtils.radiansToDegrees = 180 / MathUtils.PI; + MathUtils.radDeg = MathUtils.radiansToDegrees; + MathUtils.degreesToRadians = MathUtils.PI / 180; + MathUtils.degRad = MathUtils.degreesToRadians; + return MathUtils; + }()); + spine.MathUtils = MathUtils; + var Interpolation = (function () { + function Interpolation() { + } + Interpolation.prototype.apply = function (start, end, a) { + return start + (end - start) * this.applyInternal(a); + }; + return Interpolation; + }()); + spine.Interpolation = Interpolation; + var Pow = (function (_super) { + __extends(Pow, _super); + function Pow(power) { + var _this = _super.call(this) || this; + _this.power = 2; + _this.power = power; + return _this; + } + Pow.prototype.applyInternal = function (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; + }; + return Pow; + }(Interpolation)); + spine.Pow = Pow; + var PowOut = (function (_super) { + __extends(PowOut, _super); + function PowOut(power) { + return _super.call(this, power) || this; + } + PowOut.prototype.applyInternal = function (a) { + return Math.pow(a - 1, this.power) * (this.power % 2 == 0 ? -1 : 1) + 1; + }; + return PowOut; + }(Pow)); + spine.PowOut = PowOut; + var Utils = (function () { + function Utils() { + } + Utils.arrayCopy = function (source, sourceStart, dest, destStart, numElements) { + for (var i = sourceStart, j = destStart; i < sourceStart + numElements; i++, j++) { + dest[j] = source[i]; + } + }; + Utils.setArraySize = function (array, size, value) { + if (value === void 0) { value = 0; } + var oldSize = array.length; + if (oldSize == size) + return array; + array.length = size; + if (oldSize < size) { + for (var i = oldSize; i < size; i++) + array[i] = value; + } + return array; + }; + Utils.ensureArrayCapacity = function (array, size, value) { + if (value === void 0) { value = 0; } + if (array.length >= size) + return array; + return Utils.setArraySize(array, size, value); + }; + Utils.newArray = function (size, defaultValue) { + var array = new Array(size); + for (var i = 0; i < size; i++) + array[i] = defaultValue; + return array; + }; + Utils.newFloatArray = function (size) { + if (Utils.SUPPORTS_TYPED_ARRAYS) { + return new Float32Array(size); + } + else { + var array = new Array(size); + for (var i = 0; i < array.length; i++) + array[i] = 0; + return array; + } + }; + Utils.newShortArray = function (size) { + if (Utils.SUPPORTS_TYPED_ARRAYS) { + return new Int16Array(size); + } + else { + var array = new Array(size); + for (var i = 0; i < array.length; i++) + array[i] = 0; + return array; + } + }; + Utils.toFloatArray = function (array) { + return Utils.SUPPORTS_TYPED_ARRAYS ? new Float32Array(array) : array; + }; + Utils.toSinglePrecision = function (value) { + return Utils.SUPPORTS_TYPED_ARRAYS ? Math.fround(value) : value; + }; + Utils.webkit602BugfixHelper = function (alpha, blend) { + }; + Utils.contains = function (array, element, identity) { + if (identity === void 0) { identity = true; } + for (var i = 0; i < array.length; i++) { + if (array[i] == element) + return true; + } + return false; + }; + Utils.SUPPORTS_TYPED_ARRAYS = typeof (Float32Array) !== "undefined"; + return Utils; + }()); + spine.Utils = Utils; + var DebugUtils = (function () { + function DebugUtils() { + } + DebugUtils.logBones = function (skeleton) { + for (var i = 0; i < skeleton.bones.length; i++) { + var bone = skeleton.bones[i]; + console.log(bone.data.name + ", " + bone.a + ", " + bone.b + ", " + bone.c + ", " + bone.d + ", " + bone.worldX + ", " + bone.worldY); + } + }; + return DebugUtils; + }()); + spine.DebugUtils = DebugUtils; + var Pool = (function () { + function Pool(instantiator) { + this.items = new Array(); + this.instantiator = instantiator; + } + Pool.prototype.obtain = function () { + return this.items.length > 0 ? this.items.pop() : this.instantiator(); + }; + Pool.prototype.free = function (item) { + if (item.reset) + item.reset(); + this.items.push(item); + }; + Pool.prototype.freeAll = function (items) { + for (var i = 0; i < items.length; i++) { + this.free(items[i]); + } + }; + Pool.prototype.clear = function () { + this.items.length = 0; + }; + return Pool; + }()); + spine.Pool = Pool; + var Vector2 = (function () { + function Vector2(x, y) { + if (x === void 0) { x = 0; } + if (y === void 0) { y = 0; } + this.x = x; + this.y = y; + } + Vector2.prototype.set = function (x, y) { + this.x = x; + this.y = y; + return this; + }; + Vector2.prototype.length = function () { + var x = this.x; + var y = this.y; + return Math.sqrt(x * x + y * y); + }; + Vector2.prototype.normalize = function () { + var len = this.length(); + if (len != 0) { + this.x /= len; + this.y /= len; + } + return this; + }; + return Vector2; + }()); + spine.Vector2 = Vector2; + var TimeKeeper = (function () { + function TimeKeeper() { + this.maxDelta = 0.064; + this.framesPerSecond = 0; + this.delta = 0; + this.totalTime = 0; + this.lastTime = Date.now() / 1000; + this.frameCount = 0; + this.frameTime = 0; + } + TimeKeeper.prototype.update = function () { + var 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; + } + }; + return TimeKeeper; + }()); + spine.TimeKeeper = TimeKeeper; + var WindowedMean = (function () { + function WindowedMean(windowSize) { + if (windowSize === void 0) { windowSize = 32; } + this.addedValues = 0; + this.lastValue = 0; + this.mean = 0; + this.dirty = true; + this.values = new Array(windowSize); + } + WindowedMean.prototype.hasEnoughData = function () { + return this.addedValues >= this.values.length; + }; + WindowedMean.prototype.addValue = function (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; + }; + WindowedMean.prototype.getMean = function () { + if (this.hasEnoughData()) { + if (this.dirty) { + var mean = 0; + for (var 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; + } + }; + return WindowedMean; + }()); + spine.WindowedMean = WindowedMean; +})(spine || (spine = {})); +(function () { + if (!Math.fround) { + Math.fround = (function (array) { + return function (x) { + return array[0] = x, array[0]; + }; + })(new Float32Array(1)); + } +})(); +var spine; +(function (spine) { + var Attachment = (function () { + function Attachment(name) { + if (name == null) + throw new Error("name cannot be null."); + this.name = name; + } + return Attachment; + }()); + spine.Attachment = Attachment; + var VertexAttachment = (function (_super) { + __extends(VertexAttachment, _super); + function VertexAttachment(name) { + var _this = _super.call(this, name) || this; + _this.id = (VertexAttachment.nextID++ & 65535) << 11; + _this.worldVerticesLength = 0; + _this.deformAttachment = _this; + return _this; + } + VertexAttachment.prototype.computeWorldVertices = function (slot, start, count, worldVertices, offset, stride) { + count = offset + (count >> 1) * stride; + var skeleton = slot.bone.skeleton; + var deformArray = slot.deform; + var vertices = this.vertices; + var bones = this.bones; + if (bones == null) { + if (deformArray.length > 0) + vertices = deformArray; + var bone = slot.bone; + var x = bone.worldX; + var y = bone.worldY; + var a = bone.a, b = bone.b, c = bone.c, d = bone.d; + for (var v_1 = start, w = offset; w < count; v_1 += 2, w += stride) { + var vx = vertices[v_1], vy = vertices[v_1 + 1]; + worldVertices[w] = vx * a + vy * b + x; + worldVertices[w + 1] = vx * c + vy * d + y; + } + return; + } + var v = 0, skip = 0; + for (var i = 0; i < start; i += 2) { + var n = bones[v]; + v += n + 1; + skip += n; + } + var skeletonBones = skeleton.bones; + if (deformArray.length == 0) { + for (var w = offset, b = skip * 3; w < count; w += stride) { + var wx = 0, wy = 0; + var n = bones[v++]; + n += v; + for (; v < n; v++, b += 3) { + var bone = skeletonBones[bones[v]]; + var vx = vertices[b], vy = vertices[b + 1], weight = vertices[b + 2]; + wx += (vx * bone.a + vy * bone.b + bone.worldX) * weight; + wy += (vx * bone.c + vy * bone.d + bone.worldY) * weight; + } + worldVertices[w] = wx; + worldVertices[w + 1] = wy; + } + } + else { + var deform = deformArray; + for (var w = offset, b = skip * 3, f = skip << 1; w < count; w += stride) { + var wx = 0, wy = 0; + var n = bones[v++]; + n += v; + for (; v < n; v++, b += 3, f += 2) { + var bone = skeletonBones[bones[v]]; + var vx = vertices[b] + deform[f], vy = vertices[b + 1] + deform[f + 1], weight = vertices[b + 2]; + wx += (vx * bone.a + vy * bone.b + bone.worldX) * weight; + wy += (vx * bone.c + vy * bone.d + bone.worldY) * weight; + } + worldVertices[w] = wx; + worldVertices[w + 1] = wy; + } + } + }; + VertexAttachment.prototype.copyTo = function (attachment) { + if (this.bones != null) { + attachment.bones = new Array(this.bones.length); + spine.Utils.arrayCopy(this.bones, 0, attachment.bones, 0, this.bones.length); + } + else + attachment.bones = null; + if (this.vertices != null) { + attachment.vertices = spine.Utils.newFloatArray(this.vertices.length); + spine.Utils.arrayCopy(this.vertices, 0, attachment.vertices, 0, this.vertices.length); + } + else + attachment.vertices = null; + attachment.worldVerticesLength = this.worldVerticesLength; + attachment.deformAttachment = this.deformAttachment; + }; + VertexAttachment.nextID = 0; + return VertexAttachment; + }(Attachment)); + spine.VertexAttachment = VertexAttachment; +})(spine || (spine = {})); +var spine; +(function (spine) { + var AttachmentType; + (function (AttachmentType) { + AttachmentType[AttachmentType["Region"] = 0] = "Region"; + AttachmentType[AttachmentType["BoundingBox"] = 1] = "BoundingBox"; + AttachmentType[AttachmentType["Mesh"] = 2] = "Mesh"; + AttachmentType[AttachmentType["LinkedMesh"] = 3] = "LinkedMesh"; + AttachmentType[AttachmentType["Path"] = 4] = "Path"; + AttachmentType[AttachmentType["Point"] = 5] = "Point"; + AttachmentType[AttachmentType["Clipping"] = 6] = "Clipping"; + })(AttachmentType = spine.AttachmentType || (spine.AttachmentType = {})); +})(spine || (spine = {})); +var spine; +(function (spine) { + var BoundingBoxAttachment = (function (_super) { + __extends(BoundingBoxAttachment, _super); + function BoundingBoxAttachment(name) { + var _this = _super.call(this, name) || this; + _this.color = new spine.Color(1, 1, 1, 1); + return _this; + } + BoundingBoxAttachment.prototype.copy = function () { + var copy = new BoundingBoxAttachment(this.name); + this.copyTo(copy); + copy.color.setFromColor(this.color); + return copy; + }; + return BoundingBoxAttachment; + }(spine.VertexAttachment)); + spine.BoundingBoxAttachment = BoundingBoxAttachment; +})(spine || (spine = {})); +var spine; +(function (spine) { + var ClippingAttachment = (function (_super) { + __extends(ClippingAttachment, _super); + function ClippingAttachment(name) { + var _this = _super.call(this, name) || this; + _this.color = new spine.Color(0.2275, 0.2275, 0.8078, 1); + return _this; + } + ClippingAttachment.prototype.copy = function () { + var copy = new ClippingAttachment(this.name); + this.copyTo(copy); + copy.endSlot = this.endSlot; + copy.color.setFromColor(this.color); + return copy; + }; + return ClippingAttachment; + }(spine.VertexAttachment)); + spine.ClippingAttachment = ClippingAttachment; +})(spine || (spine = {})); +var spine; +(function (spine) { + var MeshAttachment = (function (_super) { + __extends(MeshAttachment, _super); + function MeshAttachment(name) { + var _this = _super.call(this, name) || this; + _this.color = new spine.Color(1, 1, 1, 1); + _this.tempColor = new spine.Color(0, 0, 0, 0); + return _this; + } + MeshAttachment.prototype.updateUVs = function () { + var regionUVs = this.regionUVs; + if (this.uvs == null || this.uvs.length != regionUVs.length) + this.uvs = spine.Utils.newFloatArray(regionUVs.length); + var uvs = this.uvs; + var n = this.uvs.length; + var u = this.region.u, v = this.region.v, width = 0, height = 0; + if (this.region instanceof spine.TextureAtlasRegion) { + var region = this.region; + var textureWidth = region.texture.getImage().width, textureHeight = region.texture.getImage().height; + switch (region.degrees) { + case 90: + u -= (region.originalHeight - region.offsetY - region.height) / textureWidth; + v -= (region.originalWidth - region.offsetX - region.width) / textureHeight; + width = region.originalHeight / textureWidth; + height = region.originalWidth / textureHeight; + for (var i = 0; i < n; i += 2) { + uvs[i] = u + regionUVs[i + 1] * width; + uvs[i + 1] = v + (1 - regionUVs[i]) * height; + } + return; + case 180: + u -= (region.originalWidth - region.offsetX - region.width) / textureWidth; + v -= region.offsetY / textureHeight; + width = region.originalWidth / textureWidth; + height = region.originalHeight / textureHeight; + for (var i = 0; i < n; i += 2) { + uvs[i] = u + (1 - regionUVs[i]) * width; + uvs[i + 1] = v + (1 - regionUVs[i + 1]) * height; + } + return; + case 270: + u -= region.offsetY / textureWidth; + v -= region.offsetX / textureHeight; + width = region.originalHeight / textureWidth; + height = region.originalWidth / textureHeight; + for (var i = 0; i < n; i += 2) { + uvs[i] = u + (1 - regionUVs[i + 1]) * width; + uvs[i + 1] = v + regionUVs[i] * height; + } + return; + } + u -= region.offsetX / textureWidth; + v -= (region.originalHeight - region.offsetY - region.height) / textureHeight; + width = region.originalWidth / textureWidth; + height = region.originalHeight / textureHeight; + } + else if (this.region == null) { + u = v = 0; + width = height = 1; + } + else { + width = this.region.u2 - u; + height = this.region.v2 - v; + } + for (var i = 0; i < n; i += 2) { + uvs[i] = u + regionUVs[i] * width; + uvs[i + 1] = v + regionUVs[i + 1] * height; + } + }; + MeshAttachment.prototype.getParentMesh = function () { + return this.parentMesh; + }; + MeshAttachment.prototype.setParentMesh = function (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; + } + }; + MeshAttachment.prototype.copy = function () { + if (this.parentMesh != null) + return this.newLinkedMesh(); + var copy = new MeshAttachment(this.name); + copy.region = this.region; + copy.path = this.path; + copy.color.setFromColor(this.color); + this.copyTo(copy); + copy.regionUVs = new Array(this.regionUVs.length); + spine.Utils.arrayCopy(this.regionUVs, 0, copy.regionUVs, 0, this.regionUVs.length); + copy.uvs = new Array(this.uvs.length); + spine.Utils.arrayCopy(this.uvs, 0, copy.uvs, 0, this.uvs.length); + copy.triangles = new Array(this.triangles.length); + spine.Utils.arrayCopy(this.triangles, 0, copy.triangles, 0, this.triangles.length); + copy.hullLength = this.hullLength; + if (this.edges != null) { + copy.edges = new Array(this.edges.length); + spine.Utils.arrayCopy(this.edges, 0, copy.edges, 0, this.edges.length); + } + copy.width = this.width; + copy.height = this.height; + return copy; + }; + MeshAttachment.prototype.newLinkedMesh = function () { + var 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; + }; + return MeshAttachment; + }(spine.VertexAttachment)); + spine.MeshAttachment = MeshAttachment; +})(spine || (spine = {})); +var spine; +(function (spine) { + var PathAttachment = (function (_super) { + __extends(PathAttachment, _super); + function PathAttachment(name) { + var _this = _super.call(this, name) || this; + _this.closed = false; + _this.constantSpeed = false; + _this.color = new spine.Color(1, 1, 1, 1); + return _this; + } + PathAttachment.prototype.copy = function () { + var copy = new PathAttachment(this.name); + this.copyTo(copy); + copy.lengths = new Array(this.lengths.length); + spine.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; + }; + return PathAttachment; + }(spine.VertexAttachment)); + spine.PathAttachment = PathAttachment; +})(spine || (spine = {})); +var spine; +(function (spine) { + var PointAttachment = (function (_super) { + __extends(PointAttachment, _super); + function PointAttachment(name) { + var _this = _super.call(this, name) || this; + _this.color = new spine.Color(0.38, 0.94, 0, 1); + return _this; + } + PointAttachment.prototype.computeWorldPosition = function (bone, point) { + point.x = this.x * bone.a + this.y * bone.b + bone.worldX; + point.y = this.x * bone.c + this.y * bone.d + bone.worldY; + return point; + }; + PointAttachment.prototype.computeWorldRotation = function (bone) { + var cos = spine.MathUtils.cosDeg(this.rotation), sin = spine.MathUtils.sinDeg(this.rotation); + var x = cos * bone.a + sin * bone.b; + var y = cos * bone.c + sin * bone.d; + return Math.atan2(y, x) * spine.MathUtils.radDeg; + }; + PointAttachment.prototype.copy = function () { + var copy = new PointAttachment(this.name); + copy.x = this.x; + copy.y = this.y; + copy.rotation = this.rotation; + copy.color.setFromColor(this.color); + return copy; + }; + return PointAttachment; + }(spine.VertexAttachment)); + spine.PointAttachment = PointAttachment; +})(spine || (spine = {})); +var spine; +(function (spine) { + var RegionAttachment = (function (_super) { + __extends(RegionAttachment, _super); + function RegionAttachment(name) { + var _this = _super.call(this, name) || this; + _this.x = 0; + _this.y = 0; + _this.scaleX = 1; + _this.scaleY = 1; + _this.rotation = 0; + _this.width = 0; + _this.height = 0; + _this.color = new spine.Color(1, 1, 1, 1); + _this.offset = spine.Utils.newFloatArray(8); + _this.uvs = spine.Utils.newFloatArray(8); + _this.tempColor = new spine.Color(1, 1, 1, 1); + return _this; + } + RegionAttachment.prototype.updateOffset = function () { + var regionScaleX = this.width / this.region.originalWidth * this.scaleX; + var regionScaleY = this.height / this.region.originalHeight * this.scaleY; + var localX = -this.width / 2 * this.scaleX + this.region.offsetX * regionScaleX; + var localY = -this.height / 2 * this.scaleY + this.region.offsetY * regionScaleY; + var localX2 = localX + this.region.width * regionScaleX; + var localY2 = localY + this.region.height * regionScaleY; + var radians = this.rotation * Math.PI / 180; + var cos = Math.cos(radians); + var sin = Math.sin(radians); + var localXCos = localX * cos + this.x; + var localXSin = localX * sin; + var localYCos = localY * cos + this.y; + var localYSin = localY * sin; + var localX2Cos = localX2 * cos + this.x; + var localX2Sin = localX2 * sin; + var localY2Cos = localY2 * cos + this.y; + var localY2Sin = localY2 * sin; + var 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; + }; + RegionAttachment.prototype.setRegion = function (region) { + this.region = region; + var 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; + } + }; + RegionAttachment.prototype.computeWorldVertices = function (bone, worldVertices, offset, stride) { + var vertexOffset = this.offset; + var x = bone.worldX, y = bone.worldY; + var a = bone.a, b = bone.b, c = bone.c, d = bone.d; + var offsetX = 0, offsetY = 0; + offsetX = vertexOffset[RegionAttachment.OX1]; + offsetY = vertexOffset[RegionAttachment.OY1]; + worldVertices[offset] = offsetX * a + offsetY * b + x; + 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; + 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; + 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; + worldVertices[offset + 1] = offsetX * c + offsetY * d + y; + }; + RegionAttachment.prototype.copy = function () { + var 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; + spine.Utils.arrayCopy(this.uvs, 0, copy.uvs, 0, 8); + spine.Utils.arrayCopy(this.offset, 0, copy.offset, 0, 8); + copy.color.setFromColor(this.color); + return copy; + }; + RegionAttachment.OX1 = 0; + RegionAttachment.OY1 = 1; + RegionAttachment.OX2 = 2; + RegionAttachment.OY2 = 3; + RegionAttachment.OX3 = 4; + RegionAttachment.OY3 = 5; + RegionAttachment.OX4 = 6; + RegionAttachment.OY4 = 7; + RegionAttachment.X1 = 0; + RegionAttachment.Y1 = 1; + RegionAttachment.C1R = 2; + RegionAttachment.C1G = 3; + RegionAttachment.C1B = 4; + RegionAttachment.C1A = 5; + RegionAttachment.U1 = 6; + RegionAttachment.V1 = 7; + RegionAttachment.X2 = 8; + RegionAttachment.Y2 = 9; + RegionAttachment.C2R = 10; + RegionAttachment.C2G = 11; + RegionAttachment.C2B = 12; + RegionAttachment.C2A = 13; + RegionAttachment.U2 = 14; + RegionAttachment.V2 = 15; + RegionAttachment.X3 = 16; + RegionAttachment.Y3 = 17; + RegionAttachment.C3R = 18; + RegionAttachment.C3G = 19; + RegionAttachment.C3B = 20; + RegionAttachment.C3A = 21; + RegionAttachment.U3 = 22; + RegionAttachment.V3 = 23; + RegionAttachment.X4 = 24; + RegionAttachment.Y4 = 25; + RegionAttachment.C4R = 26; + RegionAttachment.C4G = 27; + RegionAttachment.C4B = 28; + RegionAttachment.C4A = 29; + RegionAttachment.U4 = 30; + RegionAttachment.V4 = 31; + return RegionAttachment; + }(spine.Attachment)); + spine.RegionAttachment = RegionAttachment; +})(spine || (spine = {})); +var spine; +(function (spine) { + var JitterEffect = (function () { + function JitterEffect(jitterX, jitterY) { + this.jitterX = 0; + this.jitterY = 0; + this.jitterX = jitterX; + this.jitterY = jitterY; + } + JitterEffect.prototype.begin = function (skeleton) { + }; + JitterEffect.prototype.transform = function (position, uv, light, dark) { + position.x += spine.MathUtils.randomTriangular(-this.jitterX, this.jitterY); + position.y += spine.MathUtils.randomTriangular(-this.jitterX, this.jitterY); + }; + JitterEffect.prototype.end = function () { + }; + return JitterEffect; + }()); + spine.JitterEffect = JitterEffect; +})(spine || (spine = {})); +var spine; +(function (spine) { + var SwirlEffect = (function () { + function SwirlEffect(radius) { + this.centerX = 0; + this.centerY = 0; + this.radius = 0; + this.angle = 0; + this.worldX = 0; + this.worldY = 0; + this.radius = radius; + } + SwirlEffect.prototype.begin = function (skeleton) { + this.worldX = skeleton.x + this.centerX; + this.worldY = skeleton.y + this.centerY; + }; + SwirlEffect.prototype.transform = function (position, uv, light, dark) { + var radAngle = this.angle * spine.MathUtils.degreesToRadians; + var x = position.x - this.worldX; + var y = position.y - this.worldY; + var dist = Math.sqrt(x * x + y * y); + if (dist < this.radius) { + var theta = SwirlEffect.interpolation.apply(0, radAngle, (this.radius - dist) / this.radius); + var cos = Math.cos(theta); + var sin = Math.sin(theta); + position.x = cos * x - sin * y + this.worldX; + position.y = sin * x + cos * y + this.worldY; + } + }; + SwirlEffect.prototype.end = function () { + }; + SwirlEffect.interpolation = new spine.PowOut(2); + return SwirlEffect; + }()); + spine.SwirlEffect = SwirlEffect; +})(spine || (spine = {})); +var spine; +(function (spine) { + var webgl; + (function (webgl) { + var AssetManager = (function (_super) { + __extends(AssetManager, _super); + function AssetManager(context, pathPrefix) { + if (pathPrefix === void 0) { pathPrefix = ""; } + return _super.call(this, function (image) { + return new spine.webgl.GLTexture(context, image); + }, pathPrefix) || this; + } + return AssetManager; + }(spine.AssetManager)); + webgl.AssetManager = AssetManager; + })(webgl = spine.webgl || (spine.webgl = {})); +})(spine || (spine = {})); +var spine; +(function (spine) { + var webgl; + (function (webgl) { + var OrthoCamera = (function () { + function OrthoCamera(viewportWidth, viewportHeight) { + this.position = new webgl.Vector3(0, 0, 0); + this.direction = new webgl.Vector3(0, 0, -1); + this.up = new webgl.Vector3(0, 1, 0); + this.near = 0; + this.far = 100; + this.zoom = 1; + this.viewportWidth = 0; + this.viewportHeight = 0; + this.projectionView = new webgl.Matrix4(); + this.inverseProjectionView = new webgl.Matrix4(); + this.projection = new webgl.Matrix4(); + this.view = new webgl.Matrix4(); + this.tmp = new webgl.Vector3(); + this.viewportWidth = viewportWidth; + this.viewportHeight = viewportHeight; + this.update(); + } + OrthoCamera.prototype.update = function () { + var projection = this.projection; + var view = this.view; + var projectionView = this.projectionView; + var inverseProjectionView = this.inverseProjectionView; + var zoom = this.zoom, viewportWidth = this.viewportWidth, viewportHeight = this.viewportHeight; + projection.ortho(zoom * (-viewportWidth / 2), zoom * (viewportWidth / 2), zoom * (-viewportHeight / 2), zoom * (viewportHeight / 2), this.near, this.far); + view.lookAt(this.position, this.direction, this.up); + projectionView.set(projection.values); + projectionView.multiply(view); + inverseProjectionView.set(projectionView.values).invert(); + }; + OrthoCamera.prototype.screenToWorld = function (screenCoords, screenWidth, screenHeight) { + var x = screenCoords.x, y = screenHeight - screenCoords.y - 1; + var tmp = this.tmp; + tmp.x = (2 * x) / screenWidth - 1; + tmp.y = (2 * y) / screenHeight - 1; + tmp.z = (2 * screenCoords.z) - 1; + tmp.project(this.inverseProjectionView); + screenCoords.set(tmp.x, tmp.y, tmp.z); + return screenCoords; + }; + OrthoCamera.prototype.setViewport = function (viewportWidth, viewportHeight) { + this.viewportWidth = viewportWidth; + this.viewportHeight = viewportHeight; + }; + return OrthoCamera; + }()); + webgl.OrthoCamera = OrthoCamera; + })(webgl = spine.webgl || (spine.webgl = {})); +})(spine || (spine = {})); +var spine; +(function (spine) { + var webgl; + (function (webgl) { + var GLTexture = (function (_super) { + __extends(GLTexture, _super); + function GLTexture(context, image, useMipMaps) { + if (useMipMaps === void 0) { useMipMaps = false; } + var _this = _super.call(this, image) || this; + _this.texture = null; + _this.boundUnit = 0; + _this.useMipMaps = false; + _this.context = context instanceof webgl.ManagedWebGLRenderingContext ? context : new webgl.ManagedWebGLRenderingContext(context); + _this.useMipMaps = useMipMaps; + _this.restore(); + _this.context.addRestorable(_this); + return _this; + } + GLTexture.prototype.setFilters = function (minFilter, magFilter) { + var gl = this.context.gl; + this.bind(); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, minFilter); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, GLTexture.validateMagFilter(magFilter)); + }; + GLTexture.validateMagFilter = function (magFilter) { + switch (magFilter) { + case spine.TextureFilter.MipMap: + case spine.TextureFilter.MipMapLinearLinear: + case spine.TextureFilter.MipMapLinearNearest: + case spine.TextureFilter.MipMapNearestLinear: + case spine.TextureFilter.MipMapNearestNearest: + return spine.TextureFilter.Linear; + default: + return magFilter; + } + }; + GLTexture.prototype.setWraps = function (uWrap, vWrap) { + var gl = this.context.gl; + this.bind(); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, uWrap); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, vWrap); + }; + GLTexture.prototype.update = function (useMipMaps) { + var gl = this.context.gl; + if (!this.texture) { + this.texture = this.context.gl.createTexture(); + } + this.bind(); + if (GLTexture.DISABLE_UNPACK_PREMULTIPLIED_ALPHA_WEBGL) + gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, this._image); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, useMipMaps ? gl.LINEAR_MIPMAP_LINEAR : gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + if (useMipMaps) + gl.generateMipmap(gl.TEXTURE_2D); + }; + GLTexture.prototype.restore = function () { + this.texture = null; + this.update(this.useMipMaps); + }; + GLTexture.prototype.bind = function (unit) { + if (unit === void 0) { unit = 0; } + var gl = this.context.gl; + this.boundUnit = unit; + gl.activeTexture(gl.TEXTURE0 + unit); + gl.bindTexture(gl.TEXTURE_2D, this.texture); + }; + GLTexture.prototype.unbind = function () { + var gl = this.context.gl; + gl.activeTexture(gl.TEXTURE0 + this.boundUnit); + gl.bindTexture(gl.TEXTURE_2D, null); + }; + GLTexture.prototype.dispose = function () { + this.context.removeRestorable(this); + var gl = this.context.gl; + gl.deleteTexture(this.texture); + }; + GLTexture.DISABLE_UNPACK_PREMULTIPLIED_ALPHA_WEBGL = false; + return GLTexture; + }(spine.Texture)); + webgl.GLTexture = GLTexture; + })(webgl = spine.webgl || (spine.webgl = {})); +})(spine || (spine = {})); +var spine; +(function (spine) { + var webgl; + (function (webgl) { + var Input = (function () { + function Input(element) { + this.lastX = 0; + this.lastY = 0; + this.buttonDown = false; + this.currTouch = null; + this.touchesPool = new spine.Pool(function () { + return new spine.webgl.Touch(0, 0, 0); + }); + this.listeners = new Array(); + this.element = element; + this.setupCallbacks(element); + } + Input.prototype.setupCallbacks = function (element) { + var _this = this; + var mouseDown = function (ev) { + if (ev instanceof MouseEvent) { + var rect = element.getBoundingClientRect(); + var x = ev.clientX - rect.left; + var y = ev.clientY - rect.top; + var listeners = _this.listeners; + for (var i = 0; i < listeners.length; i++) { + if (listeners[i].down) + listeners[i].down(x, y); + } + _this.lastX = x; + _this.lastY = y; + _this.buttonDown = true; + document.addEventListener("mousemove", mouseMove); + document.addEventListener("mouseup", mouseUp); + } + }; + var mouseMove = function (ev) { + if (ev instanceof MouseEvent) { + var rect = element.getBoundingClientRect(); + var x = ev.clientX - rect.left; + var y = ev.clientY - rect.top; + var listeners = _this.listeners; + for (var i = 0; i < listeners.length; i++) { + if (_this.buttonDown) { + if (listeners[i].dragged) + listeners[i].dragged(x, y); + } + else { + if (listeners[i].moved) + listeners[i].moved(x, y); + } + } + _this.lastX = x; + _this.lastY = y; + } + }; + var mouseUp = function (ev) { + if (ev instanceof MouseEvent) { + var rect = element.getBoundingClientRect(); + var x = ev.clientX - rect.left; + var y = ev.clientY - rect.top; + var listeners = _this.listeners; + for (var i = 0; i < listeners.length; i++) { + if (listeners[i].up) + listeners[i].up(x, y); + } + _this.lastX = x; + _this.lastY = y; + _this.buttonDown = false; + document.removeEventListener("mousemove", mouseMove); + document.removeEventListener("mouseup", mouseUp); + } + }; + element.addEventListener("mousedown", mouseDown, true); + element.addEventListener("mousemove", mouseMove, true); + element.addEventListener("mouseup", mouseUp, true); + element.addEventListener("touchstart", function (ev) { + if (_this.currTouch != null) + return; + var touches = ev.changedTouches; + for (var i = 0; i < touches.length; i++) { + var touch = touches[i]; + var rect = element.getBoundingClientRect(); + var x = touch.clientX - rect.left; + var y = touch.clientY - rect.top; + _this.currTouch = _this.touchesPool.obtain(); + _this.currTouch.identifier = touch.identifier; + _this.currTouch.x = x; + _this.currTouch.y = y; + break; + } + var listeners = _this.listeners; + for (var i_17 = 0; i_17 < listeners.length; i_17++) { + if (listeners[i_17].down) + listeners[i_17].down(_this.currTouch.x, _this.currTouch.y); + } + _this.lastX = _this.currTouch.x; + _this.lastY = _this.currTouch.y; + _this.buttonDown = true; + ev.preventDefault(); + }, false); + element.addEventListener("touchend", function (ev) { + var touches = ev.changedTouches; + for (var i = 0; i < touches.length; i++) { + var touch = touches[i]; + if (_this.currTouch.identifier === touch.identifier) { + var rect = element.getBoundingClientRect(); + var x = _this.currTouch.x = touch.clientX - rect.left; + var y = _this.currTouch.y = touch.clientY - rect.top; + _this.touchesPool.free(_this.currTouch); + var listeners = _this.listeners; + for (var i_18 = 0; i_18 < listeners.length; i_18++) { + if (listeners[i_18].up) + listeners[i_18].up(x, y); + } + _this.lastX = x; + _this.lastY = y; + _this.buttonDown = false; + _this.currTouch = null; + break; + } + } + ev.preventDefault(); + }, false); + element.addEventListener("touchcancel", function (ev) { + var touches = ev.changedTouches; + for (var i = 0; i < touches.length; i++) { + var touch = touches[i]; + if (_this.currTouch.identifier === touch.identifier) { + var rect = element.getBoundingClientRect(); + var x = _this.currTouch.x = touch.clientX - rect.left; + var y = _this.currTouch.y = touch.clientY - rect.top; + _this.touchesPool.free(_this.currTouch); + var listeners = _this.listeners; + for (var i_19 = 0; i_19 < listeners.length; i_19++) { + if (listeners[i_19].up) + listeners[i_19].up(x, y); + } + _this.lastX = x; + _this.lastY = y; + _this.buttonDown = false; + _this.currTouch = null; + break; + } + } + ev.preventDefault(); + }, false); + element.addEventListener("touchmove", function (ev) { + if (_this.currTouch == null) + return; + var touches = ev.changedTouches; + for (var i = 0; i < touches.length; i++) { + var touch = touches[i]; + if (_this.currTouch.identifier === touch.identifier) { + var rect = element.getBoundingClientRect(); + var x = touch.clientX - rect.left; + var y = touch.clientY - rect.top; + var listeners = _this.listeners; + for (var i_20 = 0; i_20 < listeners.length; i_20++) { + if (listeners[i_20].dragged) + listeners[i_20].dragged(x, y); + } + _this.lastX = _this.currTouch.x = x; + _this.lastY = _this.currTouch.y = y; + break; + } + } + ev.preventDefault(); + }, false); + }; + Input.prototype.addListener = function (listener) { + this.listeners.push(listener); + }; + Input.prototype.removeListener = function (listener) { + var idx = this.listeners.indexOf(listener); + if (idx > -1) { + this.listeners.splice(idx, 1); + } + }; + return Input; + }()); + webgl.Input = Input; + var Touch = (function () { + function Touch(identifier, x, y) { + this.identifier = identifier; + this.x = x; + this.y = y; + } + return Touch; + }()); + webgl.Touch = Touch; + })(webgl = spine.webgl || (spine.webgl = {})); +})(spine || (spine = {})); +var spine; +(function (spine) { + var webgl; + (function (webgl) { + var LoadingScreen = (function () { + function LoadingScreen(renderer) { + this.logo = null; + this.spinner = null; + this.angle = 0; + this.fadeOut = 0; + this.timeKeeper = new spine.TimeKeeper(); + this.backgroundColor = new spine.Color(0.135, 0.135, 0.135, 1); + this.tempColor = new spine.Color(); + this.firstDraw = 0; + this.renderer = renderer; + this.timeKeeper.maxDelta = 9; + if (LoadingScreen.logoImg === null) { + var isSafari = navigator.userAgent.indexOf("Safari") > -1; + LoadingScreen.logoImg = new Image(); + LoadingScreen.logoImg.src = LoadingScreen.SPINE_LOGO_DATA; + if (!isSafari) + LoadingScreen.logoImg.crossOrigin = "anonymous"; + LoadingScreen.logoImg.onload = function (ev) { + LoadingScreen.loaded++; + }; + LoadingScreen.spinnerImg = new Image(); + LoadingScreen.spinnerImg.src = LoadingScreen.SPINNER_DATA; + if (!isSafari) + LoadingScreen.spinnerImg.crossOrigin = "anonymous"; + LoadingScreen.spinnerImg.onload = function (ev) { + LoadingScreen.loaded++; + }; + } + } + LoadingScreen.prototype.draw = function (complete) { + if (complete === void 0) { complete = false; } + if (complete && this.fadeOut > LoadingScreen.FADE_SECONDS) + return; + this.timeKeeper.update(); + var a = Math.abs(Math.sin(this.timeKeeper.totalTime + 0.75)); + this.angle -= this.timeKeeper.delta / 1.4 * 360 * (1 + 1.5 * Math.pow(a, 5)); + var renderer = this.renderer; + var canvas = renderer.canvas; + var gl = renderer.context.gl; + renderer.resize(webgl.ResizeMode.Stretch); + var oldX = renderer.camera.position.x, oldY = renderer.camera.position.y; + renderer.camera.position.set(canvas.width / 2, canvas.height / 2, 0); + renderer.camera.viewportWidth = canvas.width; + renderer.camera.viewportHeight = canvas.height; + if (!complete) { + gl.clearColor(this.backgroundColor.r, this.backgroundColor.g, this.backgroundColor.b, this.backgroundColor.a); + gl.clear(gl.COLOR_BUFFER_BIT); + this.tempColor.a = 1; + } + else { + this.fadeOut += this.timeKeeper.delta * (this.timeKeeper.totalTime < 1 ? 2 : 1); + if (this.fadeOut > LoadingScreen.FADE_SECONDS) { + renderer.camera.position.set(oldX, oldY, 0); + return; + } + a = 1 - this.fadeOut / LoadingScreen.FADE_SECONDS; + this.tempColor.setFromColor(this.backgroundColor); + this.tempColor.a = 1 - (a - 1) * (a - 1); + renderer.begin(); + renderer.quad(true, 0, 0, canvas.width, 0, canvas.width, canvas.height, 0, canvas.height, this.tempColor, this.tempColor, this.tempColor, this.tempColor); + renderer.end(); + } + this.tempColor.set(1, 1, 1, this.tempColor.a); + if (LoadingScreen.loaded != 2) + return; + if (this.logo === null) { + this.logo = new webgl.GLTexture(renderer.context, LoadingScreen.logoImg); + this.spinner = new webgl.GLTexture(renderer.context, LoadingScreen.spinnerImg); + } + this.logo.update(false); + this.spinner.update(false); + var logoWidth = this.logo.getImage().width; + var logoHeight = this.logo.getImage().height; + var spinnerWidth = this.spinner.getImage().width; + var spinnerHeight = this.spinner.getImage().height; + renderer.batcher.setBlendMode(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA); + renderer.begin(); + renderer.drawTexture(this.logo, (canvas.width - logoWidth) / 2, (canvas.height - logoHeight) / 2, logoWidth, logoHeight, this.tempColor); + renderer.drawTextureRotated(this.spinner, (canvas.width - spinnerWidth) / 2, (canvas.height - spinnerHeight) / 2, spinnerWidth, spinnerHeight, spinnerWidth / 2, spinnerHeight / 2, this.angle, this.tempColor); + renderer.end(); + renderer.camera.position.set(oldX, oldY, 0); + }; + LoadingScreen.FADE_SECONDS = 1; + LoadingScreen.loaded = 0; + LoadingScreen.spinnerImg = null; + LoadingScreen.logoImg = null; + LoadingScreen.SPINNER_DATA = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKMAAACjCAYAAADmbK6AAAAACXBIWXMAAAsTAAALEwEAmpwYAAALB2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDIgNzkuMTYwOTI0LCAyMDE3LzA3LzEzLTAxOjA2OjM5ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIiB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxNS41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMTYtMDktMDhUMTQ6MjU6MTIrMDI6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMTgtMTEtMTVUMTY6NDA6NTkrMDE6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDE4LTExLTE1VDE2OjQwOjU5KzAxOjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpmZDhlNTljMC02NGJjLTIxNGQtODAyZi1jZDlhODJjM2ZjMGMiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDpmYmNmZWJlYS03MjY2LWE0NGQtOTI4NS0wOTJmNGNhYzk4ZWEiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowODMzNWIyYy04NzYyLWQzNGMtOTBhOS02ODJjYjJmYTQ2M2UiIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHRpZmY6T3JpZW50YXRpb249IjEiIHRpZmY6WFJlc29sdXRpb249IjcyMDAwMC8xMDAwMCIgdGlmZjpZUmVzb2x1dGlvbj0iNzIwMDAwLzEwMDAwIiB0aWZmOlJlc29sdXRpb25Vbml0PSIyIiBleGlmOkNvbG9yU3BhY2U9IjY1NTM1IiBleGlmOlBpeGVsWERpbWVuc2lvbj0iMjk3IiBleGlmOlBpeGVsWURpbWVuc2lvbj0iMjQyIj4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY3JlYXRlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDowODMzNWIyYy04NzYyLWQzNGMtOTBhOS02ODJjYjJmYTQ2M2UiIHN0RXZ0OndoZW49IjIwMTYtMDktMDhUMTQ6MjU6MTIrMDI6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1LjUgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpiNThlMTlkNi0xYTRjLTQyNDEtODU0ZC01MDVlZjYxMjRhODQiIHN0RXZ0OndoZW49IjIwMTgtMTEtMTVUMTY6NDA6MjMrMDE6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cykiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjQ3YzYzYzIwLWJkYjgtYzM0YS1hYzMyLWQ5MDdjOWEyOTA0MCIgc3RFdnQ6d2hlbj0iMjAxOC0xMS0xNVQxNjo0MDo1OSswMTowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY29udmVydGVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJmcm9tIGFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5waG90b3Nob3AgdG8gaW1hZ2UvcG5nIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJkZXJpdmVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJjb252ZXJ0ZWQgZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6ZmQ4ZTU5YzAtNjRiYy0yMTRkLTgwMmYtY2Q5YTgyYzNmYzBjIiBzdEV2dDp3aGVuPSIyMDE4LTExLTE1VDE2OjQwOjU5KzAxOjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0N2M2M2MyMC1iZGI4LWMzNGEtYWMzMi1kOTA3YzlhMjkwNDAiIHN0UmVmOmRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDo2OWRmZjljYy01YzFiLWE5NDctOTc3OS03ODgxZjM0ODk3MDMiIHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowODMzNWIyYy04NzYyLWQzNGMtOTBhOS02ODJjYjJmYTQ2M2UiLz4gPHBob3Rvc2hvcDpEb2N1bWVudEFu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"; + LoadingScreen.SPINE_LOGO_DATA = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKUAAABsCAYAAAALzHKmAAAACXBIWXMAAAsTAAALEwEAmpwYAAALB2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDIgNzkuMTYwOTI0LCAyMDE3LzA3LzEzLTAxOjA2OjM5ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIiB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxNS41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMTYtMDktMDhUMTQ6MjU6MTIrMDI6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMTgtMTEtMTVUMTY6NDA6NTkrMDE6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDE4LTExLTE1VDE2OjQwOjU5KzAxOjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDowMTdhZGQ3Ni04OTZlLThlNGUtYmM5MS00ZjEyNjI1YjA3MjgiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDplMTViNGE2ZS1hMDg3LWEzNDktODdhOS1mNDYzYjE2MzQ0Y2MiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowODMzNWIyYy04NzYyLWQzNGMtOTBhOS02ODJjYjJmYTQ2M2UiIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHRpZmY6T3JpZW50YXRpb249IjEiIHRpZmY6WFJlc29sdXRpb249IjcyMDAwMC8xMDAwMCIgdGlmZjpZUmVzb2x1dGlvbj0iNzIwMDAwLzEwMDAwIiB0aWZmOlJlc29sdXRpb25Vbml0PSIyIiBleGlmOkNvbG9yU3BhY2U9IjY1NTM1IiBleGlmOlBpeGVsWERpbWVuc2lvbj0iMjk3IiBleGlmOlBpeGVsWURpbWVuc2lvbj0iMjQyIj4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY3JlYXRlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDowODMzNWIyYy04NzYyLWQzNGMtOTBhOS02ODJjYjJmYTQ2M2UiIHN0RXZ0OndoZW49IjIwMTYtMDktMDhUMTQ6MjU6MTIrMDI6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1LjUgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpiNThlMTlkNi0xYTRjLTQyNDEtODU0ZC01MDVlZjYxMjRhODQiIHN0RXZ0OndoZW49IjIwMTgtMTEtMTVUMTY6NDA6MjMrMDE6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cykiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjJlNjJiMWM2LWIxYzQtNDk0MC04MDMxLWU4ZDkyNTBmODJjNSIgc3RFdnQ6d2hlbj0iMjAxOC0xMS0xNVQxNjo0MDo1OSswMTowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY29udmVydGVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJmcm9tIGFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5waG90b3Nob3AgdG8gaW1hZ2UvcG5nIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJkZXJpdmVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJjb252ZXJ0ZWQgZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6MDE3YWRkNzYtODk2ZS04ZTRlLWJjOTEtNGYxMjYyNWIwNzI4IiBzdEV2dDp3aGVuPSIyMDE4LTExLTE1VDE2OjQwOjU5KzAxOjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyZTYyYjFjNi1iMWM0LTQ5NDAtODAzMS1lOGQ5MjUwZjgyYzUiIHN0UmVmOmRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDo2OWRmZjljYy01YzFiLWE5NDctOTc3OS03ODgxZjM0ODk3MDMiIHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowODMzNWIyYy04NzYyLWQzNGMtOTBhOS02ODJjYjJmYTQ2M2UiLz4gPHBob3Rvc2hvcDpEb2N1bWVudEFu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"; + return LoadingScreen; + }()); + webgl.LoadingScreen = LoadingScreen; + })(webgl = spine.webgl || (spine.webgl = {})); +})(spine || (spine = {})); +var spine; +(function (spine) { + var webgl; + (function (webgl) { + webgl.M00 = 0; + webgl.M01 = 4; + webgl.M02 = 8; + webgl.M03 = 12; + webgl.M10 = 1; + webgl.M11 = 5; + webgl.M12 = 9; + webgl.M13 = 13; + webgl.M20 = 2; + webgl.M21 = 6; + webgl.M22 = 10; + webgl.M23 = 14; + webgl.M30 = 3; + webgl.M31 = 7; + webgl.M32 = 11; + webgl.M33 = 15; + var Matrix4 = (function () { + function Matrix4() { + this.temp = new Float32Array(16); + this.values = new Float32Array(16); + var v = this.values; + v[webgl.M00] = 1; + v[webgl.M11] = 1; + v[webgl.M22] = 1; + v[webgl.M33] = 1; + } + Matrix4.prototype.set = function (values) { + this.values.set(values); + return this; + }; + Matrix4.prototype.transpose = function () { + var t = this.temp; + var v = this.values; + t[webgl.M00] = v[webgl.M00]; + t[webgl.M01] = v[webgl.M10]; + t[webgl.M02] = v[webgl.M20]; + t[webgl.M03] = v[webgl.M30]; + t[webgl.M10] = v[webgl.M01]; + t[webgl.M11] = v[webgl.M11]; + t[webgl.M12] = v[webgl.M21]; + t[webgl.M13] = v[webgl.M31]; + t[webgl.M20] = v[webgl.M02]; + t[webgl.M21] = v[webgl.M12]; + t[webgl.M22] = v[webgl.M22]; + t[webgl.M23] = v[webgl.M32]; + t[webgl.M30] = v[webgl.M03]; + t[webgl.M31] = v[webgl.M13]; + t[webgl.M32] = v[webgl.M23]; + t[webgl.M33] = v[webgl.M33]; + return this.set(t); + }; + Matrix4.prototype.identity = function () { + var v = this.values; + v[webgl.M00] = 1; + v[webgl.M01] = 0; + v[webgl.M02] = 0; + v[webgl.M03] = 0; + v[webgl.M10] = 0; + v[webgl.M11] = 1; + v[webgl.M12] = 0; + v[webgl.M13] = 0; + v[webgl.M20] = 0; + v[webgl.M21] = 0; + v[webgl.M22] = 1; + v[webgl.M23] = 0; + v[webgl.M30] = 0; + v[webgl.M31] = 0; + v[webgl.M32] = 0; + v[webgl.M33] = 1; + return this; + }; + Matrix4.prototype.invert = function () { + var v = this.values; + var t = this.temp; + var l_det = v[webgl.M30] * v[webgl.M21] * v[webgl.M12] * v[webgl.M03] - v[webgl.M20] * v[webgl.M31] * v[webgl.M12] * v[webgl.M03] - v[webgl.M30] * v[webgl.M11] * v[webgl.M22] * v[webgl.M03] + + v[webgl.M10] * v[webgl.M31] * v[webgl.M22] * v[webgl.M03] + v[webgl.M20] * v[webgl.M11] * v[webgl.M32] * v[webgl.M03] - v[webgl.M10] * v[webgl.M21] * v[webgl.M32] * v[webgl.M03] + - v[webgl.M30] * v[webgl.M21] * v[webgl.M02] * v[webgl.M13] + v[webgl.M20] * v[webgl.M31] * v[webgl.M02] * v[webgl.M13] + v[webgl.M30] * v[webgl.M01] * v[webgl.M22] * v[webgl.M13] + - v[webgl.M00] * v[webgl.M31] * v[webgl.M22] * v[webgl.M13] - v[webgl.M20] * v[webgl.M01] * v[webgl.M32] * v[webgl.M13] + v[webgl.M00] * v[webgl.M21] * v[webgl.M32] * v[webgl.M13] + + v[webgl.M30] * v[webgl.M11] * v[webgl.M02] * v[webgl.M23] - v[webgl.M10] * v[webgl.M31] * v[webgl.M02] * v[webgl.M23] - v[webgl.M30] * v[webgl.M01] * v[webgl.M12] * v[webgl.M23] + + v[webgl.M00] * v[webgl.M31] * v[webgl.M12] * v[webgl.M23] + v[webgl.M10] * v[webgl.M01] * v[webgl.M32] * v[webgl.M23] - v[webgl.M00] * v[webgl.M11] * v[webgl.M32] * v[webgl.M23] + - v[webgl.M20] * v[webgl.M11] * v[webgl.M02] * v[webgl.M33] + v[webgl.M10] * v[webgl.M21] * v[webgl.M02] * v[webgl.M33] + v[webgl.M20] * v[webgl.M01] * v[webgl.M12] * v[webgl.M33] + - v[webgl.M00] * v[webgl.M21] * v[webgl.M12] * v[webgl.M33] - v[webgl.M10] * v[webgl.M01] * v[webgl.M22] * v[webgl.M33] + v[webgl.M00] * v[webgl.M11] * v[webgl.M22] * v[webgl.M33]; + if (l_det == 0) + throw new Error("non-invertible matrix"); + var inv_det = 1.0 / l_det; + t[webgl.M00] = v[webgl.M12] * v[webgl.M23] * v[webgl.M31] - v[webgl.M13] * v[webgl.M22] * v[webgl.M31] + v[webgl.M13] * v[webgl.M21] * v[webgl.M32] + - v[webgl.M11] * v[webgl.M23] * v[webgl.M32] - v[webgl.M12] * v[webgl.M21] * v[webgl.M33] + v[webgl.M11] * v[webgl.M22] * v[webgl.M33]; + t[webgl.M01] = v[webgl.M03] * v[webgl.M22] * v[webgl.M31] - v[webgl.M02] * v[webgl.M23] * v[webgl.M31] - v[webgl.M03] * v[webgl.M21] * v[webgl.M32] + + v[webgl.M01] * v[webgl.M23] * v[webgl.M32] + v[webgl.M02] * v[webgl.M21] * v[webgl.M33] - v[webgl.M01] * v[webgl.M22] * v[webgl.M33]; + t[webgl.M02] = v[webgl.M02] * v[webgl.M13] * v[webgl.M31] - v[webgl.M03] * v[webgl.M12] * v[webgl.M31] + v[webgl.M03] * v[webgl.M11] * v[webgl.M32] + - v[webgl.M01] * v[webgl.M13] * v[webgl.M32] - v[webgl.M02] * v[webgl.M11] * v[webgl.M33] + v[webgl.M01] * v[webgl.M12] * v[webgl.M33]; + t[webgl.M03] = v[webgl.M03] * v[webgl.M12] * v[webgl.M21] - v[webgl.M02] * v[webgl.M13] * v[webgl.M21] - v[webgl.M03] * v[webgl.M11] * v[webgl.M22] + + v[webgl.M01] * v[webgl.M13] * v[webgl.M22] + v[webgl.M02] * v[webgl.M11] * v[webgl.M23] - v[webgl.M01] * v[webgl.M12] * v[webgl.M23]; + t[webgl.M10] = v[webgl.M13] * v[webgl.M22] * v[webgl.M30] - v[webgl.M12] * v[webgl.M23] * v[webgl.M30] - v[webgl.M13] * v[webgl.M20] * v[webgl.M32] + + v[webgl.M10] * v[webgl.M23] * v[webgl.M32] + v[webgl.M12] * v[webgl.M20] * v[webgl.M33] - v[webgl.M10] * v[webgl.M22] * v[webgl.M33]; + t[webgl.M11] = v[webgl.M02] * v[webgl.M23] * v[webgl.M30] - v[webgl.M03] * v[webgl.M22] * v[webgl.M30] + v[webgl.M03] * v[webgl.M20] * v[webgl.M32] + - v[webgl.M00] * v[webgl.M23] * v[webgl.M32] - v[webgl.M02] * v[webgl.M20] * v[webgl.M33] + v[webgl.M00] * v[webgl.M22] * v[webgl.M33]; + t[webgl.M12] = v[webgl.M03] * v[webgl.M12] * v[webgl.M30] - v[webgl.M02] * v[webgl.M13] * v[webgl.M30] - v[webgl.M03] * v[webgl.M10] * v[webgl.M32] + + v[webgl.M00] * v[webgl.M13] * v[webgl.M32] + v[webgl.M02] * v[webgl.M10] * v[webgl.M33] - v[webgl.M00] * v[webgl.M12] * v[webgl.M33]; + t[webgl.M13] = v[webgl.M02] * v[webgl.M13] * v[webgl.M20] - v[webgl.M03] * v[webgl.M12] * v[webgl.M20] + v[webgl.M03] * v[webgl.M10] * v[webgl.M22] + - v[webgl.M00] * v[webgl.M13] * v[webgl.M22] - v[webgl.M02] * v[webgl.M10] * v[webgl.M23] + v[webgl.M00] * v[webgl.M12] * v[webgl.M23]; + t[webgl.M20] = v[webgl.M11] * v[webgl.M23] * v[webgl.M30] - v[webgl.M13] * v[webgl.M21] * v[webgl.M30] + v[webgl.M13] * v[webgl.M20] * v[webgl.M31] + - v[webgl.M10] * v[webgl.M23] * v[webgl.M31] - v[webgl.M11] * v[webgl.M20] * v[webgl.M33] + v[webgl.M10] * v[webgl.M21] * v[webgl.M33]; + t[webgl.M21] = v[webgl.M03] * v[webgl.M21] * v[webgl.M30] - v[webgl.M01] * v[webgl.M23] * v[webgl.M30] - v[webgl.M03] * v[webgl.M20] * v[webgl.M31] + + v[webgl.M00] * v[webgl.M23] * v[webgl.M31] + v[webgl.M01] * v[webgl.M20] * v[webgl.M33] - v[webgl.M00] * v[webgl.M21] * v[webgl.M33]; + t[webgl.M22] = v[webgl.M01] * v[webgl.M13] * v[webgl.M30] - v[webgl.M03] * v[webgl.M11] * v[webgl.M30] + v[webgl.M03] * v[webgl.M10] * v[webgl.M31] + - v[webgl.M00] * v[webgl.M13] * v[webgl.M31] - v[webgl.M01] * v[webgl.M10] * v[webgl.M33] + v[webgl.M00] * v[webgl.M11] * v[webgl.M33]; + t[webgl.M23] = v[webgl.M03] * v[webgl.M11] * v[webgl.M20] - v[webgl.M01] * v[webgl.M13] * v[webgl.M20] - v[webgl.M03] * v[webgl.M10] * v[webgl.M21] + + v[webgl.M00] * v[webgl.M13] * v[webgl.M21] + v[webgl.M01] * v[webgl.M10] * v[webgl.M23] - v[webgl.M00] * v[webgl.M11] * v[webgl.M23]; + t[webgl.M30] = v[webgl.M12] * v[webgl.M21] * v[webgl.M30] - v[webgl.M11] * v[webgl.M22] * v[webgl.M30] - v[webgl.M12] * v[webgl.M20] * v[webgl.M31] + + v[webgl.M10] * v[webgl.M22] * v[webgl.M31] + v[webgl.M11] * v[webgl.M20] * v[webgl.M32] - v[webgl.M10] * v[webgl.M21] * v[webgl.M32]; + t[webgl.M31] = v[webgl.M01] * v[webgl.M22] * v[webgl.M30] - v[webgl.M02] * v[webgl.M21] * v[webgl.M30] + v[webgl.M02] * v[webgl.M20] * v[webgl.M31] + - v[webgl.M00] * v[webgl.M22] * v[webgl.M31] - v[webgl.M01] * v[webgl.M20] * v[webgl.M32] + v[webgl.M00] * v[webgl.M21] * v[webgl.M32]; + t[webgl.M32] = v[webgl.M02] * v[webgl.M11] * v[webgl.M30] - v[webgl.M01] * v[webgl.M12] * v[webgl.M30] - v[webgl.M02] * v[webgl.M10] * v[webgl.M31] + + v[webgl.M00] * v[webgl.M12] * v[webgl.M31] + v[webgl.M01] * v[webgl.M10] * v[webgl.M32] - v[webgl.M00] * v[webgl.M11] * v[webgl.M32]; + t[webgl.M33] = v[webgl.M01] * v[webgl.M12] * v[webgl.M20] - v[webgl.M02] * v[webgl.M11] * v[webgl.M20] + v[webgl.M02] * v[webgl.M10] * v[webgl.M21] + - v[webgl.M00] * v[webgl.M12] * v[webgl.M21] - v[webgl.M01] * v[webgl.M10] * v[webgl.M22] + v[webgl.M00] * v[webgl.M11] * v[webgl.M22]; + v[webgl.M00] = t[webgl.M00] * inv_det; + v[webgl.M01] = t[webgl.M01] * inv_det; + v[webgl.M02] = t[webgl.M02] * inv_det; + v[webgl.M03] = t[webgl.M03] * inv_det; + v[webgl.M10] = t[webgl.M10] * inv_det; + v[webgl.M11] = t[webgl.M11] * inv_det; + v[webgl.M12] = t[webgl.M12] * inv_det; + v[webgl.M13] = t[webgl.M13] * inv_det; + v[webgl.M20] = t[webgl.M20] * inv_det; + v[webgl.M21] = t[webgl.M21] * inv_det; + v[webgl.M22] = t[webgl.M22] * inv_det; + v[webgl.M23] = t[webgl.M23] * inv_det; + v[webgl.M30] = t[webgl.M30] * inv_det; + v[webgl.M31] = t[webgl.M31] * inv_det; + v[webgl.M32] = t[webgl.M32] * inv_det; + v[webgl.M33] = t[webgl.M33] * inv_det; + return this; + }; + Matrix4.prototype.determinant = function () { + var v = this.values; + return v[webgl.M30] * v[webgl.M21] * v[webgl.M12] * v[webgl.M03] - v[webgl.M20] * v[webgl.M31] * v[webgl.M12] * v[webgl.M03] - v[webgl.M30] * v[webgl.M11] * v[webgl.M22] * v[webgl.M03] + + v[webgl.M10] * v[webgl.M31] * v[webgl.M22] * v[webgl.M03] + v[webgl.M20] * v[webgl.M11] * v[webgl.M32] * v[webgl.M03] - v[webgl.M10] * v[webgl.M21] * v[webgl.M32] * v[webgl.M03] + - v[webgl.M30] * v[webgl.M21] * v[webgl.M02] * v[webgl.M13] + v[webgl.M20] * v[webgl.M31] * v[webgl.M02] * v[webgl.M13] + v[webgl.M30] * v[webgl.M01] * v[webgl.M22] * v[webgl.M13] + - v[webgl.M00] * v[webgl.M31] * v[webgl.M22] * v[webgl.M13] - v[webgl.M20] * v[webgl.M01] * v[webgl.M32] * v[webgl.M13] + v[webgl.M00] * v[webgl.M21] * v[webgl.M32] * v[webgl.M13] + + v[webgl.M30] * v[webgl.M11] * v[webgl.M02] * v[webgl.M23] - v[webgl.M10] * v[webgl.M31] * v[webgl.M02] * v[webgl.M23] - v[webgl.M30] * v[webgl.M01] * v[webgl.M12] * v[webgl.M23] + + v[webgl.M00] * v[webgl.M31] * v[webgl.M12] * v[webgl.M23] + v[webgl.M10] * v[webgl.M01] * v[webgl.M32] * v[webgl.M23] - v[webgl.M00] * v[webgl.M11] * v[webgl.M32] * v[webgl.M23] + - v[webgl.M20] * v[webgl.M11] * v[webgl.M02] * v[webgl.M33] + v[webgl.M10] * v[webgl.M21] * v[webgl.M02] * v[webgl.M33] + v[webgl.M20] * v[webgl.M01] * v[webgl.M12] * v[webgl.M33] + - v[webgl.M00] * v[webgl.M21] * v[webgl.M12] * v[webgl.M33] - v[webgl.M10] * v[webgl.M01] * v[webgl.M22] * v[webgl.M33] + v[webgl.M00] * v[webgl.M11] * v[webgl.M22] * v[webgl.M33]; + }; + Matrix4.prototype.translate = function (x, y, z) { + var v = this.values; + v[webgl.M03] += x; + v[webgl.M13] += y; + v[webgl.M23] += z; + return this; + }; + Matrix4.prototype.copy = function () { + return new Matrix4().set(this.values); + }; + Matrix4.prototype.projection = function (near, far, fovy, aspectRatio) { + this.identity(); + var l_fd = (1.0 / Math.tan((fovy * (Math.PI / 180)) / 2.0)); + var l_a1 = (far + near) / (near - far); + var l_a2 = (2 * far * near) / (near - far); + var v = this.values; + v[webgl.M00] = l_fd / aspectRatio; + v[webgl.M10] = 0; + v[webgl.M20] = 0; + v[webgl.M30] = 0; + v[webgl.M01] = 0; + v[webgl.M11] = l_fd; + v[webgl.M21] = 0; + v[webgl.M31] = 0; + v[webgl.M02] = 0; + v[webgl.M12] = 0; + v[webgl.M22] = l_a1; + v[webgl.M32] = -1; + v[webgl.M03] = 0; + v[webgl.M13] = 0; + v[webgl.M23] = l_a2; + v[webgl.M33] = 0; + return this; + }; + Matrix4.prototype.ortho2d = function (x, y, width, height) { + return this.ortho(x, x + width, y, y + height, 0, 1); + }; + Matrix4.prototype.ortho = function (left, right, bottom, top, near, far) { + this.identity(); + var x_orth = 2 / (right - left); + var y_orth = 2 / (top - bottom); + var z_orth = -2 / (far - near); + var tx = -(right + left) / (right - left); + var ty = -(top + bottom) / (top - bottom); + var tz = -(far + near) / (far - near); + var v = this.values; + v[webgl.M00] = x_orth; + v[webgl.M10] = 0; + v[webgl.M20] = 0; + v[webgl.M30] = 0; + v[webgl.M01] = 0; + v[webgl.M11] = y_orth; + v[webgl.M21] = 0; + v[webgl.M31] = 0; + v[webgl.M02] = 0; + v[webgl.M12] = 0; + v[webgl.M22] = z_orth; + v[webgl.M32] = 0; + v[webgl.M03] = tx; + v[webgl.M13] = ty; + v[webgl.M23] = tz; + v[webgl.M33] = 1; + return this; + }; + Matrix4.prototype.multiply = function (matrix) { + var t = this.temp; + var v = this.values; + var m = matrix.values; + t[webgl.M00] = v[webgl.M00] * m[webgl.M00] + v[webgl.M01] * m[webgl.M10] + v[webgl.M02] * m[webgl.M20] + v[webgl.M03] * m[webgl.M30]; + t[webgl.M01] = v[webgl.M00] * m[webgl.M01] + v[webgl.M01] * m[webgl.M11] + v[webgl.M02] * m[webgl.M21] + v[webgl.M03] * m[webgl.M31]; + t[webgl.M02] = v[webgl.M00] * m[webgl.M02] + v[webgl.M01] * m[webgl.M12] + v[webgl.M02] * m[webgl.M22] + v[webgl.M03] * m[webgl.M32]; + t[webgl.M03] = v[webgl.M00] * m[webgl.M03] + v[webgl.M01] * m[webgl.M13] + v[webgl.M02] * m[webgl.M23] + v[webgl.M03] * m[webgl.M33]; + t[webgl.M10] = v[webgl.M10] * m[webgl.M00] + v[webgl.M11] * m[webgl.M10] + v[webgl.M12] * m[webgl.M20] + v[webgl.M13] * m[webgl.M30]; + t[webgl.M11] = v[webgl.M10] * m[webgl.M01] + v[webgl.M11] * m[webgl.M11] + v[webgl.M12] * m[webgl.M21] + v[webgl.M13] * m[webgl.M31]; + t[webgl.M12] = v[webgl.M10] * m[webgl.M02] + v[webgl.M11] * m[webgl.M12] + v[webgl.M12] * m[webgl.M22] + v[webgl.M13] * m[webgl.M32]; + t[webgl.M13] = v[webgl.M10] * m[webgl.M03] + v[webgl.M11] * m[webgl.M13] + v[webgl.M12] * m[webgl.M23] + v[webgl.M13] * m[webgl.M33]; + t[webgl.M20] = v[webgl.M20] * m[webgl.M00] + v[webgl.M21] * m[webgl.M10] + v[webgl.M22] * m[webgl.M20] + v[webgl.M23] * m[webgl.M30]; + t[webgl.M21] = v[webgl.M20] * m[webgl.M01] + v[webgl.M21] * m[webgl.M11] + v[webgl.M22] * m[webgl.M21] + v[webgl.M23] * m[webgl.M31]; + t[webgl.M22] = v[webgl.M20] * m[webgl.M02] + v[webgl.M21] * m[webgl.M12] + v[webgl.M22] * m[webgl.M22] + v[webgl.M23] * m[webgl.M32]; + t[webgl.M23] = v[webgl.M20] * m[webgl.M03] + v[webgl.M21] * m[webgl.M13] + v[webgl.M22] * m[webgl.M23] + v[webgl.M23] * m[webgl.M33]; + t[webgl.M30] = v[webgl.M30] * m[webgl.M00] + v[webgl.M31] * m[webgl.M10] + v[webgl.M32] * m[webgl.M20] + v[webgl.M33] * m[webgl.M30]; + t[webgl.M31] = v[webgl.M30] * m[webgl.M01] + v[webgl.M31] * m[webgl.M11] + v[webgl.M32] * m[webgl.M21] + v[webgl.M33] * m[webgl.M31]; + t[webgl.M32] = v[webgl.M30] * m[webgl.M02] + v[webgl.M31] * m[webgl.M12] + v[webgl.M32] * m[webgl.M22] + v[webgl.M33] * m[webgl.M32]; + t[webgl.M33] = v[webgl.M30] * m[webgl.M03] + v[webgl.M31] * m[webgl.M13] + v[webgl.M32] * m[webgl.M23] + v[webgl.M33] * m[webgl.M33]; + return this.set(this.temp); + }; + Matrix4.prototype.multiplyLeft = function (matrix) { + var t = this.temp; + var v = this.values; + var m = matrix.values; + t[webgl.M00] = m[webgl.M00] * v[webgl.M00] + m[webgl.M01] * v[webgl.M10] + m[webgl.M02] * v[webgl.M20] + m[webgl.M03] * v[webgl.M30]; + t[webgl.M01] = m[webgl.M00] * v[webgl.M01] + m[webgl.M01] * v[webgl.M11] + m[webgl.M02] * v[webgl.M21] + m[webgl.M03] * v[webgl.M31]; + t[webgl.M02] = m[webgl.M00] * v[webgl.M02] + m[webgl.M01] * v[webgl.M12] + m[webgl.M02] * v[webgl.M22] + m[webgl.M03] * v[webgl.M32]; + t[webgl.M03] = m[webgl.M00] * v[webgl.M03] + m[webgl.M01] * v[webgl.M13] + m[webgl.M02] * v[webgl.M23] + m[webgl.M03] * v[webgl.M33]; + t[webgl.M10] = m[webgl.M10] * v[webgl.M00] + m[webgl.M11] * v[webgl.M10] + m[webgl.M12] * v[webgl.M20] + m[webgl.M13] * v[webgl.M30]; + t[webgl.M11] = m[webgl.M10] * v[webgl.M01] + m[webgl.M11] * v[webgl.M11] + m[webgl.M12] * v[webgl.M21] + m[webgl.M13] * v[webgl.M31]; + t[webgl.M12] = m[webgl.M10] * v[webgl.M02] + m[webgl.M11] * v[webgl.M12] + m[webgl.M12] * v[webgl.M22] + m[webgl.M13] * v[webgl.M32]; + t[webgl.M13] = m[webgl.M10] * v[webgl.M03] + m[webgl.M11] * v[webgl.M13] + m[webgl.M12] * v[webgl.M23] + m[webgl.M13] * v[webgl.M33]; + t[webgl.M20] = m[webgl.M20] * v[webgl.M00] + m[webgl.M21] * v[webgl.M10] + m[webgl.M22] * v[webgl.M20] + m[webgl.M23] * v[webgl.M30]; + t[webgl.M21] = m[webgl.M20] * v[webgl.M01] + m[webgl.M21] * v[webgl.M11] + m[webgl.M22] * v[webgl.M21] + m[webgl.M23] * v[webgl.M31]; + t[webgl.M22] = m[webgl.M20] * v[webgl.M02] + m[webgl.M21] * v[webgl.M12] + m[webgl.M22] * v[webgl.M22] + m[webgl.M23] * v[webgl.M32]; + t[webgl.M23] = m[webgl.M20] * v[webgl.M03] + m[webgl.M21] * v[webgl.M13] + m[webgl.M22] * v[webgl.M23] + m[webgl.M23] * v[webgl.M33]; + t[webgl.M30] = m[webgl.M30] * v[webgl.M00] + m[webgl.M31] * v[webgl.M10] + m[webgl.M32] * v[webgl.M20] + m[webgl.M33] * v[webgl.M30]; + t[webgl.M31] = m[webgl.M30] * v[webgl.M01] + m[webgl.M31] * v[webgl.M11] + m[webgl.M32] * v[webgl.M21] + m[webgl.M33] * v[webgl.M31]; + t[webgl.M32] = m[webgl.M30] * v[webgl.M02] + m[webgl.M31] * v[webgl.M12] + m[webgl.M32] * v[webgl.M22] + m[webgl.M33] * v[webgl.M32]; + t[webgl.M33] = m[webgl.M30] * v[webgl.M03] + m[webgl.M31] * v[webgl.M13] + m[webgl.M32] * v[webgl.M23] + m[webgl.M33] * v[webgl.M33]; + return this.set(this.temp); + }; + Matrix4.prototype.lookAt = function (position, direction, up) { + Matrix4.initTemps(); + var xAxis = Matrix4.xAxis, yAxis = Matrix4.yAxis, zAxis = Matrix4.zAxis; + zAxis.setFrom(direction).normalize(); + xAxis.setFrom(direction).normalize(); + xAxis.cross(up).normalize(); + yAxis.setFrom(xAxis).cross(zAxis).normalize(); + this.identity(); + var val = this.values; + val[webgl.M00] = xAxis.x; + val[webgl.M01] = xAxis.y; + val[webgl.M02] = xAxis.z; + val[webgl.M10] = yAxis.x; + val[webgl.M11] = yAxis.y; + val[webgl.M12] = yAxis.z; + val[webgl.M20] = -zAxis.x; + val[webgl.M21] = -zAxis.y; + val[webgl.M22] = -zAxis.z; + Matrix4.tmpMatrix.identity(); + Matrix4.tmpMatrix.values[webgl.M03] = -position.x; + Matrix4.tmpMatrix.values[webgl.M13] = -position.y; + Matrix4.tmpMatrix.values[webgl.M23] = -position.z; + this.multiply(Matrix4.tmpMatrix); + return this; + }; + Matrix4.initTemps = function () { + if (Matrix4.xAxis === null) + Matrix4.xAxis = new webgl.Vector3(); + if (Matrix4.yAxis === null) + Matrix4.yAxis = new webgl.Vector3(); + if (Matrix4.zAxis === null) + Matrix4.zAxis = new webgl.Vector3(); + }; + Matrix4.xAxis = null; + Matrix4.yAxis = null; + Matrix4.zAxis = null; + Matrix4.tmpMatrix = new Matrix4(); + return Matrix4; + }()); + webgl.Matrix4 = Matrix4; + })(webgl = spine.webgl || (spine.webgl = {})); +})(spine || (spine = {})); +var spine; +(function (spine) { + var webgl; + (function (webgl) { + var Mesh = (function () { + function Mesh(context, attributes, maxVertices, maxIndices) { + this.attributes = attributes; + this.verticesLength = 0; + this.dirtyVertices = false; + this.indicesLength = 0; + this.dirtyIndices = false; + this.elementsPerVertex = 0; + this.context = context instanceof webgl.ManagedWebGLRenderingContext ? context : new webgl.ManagedWebGLRenderingContext(context); + this.elementsPerVertex = 0; + for (var i = 0; i < attributes.length; i++) { + this.elementsPerVertex += attributes[i].numElements; + } + this.vertices = new Float32Array(maxVertices * this.elementsPerVertex); + this.indices = new Uint16Array(maxIndices); + this.context.addRestorable(this); + } + Mesh.prototype.getAttributes = function () { return this.attributes; }; + Mesh.prototype.maxVertices = function () { return this.vertices.length / this.elementsPerVertex; }; + Mesh.prototype.numVertices = function () { return this.verticesLength / this.elementsPerVertex; }; + Mesh.prototype.setVerticesLength = function (length) { + this.dirtyVertices = true; + this.verticesLength = length; + }; + Mesh.prototype.getVertices = function () { return this.vertices; }; + Mesh.prototype.maxIndices = function () { return this.indices.length; }; + Mesh.prototype.numIndices = function () { return this.indicesLength; }; + Mesh.prototype.setIndicesLength = function (length) { + this.dirtyIndices = true; + this.indicesLength = length; + }; + Mesh.prototype.getIndices = function () { return this.indices; }; + ; + Mesh.prototype.getVertexSizeInFloats = function () { + var size = 0; + for (var i = 0; i < this.attributes.length; i++) { + var attribute = this.attributes[i]; + size += attribute.numElements; + } + return size; + }; + Mesh.prototype.setVertices = function (vertices) { + this.dirtyVertices = true; + if (vertices.length > this.vertices.length) + throw Error("Mesh can't store more than " + this.maxVertices() + " vertices"); + this.vertices.set(vertices, 0); + this.verticesLength = vertices.length; + }; + Mesh.prototype.setIndices = function (indices) { + this.dirtyIndices = true; + if (indices.length > this.indices.length) + throw Error("Mesh can't store more than " + this.maxIndices() + " indices"); + this.indices.set(indices, 0); + this.indicesLength = indices.length; + }; + Mesh.prototype.draw = function (shader, primitiveType) { + this.drawWithOffset(shader, primitiveType, 0, this.indicesLength > 0 ? this.indicesLength : this.verticesLength / this.elementsPerVertex); + }; + Mesh.prototype.drawWithOffset = function (shader, primitiveType, offset, count) { + var gl = this.context.gl; + if (this.dirtyVertices || this.dirtyIndices) + this.update(); + this.bind(shader); + if (this.indicesLength > 0) { + gl.drawElements(primitiveType, count, gl.UNSIGNED_SHORT, offset * 2); + } + else { + gl.drawArrays(primitiveType, offset, count); + } + this.unbind(shader); + }; + Mesh.prototype.bind = function (shader) { + var gl = this.context.gl; + gl.bindBuffer(gl.ARRAY_BUFFER, this.verticesBuffer); + var offset = 0; + for (var i = 0; i < this.attributes.length; i++) { + var attrib = this.attributes[i]; + var location_1 = shader.getAttributeLocation(attrib.name); + gl.enableVertexAttribArray(location_1); + gl.vertexAttribPointer(location_1, attrib.numElements, gl.FLOAT, false, this.elementsPerVertex * 4, offset * 4); + offset += attrib.numElements; + } + if (this.indicesLength > 0) + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indicesBuffer); + }; + Mesh.prototype.unbind = function (shader) { + var gl = this.context.gl; + for (var i = 0; i < this.attributes.length; i++) { + var attrib = this.attributes[i]; + var location_2 = shader.getAttributeLocation(attrib.name); + gl.disableVertexAttribArray(location_2); + } + gl.bindBuffer(gl.ARRAY_BUFFER, null); + if (this.indicesLength > 0) + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null); + }; + Mesh.prototype.update = function () { + var gl = this.context.gl; + if (this.dirtyVertices) { + if (!this.verticesBuffer) { + this.verticesBuffer = gl.createBuffer(); + } + gl.bindBuffer(gl.ARRAY_BUFFER, this.verticesBuffer); + gl.bufferData(gl.ARRAY_BUFFER, this.vertices.subarray(0, this.verticesLength), gl.DYNAMIC_DRAW); + this.dirtyVertices = false; + } + if (this.dirtyIndices) { + if (!this.indicesBuffer) { + this.indicesBuffer = gl.createBuffer(); + } + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indicesBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.indices.subarray(0, this.indicesLength), gl.DYNAMIC_DRAW); + this.dirtyIndices = false; + } + }; + Mesh.prototype.restore = function () { + this.verticesBuffer = null; + this.indicesBuffer = null; + this.update(); + }; + Mesh.prototype.dispose = function () { + this.context.removeRestorable(this); + var gl = this.context.gl; + gl.deleteBuffer(this.verticesBuffer); + gl.deleteBuffer(this.indicesBuffer); + }; + return Mesh; + }()); + webgl.Mesh = Mesh; + var VertexAttribute = (function () { + function VertexAttribute(name, type, numElements) { + this.name = name; + this.type = type; + this.numElements = numElements; + } + return VertexAttribute; + }()); + webgl.VertexAttribute = VertexAttribute; + var Position2Attribute = (function (_super) { + __extends(Position2Attribute, _super); + function Position2Attribute() { + return _super.call(this, webgl.Shader.POSITION, VertexAttributeType.Float, 2) || this; + } + return Position2Attribute; + }(VertexAttribute)); + webgl.Position2Attribute = Position2Attribute; + var Position3Attribute = (function (_super) { + __extends(Position3Attribute, _super); + function Position3Attribute() { + return _super.call(this, webgl.Shader.POSITION, VertexAttributeType.Float, 3) || this; + } + return Position3Attribute; + }(VertexAttribute)); + webgl.Position3Attribute = Position3Attribute; + var TexCoordAttribute = (function (_super) { + __extends(TexCoordAttribute, _super); + function TexCoordAttribute(unit) { + if (unit === void 0) { unit = 0; } + return _super.call(this, webgl.Shader.TEXCOORDS + (unit == 0 ? "" : unit), VertexAttributeType.Float, 2) || this; + } + return TexCoordAttribute; + }(VertexAttribute)); + webgl.TexCoordAttribute = TexCoordAttribute; + var ColorAttribute = (function (_super) { + __extends(ColorAttribute, _super); + function ColorAttribute() { + return _super.call(this, webgl.Shader.COLOR, VertexAttributeType.Float, 4) || this; + } + return ColorAttribute; + }(VertexAttribute)); + webgl.ColorAttribute = ColorAttribute; + var Color2Attribute = (function (_super) { + __extends(Color2Attribute, _super); + function Color2Attribute() { + return _super.call(this, webgl.Shader.COLOR2, VertexAttributeType.Float, 4) || this; + } + return Color2Attribute; + }(VertexAttribute)); + webgl.Color2Attribute = Color2Attribute; + var VertexAttributeType; + (function (VertexAttributeType) { + VertexAttributeType[VertexAttributeType["Float"] = 0] = "Float"; + })(VertexAttributeType = webgl.VertexAttributeType || (webgl.VertexAttributeType = {})); + })(webgl = spine.webgl || (spine.webgl = {})); +})(spine || (spine = {})); +var spine; +(function (spine) { + var webgl; + (function (webgl) { + var PolygonBatcher = (function () { + function PolygonBatcher(context, twoColorTint, maxVertices) { + if (twoColorTint === void 0) { twoColorTint = true; } + if (maxVertices === void 0) { maxVertices = 10920; } + this.isDrawing = false; + this.shader = null; + this.lastTexture = null; + this.verticesLength = 0; + this.indicesLength = 0; + if (maxVertices > 10920) + throw new Error("Can't have more than 10920 triangles per batch: " + maxVertices); + this.context = context instanceof webgl.ManagedWebGLRenderingContext ? context : new webgl.ManagedWebGLRenderingContext(context); + var attributes = twoColorTint ? + [new webgl.Position2Attribute(), new webgl.ColorAttribute(), new webgl.TexCoordAttribute(), new webgl.Color2Attribute()] : + [new webgl.Position2Attribute(), new webgl.ColorAttribute(), new webgl.TexCoordAttribute()]; + this.mesh = new webgl.Mesh(context, attributes, maxVertices, maxVertices * 3); + this.srcBlend = this.context.gl.SRC_ALPHA; + this.dstBlend = this.context.gl.ONE_MINUS_SRC_ALPHA; + } + PolygonBatcher.prototype.begin = function (shader) { + var gl = this.context.gl; + if (this.isDrawing) + throw new Error("PolygonBatch is already drawing. Call PolygonBatch.end() before calling PolygonBatch.begin()"); + this.drawCalls = 0; + this.shader = shader; + this.lastTexture = null; + this.isDrawing = true; + gl.enable(gl.BLEND); + gl.blendFunc(this.srcBlend, this.dstBlend); + }; + PolygonBatcher.prototype.setBlendMode = function (srcBlend, dstBlend) { + var gl = this.context.gl; + this.srcBlend = srcBlend; + this.dstBlend = dstBlend; + if (this.isDrawing) { + this.flush(); + gl.blendFunc(this.srcBlend, this.dstBlend); + } + }; + PolygonBatcher.prototype.draw = function (texture, vertices, indices) { + if (texture != this.lastTexture) { + this.flush(); + this.lastTexture = texture; + } + else if (this.verticesLength + vertices.length > this.mesh.getVertices().length || + this.indicesLength + indices.length > this.mesh.getIndices().length) { + this.flush(); + } + var indexStart = this.mesh.numVertices(); + this.mesh.getVertices().set(vertices, this.verticesLength); + this.verticesLength += vertices.length; + this.mesh.setVerticesLength(this.verticesLength); + var indicesArray = this.mesh.getIndices(); + for (var i = this.indicesLength, j = 0; j < indices.length; i++, j++) + indicesArray[i] = indices[j] + indexStart; + this.indicesLength += indices.length; + this.mesh.setIndicesLength(this.indicesLength); + }; + PolygonBatcher.prototype.flush = function () { + var gl = this.context.gl; + if (this.verticesLength == 0) + return; + this.lastTexture.bind(); + this.mesh.draw(this.shader, gl.TRIANGLES); + this.verticesLength = 0; + this.indicesLength = 0; + this.mesh.setVerticesLength(0); + this.mesh.setIndicesLength(0); + this.drawCalls++; + }; + PolygonBatcher.prototype.end = function () { + var gl = this.context.gl; + if (!this.isDrawing) + throw new Error("PolygonBatch is not drawing. Call PolygonBatch.begin() before calling PolygonBatch.end()"); + if (this.verticesLength > 0 || this.indicesLength > 0) + this.flush(); + this.shader = null; + this.lastTexture = null; + this.isDrawing = false; + gl.disable(gl.BLEND); + }; + PolygonBatcher.prototype.getDrawCalls = function () { return this.drawCalls; }; + PolygonBatcher.prototype.dispose = function () { + this.mesh.dispose(); + }; + return PolygonBatcher; + }()); + webgl.PolygonBatcher = PolygonBatcher; + })(webgl = spine.webgl || (spine.webgl = {})); +})(spine || (spine = {})); +var spine; +(function (spine) { + var webgl; + (function (webgl) { + var SceneRenderer = (function () { + function SceneRenderer(canvas, context, twoColorTint) { + if (twoColorTint === void 0) { twoColorTint = true; } + this.twoColorTint = false; + this.activeRenderer = null; + this.QUAD = [ + 0, 0, 1, 1, 1, 1, 0, 0, + 0, 0, 1, 1, 1, 1, 0, 0, + 0, 0, 1, 1, 1, 1, 0, 0, + 0, 0, 1, 1, 1, 1, 0, 0, + ]; + this.QUAD_TRIANGLES = [0, 1, 2, 2, 3, 0]; + this.WHITE = new spine.Color(1, 1, 1, 1); + this.canvas = canvas; + this.context = context instanceof webgl.ManagedWebGLRenderingContext ? context : new webgl.ManagedWebGLRenderingContext(context); + this.twoColorTint = twoColorTint; + this.camera = new webgl.OrthoCamera(canvas.width, canvas.height); + this.batcherShader = twoColorTint ? webgl.Shader.newTwoColoredTextured(this.context) : webgl.Shader.newColoredTextured(this.context); + this.batcher = new webgl.PolygonBatcher(this.context, twoColorTint); + this.shapesShader = webgl.Shader.newColored(this.context); + this.shapes = new webgl.ShapeRenderer(this.context); + this.skeletonRenderer = new webgl.SkeletonRenderer(this.context, twoColorTint); + this.skeletonDebugRenderer = new webgl.SkeletonDebugRenderer(this.context); + } + SceneRenderer.prototype.begin = function () { + this.camera.update(); + this.enableRenderer(this.batcher); + }; + SceneRenderer.prototype.drawSkeleton = function (skeleton, premultipliedAlpha, slotRangeStart, slotRangeEnd) { + if (premultipliedAlpha === void 0) { premultipliedAlpha = false; } + if (slotRangeStart === void 0) { slotRangeStart = -1; } + if (slotRangeEnd === void 0) { slotRangeEnd = -1; } + this.enableRenderer(this.batcher); + this.skeletonRenderer.premultipliedAlpha = premultipliedAlpha; + this.skeletonRenderer.draw(this.batcher, skeleton, slotRangeStart, slotRangeEnd, {}); + }; + SceneRenderer.prototype.drawSkeletonDebug = function (skeleton, premultipliedAlpha, ignoredBones) { + if (premultipliedAlpha === void 0) { premultipliedAlpha = false; } + if (ignoredBones === void 0) { ignoredBones = null; } + this.enableRenderer(this.shapes); + this.skeletonDebugRenderer.premultipliedAlpha = premultipliedAlpha; + this.skeletonDebugRenderer.draw(this.shapes, skeleton, ignoredBones); + }; + SceneRenderer.prototype.drawTexture = function (texture, x, y, width, height, color) { + if (color === void 0) { color = null; } + this.enableRenderer(this.batcher); + if (color === null) + color = this.WHITE; + var quad = this.QUAD; + var i = 0; + quad[i++] = x; + quad[i++] = y; + quad[i++] = color.r; + quad[i++] = color.g; + quad[i++] = color.b; + quad[i++] = color.a; + quad[i++] = 0; + quad[i++] = 1; + if (this.twoColorTint) { + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + } + quad[i++] = x + width; + quad[i++] = y; + quad[i++] = color.r; + quad[i++] = color.g; + quad[i++] = color.b; + quad[i++] = color.a; + quad[i++] = 1; + quad[i++] = 1; + if (this.twoColorTint) { + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + } + quad[i++] = x + width; + quad[i++] = y + height; + quad[i++] = color.r; + quad[i++] = color.g; + quad[i++] = color.b; + quad[i++] = color.a; + quad[i++] = 1; + quad[i++] = 0; + if (this.twoColorTint) { + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + } + quad[i++] = x; + quad[i++] = y + height; + quad[i++] = color.r; + quad[i++] = color.g; + quad[i++] = color.b; + quad[i++] = color.a; + quad[i++] = 0; + quad[i++] = 0; + if (this.twoColorTint) { + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + } + this.batcher.draw(texture, quad, this.QUAD_TRIANGLES); + }; + SceneRenderer.prototype.drawTextureUV = function (texture, x, y, width, height, u, v, u2, v2, color) { + if (color === void 0) { color = null; } + this.enableRenderer(this.batcher); + if (color === null) + color = this.WHITE; + var quad = this.QUAD; + var i = 0; + quad[i++] = x; + quad[i++] = y; + quad[i++] = color.r; + quad[i++] = color.g; + quad[i++] = color.b; + quad[i++] = color.a; + quad[i++] = u; + quad[i++] = v; + if (this.twoColorTint) { + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + } + quad[i++] = x + width; + quad[i++] = y; + quad[i++] = color.r; + quad[i++] = color.g; + quad[i++] = color.b; + quad[i++] = color.a; + quad[i++] = u2; + quad[i++] = v; + if (this.twoColorTint) { + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + } + quad[i++] = x + width; + quad[i++] = y + height; + quad[i++] = color.r; + quad[i++] = color.g; + quad[i++] = color.b; + quad[i++] = color.a; + quad[i++] = u2; + quad[i++] = v2; + if (this.twoColorTint) { + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + } + quad[i++] = x; + quad[i++] = y + height; + quad[i++] = color.r; + quad[i++] = color.g; + quad[i++] = color.b; + quad[i++] = color.a; + quad[i++] = u; + quad[i++] = v2; + if (this.twoColorTint) { + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + } + this.batcher.draw(texture, quad, this.QUAD_TRIANGLES); + }; + SceneRenderer.prototype.drawTextureRotated = function (texture, x, y, width, height, pivotX, pivotY, angle, color, premultipliedAlpha) { + if (color === void 0) { color = null; } + if (premultipliedAlpha === void 0) { premultipliedAlpha = false; } + this.enableRenderer(this.batcher); + if (color === null) + color = this.WHITE; + var quad = this.QUAD; + var worldOriginX = x + pivotX; + var worldOriginY = y + pivotY; + var fx = -pivotX; + var fy = -pivotY; + var fx2 = width - pivotX; + var fy2 = height - pivotY; + var p1x = fx; + var p1y = fy; + var p2x = fx; + var p2y = fy2; + var p3x = fx2; + var p3y = fy2; + var p4x = fx2; + var p4y = fy; + var x1 = 0; + var y1 = 0; + var x2 = 0; + var y2 = 0; + var x3 = 0; + var y3 = 0; + var x4 = 0; + var y4 = 0; + if (angle != 0) { + var cos = spine.MathUtils.cosDeg(angle); + var sin = spine.MathUtils.sinDeg(angle); + x1 = cos * p1x - sin * p1y; + y1 = sin * p1x + cos * p1y; + x4 = cos * p2x - sin * p2y; + y4 = sin * p2x + cos * p2y; + x3 = cos * p3x - sin * p3y; + y3 = sin * p3x + cos * p3y; + x2 = x3 + (x1 - x4); + y2 = y3 + (y1 - y4); + } + else { + x1 = p1x; + y1 = p1y; + x4 = p2x; + y4 = p2y; + x3 = p3x; + y3 = p3y; + x2 = p4x; + y2 = p4y; + } + x1 += worldOriginX; + y1 += worldOriginY; + x2 += worldOriginX; + y2 += worldOriginY; + x3 += worldOriginX; + y3 += worldOriginY; + x4 += worldOriginX; + y4 += worldOriginY; + var i = 0; + quad[i++] = x1; + quad[i++] = y1; + quad[i++] = color.r; + quad[i++] = color.g; + quad[i++] = color.b; + quad[i++] = color.a; + quad[i++] = 0; + quad[i++] = 1; + if (this.twoColorTint) { + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + } + quad[i++] = x2; + quad[i++] = y2; + quad[i++] = color.r; + quad[i++] = color.g; + quad[i++] = color.b; + quad[i++] = color.a; + quad[i++] = 1; + quad[i++] = 1; + if (this.twoColorTint) { + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + } + quad[i++] = x3; + quad[i++] = y3; + quad[i++] = color.r; + quad[i++] = color.g; + quad[i++] = color.b; + quad[i++] = color.a; + quad[i++] = 1; + quad[i++] = 0; + if (this.twoColorTint) { + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + } + quad[i++] = x4; + quad[i++] = y4; + quad[i++] = color.r; + quad[i++] = color.g; + quad[i++] = color.b; + quad[i++] = color.a; + quad[i++] = 0; + quad[i++] = 0; + if (this.twoColorTint) { + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + } + this.batcher.draw(texture, quad, this.QUAD_TRIANGLES); + }; + SceneRenderer.prototype.drawRegion = function (region, x, y, width, height, color, premultipliedAlpha) { + if (color === void 0) { color = null; } + if (premultipliedAlpha === void 0) { premultipliedAlpha = false; } + this.enableRenderer(this.batcher); + if (color === null) + color = this.WHITE; + var quad = this.QUAD; + var i = 0; + quad[i++] = x; + quad[i++] = y; + quad[i++] = color.r; + quad[i++] = color.g; + quad[i++] = color.b; + quad[i++] = color.a; + quad[i++] = region.u; + quad[i++] = region.v2; + if (this.twoColorTint) { + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + } + quad[i++] = x + width; + quad[i++] = y; + quad[i++] = color.r; + quad[i++] = color.g; + quad[i++] = color.b; + quad[i++] = color.a; + quad[i++] = region.u2; + quad[i++] = region.v2; + if (this.twoColorTint) { + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + } + quad[i++] = x + width; + quad[i++] = y + height; + quad[i++] = color.r; + quad[i++] = color.g; + quad[i++] = color.b; + quad[i++] = color.a; + quad[i++] = region.u2; + quad[i++] = region.v; + if (this.twoColorTint) { + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + } + quad[i++] = x; + quad[i++] = y + height; + quad[i++] = color.r; + quad[i++] = color.g; + quad[i++] = color.b; + quad[i++] = color.a; + quad[i++] = region.u; + quad[i++] = region.v; + if (this.twoColorTint) { + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + } + this.batcher.draw(region.texture, quad, this.QUAD_TRIANGLES); + }; + SceneRenderer.prototype.line = function (x, y, x2, y2, color, color2) { + if (color === void 0) { color = null; } + if (color2 === void 0) { color2 = null; } + this.enableRenderer(this.shapes); + this.shapes.line(x, y, x2, y2, color); + }; + SceneRenderer.prototype.triangle = function (filled, x, y, x2, y2, x3, y3, color, color2, color3) { + if (color === void 0) { color = null; } + if (color2 === void 0) { color2 = null; } + if (color3 === void 0) { color3 = null; } + this.enableRenderer(this.shapes); + this.shapes.triangle(filled, x, y, x2, y2, x3, y3, color, color2, color3); + }; + SceneRenderer.prototype.quad = function (filled, x, y, x2, y2, x3, y3, x4, y4, color, color2, color3, color4) { + if (color === void 0) { color = null; } + if (color2 === void 0) { color2 = null; } + if (color3 === void 0) { color3 = null; } + if (color4 === void 0) { color4 = null; } + this.enableRenderer(this.shapes); + this.shapes.quad(filled, x, y, x2, y2, x3, y3, x4, y4, color, color2, color3, color4); + }; + SceneRenderer.prototype.rect = function (filled, x, y, width, height, color) { + if (color === void 0) { color = null; } + this.enableRenderer(this.shapes); + this.shapes.rect(filled, x, y, width, height, color); + }; + SceneRenderer.prototype.rectLine = function (filled, x1, y1, x2, y2, width, color) { + if (color === void 0) { color = null; } + this.enableRenderer(this.shapes); + this.shapes.rectLine(filled, x1, y1, x2, y2, width, color); + }; + SceneRenderer.prototype.polygon = function (polygonVertices, offset, count, color) { + if (color === void 0) { color = null; } + this.enableRenderer(this.shapes); + this.shapes.polygon(polygonVertices, offset, count, color); + }; + SceneRenderer.prototype.circle = function (filled, x, y, radius, color, segments) { + if (color === void 0) { color = null; } + if (segments === void 0) { segments = 0; } + this.enableRenderer(this.shapes); + this.shapes.circle(filled, x, y, radius, color, segments); + }; + SceneRenderer.prototype.curve = function (x1, y1, cx1, cy1, cx2, cy2, x2, y2, segments, color) { + if (color === void 0) { color = null; } + this.enableRenderer(this.shapes); + this.shapes.curve(x1, y1, cx1, cy1, cx2, cy2, x2, y2, segments, color); + }; + SceneRenderer.prototype.end = function () { + if (this.activeRenderer === this.batcher) + this.batcher.end(); + else if (this.activeRenderer === this.shapes) + this.shapes.end(); + this.activeRenderer = null; + }; + SceneRenderer.prototype.resize = function (resizeMode) { + var canvas = this.canvas; + var w = canvas.clientWidth; + var h = canvas.clientHeight; + if (canvas.width != w || canvas.height != h) { + canvas.width = w; + canvas.height = h; + } + this.context.gl.viewport(0, 0, canvas.width, canvas.height); + if (resizeMode === ResizeMode.Stretch) { + } + else if (resizeMode === ResizeMode.Expand) { + this.camera.setViewport(w, h); + } + else if (resizeMode === ResizeMode.Fit) { + var sourceWidth = canvas.width, sourceHeight = canvas.height; + var targetWidth = this.camera.viewportWidth, targetHeight = this.camera.viewportHeight; + var targetRatio = targetHeight / targetWidth; + var sourceRatio = sourceHeight / sourceWidth; + var scale = targetRatio < sourceRatio ? targetWidth / sourceWidth : targetHeight / sourceHeight; + this.camera.viewportWidth = sourceWidth * scale; + this.camera.viewportHeight = sourceHeight * scale; + } + this.camera.update(); + }; + SceneRenderer.prototype.enableRenderer = function (renderer) { + if (this.activeRenderer === renderer) + return; + this.end(); + if (renderer instanceof webgl.PolygonBatcher) { + this.batcherShader.bind(); + this.batcherShader.setUniform4x4f(webgl.Shader.MVP_MATRIX, this.camera.projectionView.values); + this.batcherShader.setUniformi("u_texture", 0); + this.batcher.begin(this.batcherShader); + this.activeRenderer = this.batcher; + } + else if (renderer instanceof webgl.ShapeRenderer) { + this.shapesShader.bind(); + this.shapesShader.setUniform4x4f(webgl.Shader.MVP_MATRIX, this.camera.projectionView.values); + this.shapes.begin(this.shapesShader); + this.activeRenderer = this.shapes; + } + else { + this.activeRenderer = this.skeletonDebugRenderer; + } + }; + SceneRenderer.prototype.dispose = function () { + this.batcher.dispose(); + this.batcherShader.dispose(); + this.shapes.dispose(); + this.shapesShader.dispose(); + this.skeletonDebugRenderer.dispose(); + }; + return SceneRenderer; + }()); + webgl.SceneRenderer = SceneRenderer; + var ResizeMode; + (function (ResizeMode) { + ResizeMode[ResizeMode["Stretch"] = 0] = "Stretch"; + ResizeMode[ResizeMode["Expand"] = 1] = "Expand"; + ResizeMode[ResizeMode["Fit"] = 2] = "Fit"; + })(ResizeMode = webgl.ResizeMode || (webgl.ResizeMode = {})); + })(webgl = spine.webgl || (spine.webgl = {})); +})(spine || (spine = {})); +var spine; +(function (spine) { + var webgl; + (function (webgl) { + var Shader = (function () { + function Shader(context, vertexShader, fragmentShader) { + this.vertexShader = vertexShader; + this.fragmentShader = fragmentShader; + this.vs = null; + this.fs = null; + this.program = null; + this.tmp2x2 = new Float32Array(2 * 2); + this.tmp3x3 = new Float32Array(3 * 3); + this.tmp4x4 = new Float32Array(4 * 4); + this.vsSource = vertexShader; + this.fsSource = fragmentShader; + this.context = context instanceof webgl.ManagedWebGLRenderingContext ? context : new webgl.ManagedWebGLRenderingContext(context); + this.context.addRestorable(this); + this.compile(); + } + Shader.prototype.getProgram = function () { return this.program; }; + Shader.prototype.getVertexShader = function () { return this.vertexShader; }; + Shader.prototype.getFragmentShader = function () { return this.fragmentShader; }; + Shader.prototype.getVertexShaderSource = function () { return this.vsSource; }; + Shader.prototype.getFragmentSource = function () { return this.fsSource; }; + Shader.prototype.compile = function () { + var gl = this.context.gl; + try { + this.vs = this.compileShader(gl.VERTEX_SHADER, this.vertexShader); + this.fs = this.compileShader(gl.FRAGMENT_SHADER, this.fragmentShader); + this.program = this.compileProgram(this.vs, this.fs); + } + catch (e) { + this.dispose(); + throw e; + } + }; + Shader.prototype.compileShader = function (type, source) { + var gl = this.context.gl; + var shader = gl.createShader(type); + gl.shaderSource(shader, source); + gl.compileShader(shader); + if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { + var error = "Couldn't compile shader: " + gl.getShaderInfoLog(shader); + gl.deleteShader(shader); + if (!gl.isContextLost()) + throw new Error(error); + } + return shader; + }; + Shader.prototype.compileProgram = function (vs, fs) { + var gl = this.context.gl; + var program = gl.createProgram(); + gl.attachShader(program, vs); + gl.attachShader(program, fs); + gl.linkProgram(program); + if (!gl.getProgramParameter(program, gl.LINK_STATUS)) { + var error = "Couldn't compile shader program: " + gl.getProgramInfoLog(program); + gl.deleteProgram(program); + if (!gl.isContextLost()) + throw new Error(error); + } + return program; + }; + Shader.prototype.restore = function () { + this.compile(); + }; + Shader.prototype.bind = function () { + this.context.gl.useProgram(this.program); + }; + Shader.prototype.unbind = function () { + this.context.gl.useProgram(null); + }; + Shader.prototype.setUniformi = function (uniform, value) { + this.context.gl.uniform1i(this.getUniformLocation(uniform), value); + }; + Shader.prototype.setUniformf = function (uniform, value) { + this.context.gl.uniform1f(this.getUniformLocation(uniform), value); + }; + Shader.prototype.setUniform2f = function (uniform, value, value2) { + this.context.gl.uniform2f(this.getUniformLocation(uniform), value, value2); + }; + Shader.prototype.setUniform3f = function (uniform, value, value2, value3) { + this.context.gl.uniform3f(this.getUniformLocation(uniform), value, value2, value3); + }; + Shader.prototype.setUniform4f = function (uniform, value, value2, value3, value4) { + this.context.gl.uniform4f(this.getUniformLocation(uniform), value, value2, value3, value4); + }; + Shader.prototype.setUniform2x2f = function (uniform, value) { + var gl = this.context.gl; + this.tmp2x2.set(value); + gl.uniformMatrix2fv(this.getUniformLocation(uniform), false, this.tmp2x2); + }; + Shader.prototype.setUniform3x3f = function (uniform, value) { + var gl = this.context.gl; + this.tmp3x3.set(value); + gl.uniformMatrix3fv(this.getUniformLocation(uniform), false, this.tmp3x3); + }; + Shader.prototype.setUniform4x4f = function (uniform, value) { + var gl = this.context.gl; + this.tmp4x4.set(value); + gl.uniformMatrix4fv(this.getUniformLocation(uniform), false, this.tmp4x4); + }; + Shader.prototype.getUniformLocation = function (uniform) { + var gl = this.context.gl; + var location = gl.getUniformLocation(this.program, uniform); + if (!location && !gl.isContextLost()) + throw new Error("Couldn't find location for uniform " + uniform); + return location; + }; + Shader.prototype.getAttributeLocation = function (attribute) { + var gl = this.context.gl; + var location = gl.getAttribLocation(this.program, attribute); + if (location == -1 && !gl.isContextLost()) + throw new Error("Couldn't find location for attribute " + attribute); + return location; + }; + Shader.prototype.dispose = function () { + this.context.removeRestorable(this); + var gl = this.context.gl; + if (this.vs) { + gl.deleteShader(this.vs); + this.vs = null; + } + if (this.fs) { + gl.deleteShader(this.fs); + this.fs = null; + } + if (this.program) { + gl.deleteProgram(this.program); + this.program = null; + } + }; + Shader.newColoredTextured = function (context) { + var vs = "\n\t\t\t\tattribute vec4 " + Shader.POSITION + ";\n\t\t\t\tattribute vec4 " + Shader.COLOR + ";\n\t\t\t\tattribute vec2 " + Shader.TEXCOORDS + ";\n\t\t\t\tuniform mat4 " + Shader.MVP_MATRIX + ";\n\t\t\t\tvarying vec4 v_color;\n\t\t\t\tvarying vec2 v_texCoords;\n\n\t\t\t\tvoid main () {\n\t\t\t\t\tv_color = " + Shader.COLOR + ";\n\t\t\t\t\tv_texCoords = " + Shader.TEXCOORDS + ";\n\t\t\t\t\tgl_Position = " + Shader.MVP_MATRIX + " * " + Shader.POSITION + ";\n\t\t\t\t}\n\t\t\t"; + var fs = "\n\t\t\t\t#ifdef GL_ES\n\t\t\t\t\t#define LOWP lowp\n\t\t\t\t\tprecision mediump float;\n\t\t\t\t#else\n\t\t\t\t\t#define LOWP\n\t\t\t\t#endif\n\t\t\t\tvarying LOWP vec4 v_color;\n\t\t\t\tvarying vec2 v_texCoords;\n\t\t\t\tuniform sampler2D u_texture;\n\n\t\t\t\tvoid main () {\n\t\t\t\t\tgl_FragColor = v_color * texture2D(u_texture, v_texCoords);\n\t\t\t\t}\n\t\t\t"; + return new Shader(context, vs, fs); + }; + Shader.newTwoColoredTextured = function (context) { + var vs = "\n\t\t\t\tattribute vec4 " + Shader.POSITION + ";\n\t\t\t\tattribute vec4 " + Shader.COLOR + ";\n\t\t\t\tattribute vec4 " + Shader.COLOR2 + ";\n\t\t\t\tattribute vec2 " + Shader.TEXCOORDS + ";\n\t\t\t\tuniform mat4 " + Shader.MVP_MATRIX + ";\n\t\t\t\tvarying vec4 v_light;\n\t\t\t\tvarying vec4 v_dark;\n\t\t\t\tvarying vec2 v_texCoords;\n\n\t\t\t\tvoid main () {\n\t\t\t\t\tv_light = " + Shader.COLOR + ";\n\t\t\t\t\tv_dark = " + Shader.COLOR2 + ";\n\t\t\t\t\tv_texCoords = " + Shader.TEXCOORDS + ";\n\t\t\t\t\tgl_Position = " + Shader.MVP_MATRIX + " * " + Shader.POSITION + ";\n\t\t\t\t}\n\t\t\t"; + var fs = "\n\t\t\t\t#ifdef GL_ES\n\t\t\t\t\t#define LOWP lowp\n\t\t\t\t\tprecision mediump float;\n\t\t\t\t#else\n\t\t\t\t\t#define LOWP\n\t\t\t\t#endif\n\t\t\t\tvarying LOWP vec4 v_light;\n\t\t\t\tvarying LOWP vec4 v_dark;\n\t\t\t\tvarying vec2 v_texCoords;\n\t\t\t\tuniform sampler2D u_texture;\n\t\t\t\tuniform sampler2D u_palette;\n\t\t\t\tuniform float paletteEnable;\n\n\t\t\t\tvoid main () {\n\t\t\t\t\tvec4 texColor = texture2D(u_texture, v_texCoords);\n\t\t\t\t\tif (v_light.a >= 0.0)\n\t\t\t\t\t{\n\t\t\t\t\t\tgl_FragColor.a = texColor.a * v_light.a;\n\t\t\t\t\t\tgl_FragColor.rgb = ((texColor.a - 1.0) * v_dark.a + 1.0 - texColor.rgb) * v_dark.rgb + texColor.rgb * v_light.rgb;\n\t\t\t\t\t} else\n\t\t\t\t\t{\n\t\t\t\t\t\t// float index = ((texColor.r * 31.0)+0.5)/32.0;\n\t\t\t\t\t\tmediump float index = texColor.r + v_light.g;\n\t\t\t\t\t\tmediump float paletteNumber = ((v_light.b * 63.0)+0.5)/64.0;\n\t\t\t\t\t\t// paletteColor\n\t\t\t\t\t\tgl_FragColor = texture2D(u_palette, vec2(index,paletteNumber))*texColor.a;\n\t\t\t\t\t\t// gl_FragColor = texture2D(u_palette, vec2(index,0));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t"; + return new Shader(context, vs, fs); + }; + Shader.newColored = function (context) { + var vs = "\n\t\t\t\tattribute vec4 " + Shader.POSITION + ";\n\t\t\t\tattribute vec4 " + Shader.COLOR + ";\n\t\t\t\tuniform mat4 " + Shader.MVP_MATRIX + ";\n\t\t\t\tvarying vec4 v_color;\n\n\t\t\t\tvoid main () {\n\t\t\t\t\tv_color = " + Shader.COLOR + ";\n\t\t\t\t\tgl_Position = " + Shader.MVP_MATRIX + " * " + Shader.POSITION + ";\n\t\t\t\t}\n\t\t\t"; + var fs = "\n\t\t\t\t#ifdef GL_ES\n\t\t\t\t\t#define LOWP lowp\n\t\t\t\t\tprecision mediump float;\n\t\t\t\t#else\n\t\t\t\t\t#define LOWP\n\t\t\t\t#endif\n\t\t\t\tvarying LOWP vec4 v_color;\n\n\t\t\t\tvoid main () {\n\t\t\t\t\tgl_FragColor = v_color;\n\t\t\t\t}\n\t\t\t"; + return new Shader(context, vs, fs); + }; + Shader.MVP_MATRIX = "u_projTrans"; + Shader.POSITION = "a_position"; + Shader.COLOR = "a_color"; + Shader.COLOR2 = "a_color2"; + Shader.TEXCOORDS = "a_texCoords"; + Shader.SAMPLER = "u_texture"; + return Shader; + }()); + webgl.Shader = Shader; + })(webgl = spine.webgl || (spine.webgl = {})); +})(spine || (spine = {})); +var spine; +(function (spine) { + var webgl; + (function (webgl) { + var ShapeRenderer = (function () { + function ShapeRenderer(context, maxVertices) { + if (maxVertices === void 0) { maxVertices = 10920; } + this.isDrawing = false; + this.shapeType = ShapeType.Filled; + this.color = new spine.Color(1, 1, 1, 1); + this.vertexIndex = 0; + this.tmp = new spine.Vector2(); + if (maxVertices > 10920) + throw new Error("Can't have more than 10920 triangles per batch: " + maxVertices); + this.context = context instanceof webgl.ManagedWebGLRenderingContext ? context : new webgl.ManagedWebGLRenderingContext(context); + this.mesh = new webgl.Mesh(context, [new webgl.Position2Attribute(), new webgl.ColorAttribute()], maxVertices, 0); + this.srcBlend = this.context.gl.SRC_ALPHA; + this.dstBlend = this.context.gl.ONE_MINUS_SRC_ALPHA; + } + ShapeRenderer.prototype.begin = function (shader) { + if (this.isDrawing) + throw new Error("ShapeRenderer.begin() has already been called"); + this.shader = shader; + this.vertexIndex = 0; + this.isDrawing = true; + var gl = this.context.gl; + gl.enable(gl.BLEND); + gl.blendFunc(this.srcBlend, this.dstBlend); + }; + ShapeRenderer.prototype.setBlendMode = function (srcBlend, dstBlend) { + var gl = this.context.gl; + this.srcBlend = srcBlend; + this.dstBlend = dstBlend; + if (this.isDrawing) { + this.flush(); + gl.blendFunc(this.srcBlend, this.dstBlend); + } + }; + ShapeRenderer.prototype.setColor = function (color) { + this.color.setFromColor(color); + }; + ShapeRenderer.prototype.setColorWith = function (r, g, b, a) { + this.color.set(r, g, b, a); + }; + ShapeRenderer.prototype.point = function (x, y, color) { + if (color === void 0) { color = null; } + this.check(ShapeType.Point, 1); + if (color === null) + color = this.color; + this.vertex(x, y, color); + }; + ShapeRenderer.prototype.line = function (x, y, x2, y2, color) { + if (color === void 0) { color = null; } + this.check(ShapeType.Line, 2); + var vertices = this.mesh.getVertices(); + var idx = this.vertexIndex; + if (color === null) + color = this.color; + this.vertex(x, y, color); + this.vertex(x2, y2, color); + }; + ShapeRenderer.prototype.triangle = function (filled, x, y, x2, y2, x3, y3, color, color2, color3) { + if (color === void 0) { color = null; } + if (color2 === void 0) { color2 = null; } + if (color3 === void 0) { color3 = null; } + this.check(filled ? ShapeType.Filled : ShapeType.Line, 3); + var vertices = this.mesh.getVertices(); + var idx = this.vertexIndex; + if (color === null) + color = this.color; + if (color2 === null) + color2 = this.color; + if (color3 === null) + color3 = this.color; + if (filled) { + this.vertex(x, y, color); + this.vertex(x2, y2, color2); + this.vertex(x3, y3, color3); + } + else { + this.vertex(x, y, color); + this.vertex(x2, y2, color2); + this.vertex(x2, y2, color); + this.vertex(x3, y3, color2); + this.vertex(x3, y3, color); + this.vertex(x, y, color2); + } + }; + ShapeRenderer.prototype.quad = function (filled, x, y, x2, y2, x3, y3, x4, y4, color, color2, color3, color4) { + if (color === void 0) { color = null; } + if (color2 === void 0) { color2 = null; } + if (color3 === void 0) { color3 = null; } + if (color4 === void 0) { color4 = null; } + this.check(filled ? ShapeType.Filled : ShapeType.Line, 3); + var vertices = this.mesh.getVertices(); + var idx = this.vertexIndex; + if (color === null) + color = this.color; + if (color2 === null) + color2 = this.color; + if (color3 === null) + color3 = this.color; + if (color4 === null) + color4 = this.color; + if (filled) { + this.vertex(x, y, color); + this.vertex(x2, y2, color2); + this.vertex(x3, y3, color3); + this.vertex(x3, y3, color3); + this.vertex(x4, y4, color4); + this.vertex(x, y, color); + } + else { + this.vertex(x, y, color); + this.vertex(x2, y2, color2); + this.vertex(x2, y2, color2); + this.vertex(x3, y3, color3); + this.vertex(x3, y3, color3); + this.vertex(x4, y4, color4); + this.vertex(x4, y4, color4); + this.vertex(x, y, color); + } + }; + ShapeRenderer.prototype.rect = function (filled, x, y, width, height, color) { + if (color === void 0) { color = null; } + this.quad(filled, x, y, x + width, y, x + width, y + height, x, y + height, color, color, color, color); + }; + ShapeRenderer.prototype.rectLine = function (filled, x1, y1, x2, y2, width, color) { + if (color === void 0) { color = null; } + this.check(filled ? ShapeType.Filled : ShapeType.Line, 8); + if (color === null) + color = this.color; + var t = this.tmp.set(y2 - y1, x1 - x2); + t.normalize(); + width *= 0.5; + var tx = t.x * width; + var ty = t.y * width; + if (!filled) { + this.vertex(x1 + tx, y1 + ty, color); + this.vertex(x1 - tx, y1 - ty, color); + this.vertex(x2 + tx, y2 + ty, color); + this.vertex(x2 - tx, y2 - ty, color); + this.vertex(x2 + tx, y2 + ty, color); + this.vertex(x1 + tx, y1 + ty, color); + this.vertex(x2 - tx, y2 - ty, color); + this.vertex(x1 - tx, y1 - ty, color); + } + else { + this.vertex(x1 + tx, y1 + ty, color); + this.vertex(x1 - tx, y1 - ty, color); + this.vertex(x2 + tx, y2 + ty, color); + this.vertex(x2 - tx, y2 - ty, color); + this.vertex(x2 + tx, y2 + ty, color); + this.vertex(x1 - tx, y1 - ty, color); + } + }; + ShapeRenderer.prototype.x = function (x, y, size) { + this.line(x - size, y - size, x + size, y + size); + this.line(x - size, y + size, x + size, y - size); + }; + ShapeRenderer.prototype.polygon = function (polygonVertices, offset, count, color) { + if (color === void 0) { color = null; } + if (count < 3) + throw new Error("Polygon must contain at least 3 vertices"); + this.check(ShapeType.Line, count * 2); + if (color === null) + color = this.color; + var vertices = this.mesh.getVertices(); + var idx = this.vertexIndex; + offset <<= 1; + count <<= 1; + var firstX = polygonVertices[offset]; + var firstY = polygonVertices[offset + 1]; + var last = offset + count; + for (var i = offset, n = offset + count - 2; i < n; i += 2) { + var x1 = polygonVertices[i]; + var y1 = polygonVertices[i + 1]; + var x2 = 0; + var y2 = 0; + if (i + 2 >= last) { + x2 = firstX; + y2 = firstY; + } + else { + x2 = polygonVertices[i + 2]; + y2 = polygonVertices[i + 3]; + } + this.vertex(x1, y1, color); + this.vertex(x2, y2, color); + } + }; + ShapeRenderer.prototype.circle = function (filled, x, y, radius, color, segments) { + if (color === void 0) { color = null; } + if (segments === void 0) { segments = 0; } + if (segments === 0) + segments = Math.max(1, (6 * spine.MathUtils.cbrt(radius)) | 0); + if (segments <= 0) + throw new Error("segments must be > 0."); + if (color === null) + color = this.color; + var angle = 2 * spine.MathUtils.PI / segments; + var cos = Math.cos(angle); + var sin = Math.sin(angle); + var cx = radius, cy = 0; + if (!filled) { + this.check(ShapeType.Line, segments * 2 + 2); + for (var i = 0; i < segments; i++) { + this.vertex(x + cx, y + cy, color); + var temp_1 = cx; + cx = cos * cx - sin * cy; + cy = sin * temp_1 + cos * cy; + this.vertex(x + cx, y + cy, color); + } + this.vertex(x + cx, y + cy, color); + } + else { + this.check(ShapeType.Filled, segments * 3 + 3); + segments--; + for (var i = 0; i < segments; i++) { + this.vertex(x, y, color); + this.vertex(x + cx, y + cy, color); + var temp_2 = cx; + cx = cos * cx - sin * cy; + cy = sin * temp_2 + cos * cy; + this.vertex(x + cx, y + cy, color); + } + this.vertex(x, y, color); + this.vertex(x + cx, y + cy, color); + } + var temp = cx; + cx = radius; + cy = 0; + this.vertex(x + cx, y + cy, color); + }; + ShapeRenderer.prototype.curve = function (x1, y1, cx1, cy1, cx2, cy2, x2, y2, segments, color) { + if (color === void 0) { color = null; } + this.check(ShapeType.Line, segments * 2 + 2); + if (color === null) + color = this.color; + var subdiv_step = 1 / segments; + var subdiv_step2 = subdiv_step * subdiv_step; + var subdiv_step3 = subdiv_step * subdiv_step * subdiv_step; + var pre1 = 3 * subdiv_step; + var pre2 = 3 * subdiv_step2; + var pre4 = 6 * subdiv_step2; + var pre5 = 6 * subdiv_step3; + var tmp1x = x1 - cx1 * 2 + cx2; + var tmp1y = y1 - cy1 * 2 + cy2; + var tmp2x = (cx1 - cx2) * 3 - x1 + x2; + var tmp2y = (cy1 - cy2) * 3 - y1 + y2; + var fx = x1; + var fy = y1; + var dfx = (cx1 - x1) * pre1 + tmp1x * pre2 + tmp2x * subdiv_step3; + var dfy = (cy1 - y1) * pre1 + tmp1y * pre2 + tmp2y * subdiv_step3; + var ddfx = tmp1x * pre4 + tmp2x * pre5; + var ddfy = tmp1y * pre4 + tmp2y * pre5; + var dddfx = tmp2x * pre5; + var dddfy = tmp2y * pre5; + while (segments-- > 0) { + this.vertex(fx, fy, color); + fx += dfx; + fy += dfy; + dfx += ddfx; + dfy += ddfy; + ddfx += dddfx; + ddfy += dddfy; + this.vertex(fx, fy, color); + } + this.vertex(fx, fy, color); + this.vertex(x2, y2, color); + }; + ShapeRenderer.prototype.vertex = function (x, y, color) { + var idx = this.vertexIndex; + var vertices = this.mesh.getVertices(); + vertices[idx++] = x; + vertices[idx++] = y; + vertices[idx++] = color.r; + vertices[idx++] = color.g; + vertices[idx++] = color.b; + vertices[idx++] = color.a; + this.vertexIndex = idx; + }; + ShapeRenderer.prototype.end = function () { + if (!this.isDrawing) + throw new Error("ShapeRenderer.begin() has not been called"); + this.flush(); + this.context.gl.disable(this.context.gl.BLEND); + this.isDrawing = false; + }; + ShapeRenderer.prototype.flush = function () { + if (this.vertexIndex == 0) + return; + this.mesh.setVerticesLength(this.vertexIndex); + this.mesh.draw(this.shader, this.shapeType); + this.vertexIndex = 0; + }; + ShapeRenderer.prototype.check = function (shapeType, numVertices) { + if (!this.isDrawing) + throw new Error("ShapeRenderer.begin() has not been called"); + if (this.shapeType == shapeType) { + if (this.mesh.maxVertices() - this.mesh.numVertices() < numVertices) + this.flush(); + else + return; + } + else { + this.flush(); + this.shapeType = shapeType; + } + }; + ShapeRenderer.prototype.dispose = function () { + this.mesh.dispose(); + }; + return ShapeRenderer; + }()); + webgl.ShapeRenderer = ShapeRenderer; + var ShapeType; + (function (ShapeType) { + ShapeType[ShapeType["Point"] = 0] = "Point"; + ShapeType[ShapeType["Line"] = 1] = "Line"; + ShapeType[ShapeType["Filled"] = 4] = "Filled"; + })(ShapeType = webgl.ShapeType || (webgl.ShapeType = {})); + })(webgl = spine.webgl || (spine.webgl = {})); +})(spine || (spine = {})); +var spine; +(function (spine) { + var webgl; + (function (webgl) { + var SkeletonDebugRenderer = (function () { + function SkeletonDebugRenderer(context) { + this.boneLineColor = new spine.Color(1, 0, 0, 1); + this.boneOriginColor = new spine.Color(0, 1, 0, 1); + this.attachmentLineColor = new spine.Color(0, 0, 1, 0.5); + this.triangleLineColor = new spine.Color(1, 0.64, 0, 0.5); + this.pathColor = new spine.Color().setFromString("FF7F00"); + this.clipColor = new spine.Color(0.8, 0, 0, 2); + this.aabbColor = new spine.Color(0, 1, 0, 0.5); + this.drawBones = true; + this.drawRegionAttachments = true; + this.drawBoundingBoxes = true; + this.drawMeshHull = true; + this.drawMeshTriangles = true; + this.drawPaths = true; + this.drawSkeletonXY = false; + this.drawClipping = true; + this.premultipliedAlpha = false; + this.scale = 1; + this.boneWidth = 2; + this.bounds = new spine.SkeletonBounds(); + this.temp = new Array(); + this.vertices = spine.Utils.newFloatArray(2 * 1024); + this.context = context instanceof webgl.ManagedWebGLRenderingContext ? context : new webgl.ManagedWebGLRenderingContext(context); + } + SkeletonDebugRenderer.prototype.draw = function (shapes, skeleton, ignoredBones) { + if (ignoredBones === void 0) { ignoredBones = null; } + var skeletonX = skeleton.x; + var skeletonY = skeleton.y; + var gl = this.context.gl; + var srcFunc = this.premultipliedAlpha ? gl.ONE : gl.SRC_ALPHA; + shapes.setBlendMode(srcFunc, gl.ONE_MINUS_SRC_ALPHA); + var bones = skeleton.bones; + if (this.drawBones) { + shapes.setColor(this.boneLineColor); + for (var i = 0, n = bones.length; i < n; i++) { + var bone = bones[i]; + if (ignoredBones && ignoredBones.indexOf(bone.data.name) > -1) + continue; + if (bone.parent == null) + continue; + var x = skeletonX + bone.data.length * bone.a + bone.worldX; + var y = skeletonY + bone.data.length * bone.c + bone.worldY; + shapes.rectLine(true, skeletonX + bone.worldX, skeletonY + bone.worldY, x, y, this.boneWidth * this.scale); + } + if (this.drawSkeletonXY) + shapes.x(skeletonX, skeletonY, 4 * this.scale); + } + if (this.drawRegionAttachments) { + shapes.setColor(this.attachmentLineColor); + var slots = skeleton.slots; + for (var i = 0, n = slots.length; i < n; i++) { + var slot = slots[i]; + var attachment = slot.getAttachment(); + if (attachment instanceof spine.RegionAttachment) { + var regionAttachment = attachment; + var vertices = this.vertices; + regionAttachment.computeWorldVertices(slot.bone, vertices, 0, 2); + shapes.line(vertices[0], vertices[1], vertices[2], vertices[3]); + shapes.line(vertices[2], vertices[3], vertices[4], vertices[5]); + shapes.line(vertices[4], vertices[5], vertices[6], vertices[7]); + shapes.line(vertices[6], vertices[7], vertices[0], vertices[1]); + } + } + } + if (this.drawMeshHull || this.drawMeshTriangles) { + var slots = skeleton.slots; + for (var i = 0, n = slots.length; i < n; i++) { + var slot = slots[i]; + if (!slot.bone.active) + continue; + var attachment = slot.getAttachment(); + if (!(attachment instanceof spine.MeshAttachment)) + continue; + var mesh = attachment; + var vertices = this.vertices; + mesh.computeWorldVertices(slot, 0, mesh.worldVerticesLength, vertices, 0, 2); + var triangles = mesh.triangles; + var hullLength = mesh.hullLength; + if (this.drawMeshTriangles) { + shapes.setColor(this.triangleLineColor); + for (var ii = 0, nn = triangles.length; ii < nn; ii += 3) { + var v1 = triangles[ii] * 2, v2 = triangles[ii + 1] * 2, v3 = triangles[ii + 2] * 2; + shapes.triangle(false, vertices[v1], vertices[v1 + 1], vertices[v2], vertices[v2 + 1], vertices[v3], vertices[v3 + 1]); + } + } + if (this.drawMeshHull && hullLength > 0) { + shapes.setColor(this.attachmentLineColor); + hullLength = (hullLength >> 1) * 2; + var lastX = vertices[hullLength - 2], lastY = vertices[hullLength - 1]; + for (var ii = 0, nn = hullLength; ii < nn; ii += 2) { + var x = vertices[ii], y = vertices[ii + 1]; + shapes.line(x, y, lastX, lastY); + lastX = x; + lastY = y; + } + } + } + } + if (this.drawBoundingBoxes) { + var bounds = this.bounds; + bounds.update(skeleton, true); + shapes.setColor(this.aabbColor); + shapes.rect(false, bounds.minX, bounds.minY, bounds.getWidth(), bounds.getHeight()); + var polygons = bounds.polygons; + var boxes = bounds.boundingBoxes; + for (var i = 0, n = polygons.length; i < n; i++) { + var polygon = polygons[i]; + shapes.setColor(boxes[i].color); + shapes.polygon(polygon, 0, polygon.length); + } + } + if (this.drawPaths) { + var slots = skeleton.slots; + for (var i = 0, n = slots.length; i < n; i++) { + var slot = slots[i]; + if (!slot.bone.active) + continue; + var attachment = slot.getAttachment(); + if (!(attachment instanceof spine.PathAttachment)) + continue; + var path = attachment; + var nn = path.worldVerticesLength; + var world = this.temp = spine.Utils.setArraySize(this.temp, nn, 0); + path.computeWorldVertices(slot, 0, nn, world, 0, 2); + var color = this.pathColor; + var x1 = world[2], y1 = world[3], x2 = 0, y2 = 0; + if (path.closed) { + shapes.setColor(color); + var cx1 = world[0], cy1 = world[1], cx2 = world[nn - 2], cy2 = world[nn - 1]; + x2 = world[nn - 4]; + y2 = world[nn - 3]; + shapes.curve(x1, y1, cx1, cy1, cx2, cy2, x2, y2, 32); + shapes.setColor(SkeletonDebugRenderer.LIGHT_GRAY); + shapes.line(x1, y1, cx1, cy1); + shapes.line(x2, y2, cx2, cy2); + } + nn -= 4; + for (var ii = 4; ii < nn; ii += 6) { + var cx1 = world[ii], cy1 = world[ii + 1], cx2 = world[ii + 2], cy2 = world[ii + 3]; + x2 = world[ii + 4]; + y2 = world[ii + 5]; + shapes.setColor(color); + shapes.curve(x1, y1, cx1, cy1, cx2, cy2, x2, y2, 32); + shapes.setColor(SkeletonDebugRenderer.LIGHT_GRAY); + shapes.line(x1, y1, cx1, cy1); + shapes.line(x2, y2, cx2, cy2); + x1 = x2; + y1 = y2; + } + } + } + if (this.drawBones) { + shapes.setColor(this.boneOriginColor); + for (var i = 0, n = bones.length; i < n; i++) { + var bone = bones[i]; + if (ignoredBones && ignoredBones.indexOf(bone.data.name) > -1) + continue; + shapes.circle(true, skeletonX + bone.worldX, skeletonY + bone.worldY, 3 * this.scale, SkeletonDebugRenderer.GREEN, 8); + } + } + if (this.drawClipping) { + var slots = skeleton.slots; + shapes.setColor(this.clipColor); + for (var i = 0, n = slots.length; i < n; i++) { + var slot = slots[i]; + if (!slot.bone.active) + continue; + var attachment = slot.getAttachment(); + if (!(attachment instanceof spine.ClippingAttachment)) + continue; + var clip = attachment; + var nn = clip.worldVerticesLength; + var world = this.temp = spine.Utils.setArraySize(this.temp, nn, 0); + clip.computeWorldVertices(slot, 0, nn, world, 0, 2); + for (var i_21 = 0, n_3 = world.length; i_21 < n_3; i_21 += 2) { + var x = world[i_21]; + var y = world[i_21 + 1]; + var x2 = world[(i_21 + 2) % world.length]; + var y2 = world[(i_21 + 3) % world.length]; + shapes.line(x, y, x2, y2); + } + } + } + }; + SkeletonDebugRenderer.prototype.dispose = function () { + }; + SkeletonDebugRenderer.LIGHT_GRAY = new spine.Color(192 / 255, 192 / 255, 192 / 255, 1); + SkeletonDebugRenderer.GREEN = new spine.Color(0, 1, 0, 1); + return SkeletonDebugRenderer; + }()); + webgl.SkeletonDebugRenderer = SkeletonDebugRenderer; + })(webgl = spine.webgl || (spine.webgl = {})); +})(spine || (spine = {})); +var spine; +(function (spine) { + var webgl; + (function (webgl) { + var Renderable = (function () { + function Renderable(vertices, numVertices, numFloats) { + this.vertices = vertices; + this.numVertices = numVertices; + this.numFloats = numFloats; + } + return Renderable; + }()); + ; + var SkeletonRenderer = (function () { + function SkeletonRenderer(context, twoColorTint) { + if (twoColorTint === void 0) { twoColorTint = true; } + this.premultipliedAlpha = false; + this.vertexEffect = null; + this.tempColor = new spine.Color(); + this.tempColor2 = new spine.Color(); + this.vertexSize = 2 + 2 + 4; + this.twoColorTint = false; + this.renderable = new Renderable(null, 0, 0); + this.clipper = new spine.SkeletonClipping(); + this.temp = new spine.Vector2(); + this.temp2 = new spine.Vector2(); + this.temp3 = new spine.Color(); + this.temp4 = new spine.Color(); + this.twoColorTint = twoColorTint; + if (twoColorTint) + this.vertexSize += 4; + this.vertices = spine.Utils.newFloatArray(this.vertexSize * 1024); + } + SkeletonRenderer.prototype.draw = function (batcher, skeleton, slotRangeStart, slotRangeEnd, palette) { + if (slotRangeStart === void 0) { slotRangeStart = -1; } + if (slotRangeEnd === void 0) { slotRangeEnd = -1; } + var clipper = this.clipper; + var premultipliedAlpha = this.premultipliedAlpha; + var twoColorTint = this.twoColorTint; + var blendMode = null; + var tempPos = this.temp; + var tempUv = this.temp2; + var tempLight = this.temp3; + var tempDark = this.temp4; + var renderable = this.renderable; + var uvs = null; + var triangles = null; + var drawOrder = skeleton.drawOrder; + var attachmentColor = null; + var skeletonColor = skeleton.color; + var vertexSize = twoColorTint ? 12 : 8; + var inRange = false; + if (slotRangeStart == -1) + inRange = true; + for (var i = 0, n = drawOrder.length; i < n; i++) { + var clippedVertexSize = clipper.isClipping() ? 2 : vertexSize; + var slot = drawOrder[i]; + var paletteIndex = 0; + var paletteOffset = 0; + if (palette.enable) { + if (palette.slotPalette.hasOwnProperty(slot.data.name)) { + paletteIndex = palette.slotPalette[slot.data.name] / palette.paletteNumber; + } + if (palette.slotPaletteOffset.hasOwnProperty(slot.data.name)) { + paletteOffset = palette.slotPaletteOffset[slot.data.name] / palette.indexSize; + } + } + if (!slot.bone.active) { + clipper.clipEndWithSlot(slot); + continue; + } + if (slotRangeStart >= 0 && slotRangeStart == slot.data.index) { + inRange = true; + } + if (!inRange) { + clipper.clipEndWithSlot(slot); + continue; + } + if (slotRangeEnd >= 0 && slotRangeEnd == slot.data.index) { + inRange = false; + } + var slotName = slot.data.name; + var attachment = slot.getAttachment(); + var texture = null; + if (attachment instanceof spine.RegionAttachment) { + var region = attachment; + renderable.vertices = this.vertices; + renderable.numVertices = 4; + renderable.numFloats = clippedVertexSize << 2; + region.computeWorldVertices(slot.bone, renderable.vertices, 0, clippedVertexSize); + triangles = SkeletonRenderer.QUAD_TRIANGLES; + uvs = region.uvs; + texture = region.region.renderObject.texture; + attachmentColor = region.color; + } + else if (attachment instanceof spine.MeshAttachment) { + var mesh = attachment; + renderable.vertices = this.vertices; + renderable.numVertices = (mesh.worldVerticesLength >> 1); + renderable.numFloats = renderable.numVertices * clippedVertexSize; + if (renderable.numFloats > renderable.vertices.length) { + renderable.vertices = this.vertices = spine.Utils.newFloatArray(renderable.numFloats); + } + mesh.computeWorldVertices(slot, 0, mesh.worldVerticesLength, renderable.vertices, 0, clippedVertexSize); + triangles = mesh.triangles; + texture = mesh.region.renderObject.texture; + uvs = mesh.uvs; + attachmentColor = mesh.color; + } + else if (attachment instanceof spine.ClippingAttachment) { + var clip = (attachment); + clipper.clipStart(slot, clip); + continue; + } + else { + clipper.clipEndWithSlot(slot); + continue; + } + if (texture != null) { + var slotColor = slot.color; + var finalColor = this.tempColor; + finalColor.r = skeletonColor.r * slotColor.r * attachmentColor.r; + finalColor.g = skeletonColor.g * slotColor.g * attachmentColor.g; + finalColor.b = skeletonColor.b * slotColor.b * attachmentColor.b; + finalColor.a = skeletonColor.a * slotColor.a * attachmentColor.a; + if (premultipliedAlpha) { + finalColor.r *= finalColor.a; + finalColor.g *= finalColor.a; + finalColor.b *= finalColor.a; + } + var darkColor = this.tempColor2; + if (slot.darkColor == null) + darkColor.set(0, 0, 0, 1.0); + else { + if (premultipliedAlpha) { + darkColor.r = slot.darkColor.r * finalColor.a; + darkColor.g = slot.darkColor.g * finalColor.a; + darkColor.b = slot.darkColor.b * finalColor.a; + } + else { + darkColor.setFromColor(slot.darkColor); + } + darkColor.a = premultipliedAlpha ? 1.0 : 0.0; + } + var slotBlendMode = slot.data.blendMode; + if (slotBlendMode != blendMode) { + blendMode = slotBlendMode; + batcher.setBlendMode(webgl.WebGLBlendModeConverter.getSourceGLBlendMode(blendMode, premultipliedAlpha), webgl.WebGLBlendModeConverter.getDestGLBlendMode(blendMode)); + } + if (clipper.isClipping()) { + clipper.clipTriangles(renderable.vertices, renderable.numFloats, triangles, triangles.length, uvs, finalColor, darkColor, twoColorTint); + var clippedVertices = new Float32Array(clipper.clippedVertices); + var clippedTriangles = clipper.clippedTriangles; + if (this.vertexEffect != null) { + var vertexEffect = this.vertexEffect; + var verts = clippedVertices; + if (!twoColorTint) { + for (var v = 0, n_4 = clippedVertices.length; v < n_4; v += vertexSize) { + tempPos.x = verts[v]; + tempPos.y = verts[v + 1]; + tempLight.set(verts[v + 2], verts[v + 3], verts[v + 4], verts[v + 5]); + tempUv.x = verts[v + 6]; + tempUv.y = verts[v + 7]; + tempDark.set(0, 0, 0, 0); + vertexEffect.transform(tempPos, tempUv, tempLight, tempDark); + verts[v] = tempPos.x; + verts[v + 1] = tempPos.y; + verts[v + 2] = tempLight.r; + verts[v + 3] = tempLight.g; + verts[v + 4] = tempLight.b; + verts[v + 5] = tempLight.a; + verts[v + 6] = tempUv.x; + verts[v + 7] = tempUv.y; + } + } + else { + for (var v = 0, n_5 = clippedVertices.length; v < n_5; v += vertexSize) { + tempPos.x = verts[v]; + tempPos.y = verts[v + 1]; + tempLight.set(verts[v + 2], verts[v + 3], verts[v + 4], verts[v + 5]); + tempUv.x = verts[v + 6]; + tempUv.y = verts[v + 7]; + tempDark.set(verts[v + 8], verts[v + 9], verts[v + 10], verts[v + 11]); + vertexEffect.transform(tempPos, tempUv, tempLight, tempDark); + verts[v] = tempPos.x; + verts[v + 1] = tempPos.y; + verts[v + 2] = tempLight.r; + verts[v + 3] = tempLight.g; + verts[v + 4] = tempLight.b; + verts[v + 5] = tempLight.a; + verts[v + 6] = tempUv.x; + verts[v + 7] = tempUv.y; + verts[v + 8] = tempDark.r; + verts[v + 9] = tempDark.g; + verts[v + 10] = tempDark.b; + verts[v + 11] = tempDark.a; + } + } + } + batcher.draw(texture, clippedVertices, clippedTriangles); + } + else { + var verts = renderable.vertices; + if (this.vertexEffect != null) { + var vertexEffect = this.vertexEffect; + if (!twoColorTint) { + for (var v = 0, u = 0, n_6 = renderable.numFloats; v < n_6; v += vertexSize, u += 2) { + tempPos.x = verts[v]; + tempPos.y = verts[v + 1]; + tempUv.x = uvs[u]; + tempUv.y = uvs[u + 1]; + tempLight.setFromColor(finalColor); + tempDark.set(0, 0, 0, 0); + vertexEffect.transform(tempPos, tempUv, tempLight, tempDark); + verts[v] = tempPos.x; + verts[v + 1] = tempPos.y; + verts[v + 2] = tempLight.r; + verts[v + 3] = tempLight.g; + verts[v + 4] = tempLight.b; + verts[v + 5] = tempLight.a; + verts[v + 6] = tempUv.x; + verts[v + 7] = tempUv.y; + } + } + else { + for (var v = 0, u = 0, n_7 = renderable.numFloats; v < n_7; v += vertexSize, u += 2) { + tempPos.x = verts[v]; + tempPos.y = verts[v + 1]; + tempUv.x = uvs[u]; + tempUv.y = uvs[u + 1]; + tempLight.setFromColor(finalColor); + tempDark.setFromColor(darkColor); + vertexEffect.transform(tempPos, tempUv, tempLight, tempDark); + verts[v] = tempPos.x; + verts[v + 1] = tempPos.y; + verts[v + 2] = tempLight.r; + verts[v + 3] = tempLight.g; + verts[v + 4] = tempLight.b; + verts[v + 5] = tempLight.a; + verts[v + 6] = tempUv.x; + verts[v + 7] = tempUv.y; + verts[v + 8] = tempDark.r; + verts[v + 9] = tempDark.g; + verts[v + 10] = tempDark.b; + verts[v + 11] = tempDark.a; + } + } + } + else { + if (!twoColorTint) { + for (var v = 2, u = 0, n_8 = renderable.numFloats; v < n_8; v += vertexSize, u += 2) { + verts[v] = finalColor.r; + verts[v + 1] = finalColor.g; + verts[v + 2] = finalColor.b; + verts[v + 3] = finalColor.a; + verts[v + 4] = uvs[u]; + verts[v + 5] = uvs[u + 1]; + } + } + else { + for (var v = 2, u = 0, n_9 = renderable.numFloats; v < n_9; v += vertexSize, u += 2) { + verts[v] = finalColor.r; + verts[v + 1] = finalColor.g; + if (palette.enable) { + verts[v + 1] = paletteOffset; + verts[v + 2] = paletteIndex; + verts[v + 3] = -1.0; + } + else { + verts[v + 2] = finalColor.b; + verts[v + 3] = finalColor.a; + } + verts[v + 4] = uvs[u]; + verts[v + 5] = uvs[u + 1]; + verts[v + 6] = darkColor.r; + verts[v + 7] = darkColor.g; + verts[v + 8] = darkColor.b; + verts[v + 9] = darkColor.a; + } + } + } + var view = renderable.vertices.subarray(0, renderable.numFloats); + batcher.draw(texture, view, triangles); + } + } + clipper.clipEndWithSlot(slot); + } + clipper.clipEnd(); + }; + SkeletonRenderer.QUAD_TRIANGLES = [0, 1, 2, 2, 3, 0]; + return SkeletonRenderer; + }()); + webgl.SkeletonRenderer = SkeletonRenderer; + })(webgl = spine.webgl || (spine.webgl = {})); +})(spine || (spine = {})); +var spine; +(function (spine) { + var webgl; + (function (webgl) { + var Vector3 = (function () { + function Vector3(x, y, z) { + if (x === void 0) { x = 0; } + if (y === void 0) { y = 0; } + if (z === void 0) { z = 0; } + this.x = 0; + this.y = 0; + this.z = 0; + this.x = x; + this.y = y; + this.z = z; + } + Vector3.prototype.setFrom = function (v) { + this.x = v.x; + this.y = v.y; + this.z = v.z; + return this; + }; + Vector3.prototype.set = function (x, y, z) { + this.x = x; + this.y = y; + this.z = z; + return this; + }; + Vector3.prototype.add = function (v) { + this.x += v.x; + this.y += v.y; + this.z += v.z; + return this; + }; + Vector3.prototype.sub = function (v) { + this.x -= v.x; + this.y -= v.y; + this.z -= v.z; + return this; + }; + Vector3.prototype.scale = function (s) { + this.x *= s; + this.y *= s; + this.z *= s; + return this; + }; + Vector3.prototype.normalize = function () { + var len = this.length(); + if (len == 0) + return this; + len = 1 / len; + this.x *= len; + this.y *= len; + this.z *= len; + return this; + }; + Vector3.prototype.cross = function (v) { + return this.set(this.y * v.z - this.z * v.y, this.z * v.x - this.x * v.z, this.x * v.y - this.y * v.x); + }; + Vector3.prototype.multiply = function (matrix) { + var l_mat = matrix.values; + return this.set(this.x * l_mat[webgl.M00] + this.y * l_mat[webgl.M01] + this.z * l_mat[webgl.M02] + l_mat[webgl.M03], this.x * l_mat[webgl.M10] + this.y * l_mat[webgl.M11] + this.z * l_mat[webgl.M12] + l_mat[webgl.M13], this.x * l_mat[webgl.M20] + this.y * l_mat[webgl.M21] + this.z * l_mat[webgl.M22] + l_mat[webgl.M23]); + }; + Vector3.prototype.project = function (matrix) { + var l_mat = matrix.values; + var l_w = 1 / (this.x * l_mat[webgl.M30] + this.y * l_mat[webgl.M31] + this.z * l_mat[webgl.M32] + l_mat[webgl.M33]); + return this.set((this.x * l_mat[webgl.M00] + this.y * l_mat[webgl.M01] + this.z * l_mat[webgl.M02] + l_mat[webgl.M03]) * l_w, (this.x * l_mat[webgl.M10] + this.y * l_mat[webgl.M11] + this.z * l_mat[webgl.M12] + l_mat[webgl.M13]) * l_w, (this.x * l_mat[webgl.M20] + this.y * l_mat[webgl.M21] + this.z * l_mat[webgl.M22] + l_mat[webgl.M23]) * l_w); + }; + Vector3.prototype.dot = function (v) { + return this.x * v.x + this.y * v.y + this.z * v.z; + }; + Vector3.prototype.length = function () { + return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z); + }; + Vector3.prototype.distance = function (v) { + var a = v.x - this.x; + var b = v.y - this.y; + var c = v.z - this.z; + return Math.sqrt(a * a + b * b + c * c); + }; + return Vector3; + }()); + webgl.Vector3 = Vector3; + })(webgl = spine.webgl || (spine.webgl = {})); +})(spine || (spine = {})); +var spine; +(function (spine) { + var webgl; + (function (webgl) { + var ManagedWebGLRenderingContext = (function () { + function ManagedWebGLRenderingContext(canvasOrContext, contextConfig) { + if (contextConfig === void 0) { contextConfig = { alpha: "true" }; } + this.restorables = new Array(); + if (!((canvasOrContext instanceof WebGLRenderingContext) || (canvasOrContext instanceof WebGL2RenderingContext))) { + this.setupCanvas(canvasOrContext, contextConfig); + } + else { + this.gl = canvasOrContext; + this.canvas = this.gl.canvas; + } + } + ManagedWebGLRenderingContext.prototype.setupCanvas = function (canvas, contextConfig) { + var _this = this; + this.gl = (canvas.getContext("webgl2", contextConfig) || canvas.getContext("webgl", contextConfig)); + this.canvas = canvas; + canvas.addEventListener("webglcontextlost", function (e) { + var event = e; + if (e) { + e.preventDefault(); + } + }); + canvas.addEventListener("webglcontextrestored", function (e) { + for (var i = 0, n = _this.restorables.length; i < n; i++) { + _this.restorables[i].restore(); + } + }); + }; + ManagedWebGLRenderingContext.prototype.addRestorable = function (restorable) { + this.restorables.push(restorable); + }; + ManagedWebGLRenderingContext.prototype.removeRestorable = function (restorable) { + var index = this.restorables.indexOf(restorable); + if (index > -1) + this.restorables.splice(index, 1); + }; + return ManagedWebGLRenderingContext; + }()); + webgl.ManagedWebGLRenderingContext = ManagedWebGLRenderingContext; + var WebGLBlendModeConverter = (function () { + function WebGLBlendModeConverter() { + } + WebGLBlendModeConverter.getDestGLBlendMode = function (blendMode) { + switch (blendMode) { + case spine.BlendMode.Normal: return WebGLBlendModeConverter.ONE_MINUS_SRC_ALPHA; + case spine.BlendMode.Additive: return WebGLBlendModeConverter.ONE; + case spine.BlendMode.Multiply: return WebGLBlendModeConverter.ONE_MINUS_SRC_ALPHA; + case spine.BlendMode.Screen: return WebGLBlendModeConverter.ONE_MINUS_SRC_ALPHA; + default: throw new Error("Unknown blend mode: " + blendMode); + } + }; + WebGLBlendModeConverter.getSourceGLBlendMode = function (blendMode, premultipliedAlpha) { + if (premultipliedAlpha === void 0) { premultipliedAlpha = false; } + switch (blendMode) { + case spine.BlendMode.Normal: return premultipliedAlpha ? WebGLBlendModeConverter.ONE : WebGLBlendModeConverter.SRC_ALPHA; + case spine.BlendMode.Additive: return premultipliedAlpha ? WebGLBlendModeConverter.ONE : WebGLBlendModeConverter.SRC_ALPHA; + case spine.BlendMode.Multiply: return WebGLBlendModeConverter.DST_COLOR; + case spine.BlendMode.Screen: return WebGLBlendModeConverter.ONE; + default: throw new Error("Unknown blend mode: " + blendMode); + } + }; + WebGLBlendModeConverter.ZERO = 0; + WebGLBlendModeConverter.ONE = 1; + WebGLBlendModeConverter.SRC_COLOR = 0x0300; + WebGLBlendModeConverter.ONE_MINUS_SRC_COLOR = 0x0301; + WebGLBlendModeConverter.SRC_ALPHA = 0x0302; + WebGLBlendModeConverter.ONE_MINUS_SRC_ALPHA = 0x0303; + WebGLBlendModeConverter.DST_ALPHA = 0x0304; + WebGLBlendModeConverter.ONE_MINUS_DST_ALPHA = 0x0305; + WebGLBlendModeConverter.DST_COLOR = 0x0306; + return WebGLBlendModeConverter; + }()); + webgl.WebGLBlendModeConverter = WebGLBlendModeConverter; + })(webgl = spine.webgl || (spine.webgl = {})); +})(spine || (spine = {})); +//# sourceMappingURL=spine-webgl.js.map \ No newline at end of file diff --git a/src/c3runtime/spine-webgl.js b/src/c3runtime/spine-webgl.js index 9021db5..20b1ffa 100644 --- a/src/c3runtime/spine-webgl.js +++ b/src/c3runtime/spine-webgl.js @@ -1,10856 +1,11546 @@ -var __extends = (this && this.__extends) || (function () { - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -globalThis.spine = {}; -var spine = globalThis.spine; -(function (spine) { - var Animation = (function () { - function Animation(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; - } - Animation.prototype.hasTimeline = function (id) { - return this.timelineIds[id] == true; - }; - Animation.prototype.apply = function (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; - } - var timelines = this.timelines; - for (var i = 0, n = timelines.length; i < n; i++) - timelines[i].apply(skeleton, lastTime, time, events, alpha, blend, direction); - }; - Animation.binarySearch = function (values, target, step) { - if (step === void 0) { step = 1; } - var low = 0; - var high = values.length / step - 2; - if (high == 0) - return step; - var 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; - } - }; - Animation.linearSearch = function (values, target, step) { - for (var i = 0, last = values.length - step; i <= last; i += step) - if (values[i] > target) - return i; - return -1; - }; - return Animation; - }()); - spine.Animation = Animation; - var MixBlend; - (function (MixBlend) { - MixBlend[MixBlend["setup"] = 0] = "setup"; - MixBlend[MixBlend["first"] = 1] = "first"; - MixBlend[MixBlend["replace"] = 2] = "replace"; - MixBlend[MixBlend["add"] = 3] = "add"; - })(MixBlend = spine.MixBlend || (spine.MixBlend = {})); - var MixDirection; - (function (MixDirection) { - MixDirection[MixDirection["mixIn"] = 0] = "mixIn"; - MixDirection[MixDirection["mixOut"] = 1] = "mixOut"; - })(MixDirection = spine.MixDirection || (spine.MixDirection = {})); - var TimelineType; - (function (TimelineType) { - TimelineType[TimelineType["rotate"] = 0] = "rotate"; - TimelineType[TimelineType["translate"] = 1] = "translate"; - TimelineType[TimelineType["scale"] = 2] = "scale"; - TimelineType[TimelineType["shear"] = 3] = "shear"; - TimelineType[TimelineType["attachment"] = 4] = "attachment"; - TimelineType[TimelineType["color"] = 5] = "color"; - TimelineType[TimelineType["deform"] = 6] = "deform"; - TimelineType[TimelineType["event"] = 7] = "event"; - TimelineType[TimelineType["drawOrder"] = 8] = "drawOrder"; - TimelineType[TimelineType["ikConstraint"] = 9] = "ikConstraint"; - TimelineType[TimelineType["transformConstraint"] = 10] = "transformConstraint"; - TimelineType[TimelineType["pathConstraintPosition"] = 11] = "pathConstraintPosition"; - TimelineType[TimelineType["pathConstraintSpacing"] = 12] = "pathConstraintSpacing"; - TimelineType[TimelineType["pathConstraintMix"] = 13] = "pathConstraintMix"; - TimelineType[TimelineType["twoColor"] = 14] = "twoColor"; - })(TimelineType = spine.TimelineType || (spine.TimelineType = {})); - var CurveTimeline = (function () { - function CurveTimeline(frameCount) { - if (frameCount <= 0) - throw new Error("frameCount must be > 0: " + frameCount); - this.curves = spine.Utils.newFloatArray((frameCount - 1) * CurveTimeline.BEZIER_SIZE); - } - CurveTimeline.prototype.getFrameCount = function () { - return this.curves.length / CurveTimeline.BEZIER_SIZE + 1; - }; - CurveTimeline.prototype.setLinear = function (frameIndex) { - this.curves[frameIndex * CurveTimeline.BEZIER_SIZE] = CurveTimeline.LINEAR; - }; - CurveTimeline.prototype.setStepped = function (frameIndex) { - this.curves[frameIndex * CurveTimeline.BEZIER_SIZE] = CurveTimeline.STEPPED; - }; - CurveTimeline.prototype.getCurveType = function (frameIndex) { - var index = frameIndex * CurveTimeline.BEZIER_SIZE; - if (index == this.curves.length) - return CurveTimeline.LINEAR; - var type = this.curves[index]; - if (type == CurveTimeline.LINEAR) - return CurveTimeline.LINEAR; - if (type == CurveTimeline.STEPPED) - return CurveTimeline.STEPPED; - return CurveTimeline.BEZIER; - }; - CurveTimeline.prototype.setCurve = function (frameIndex, cx1, cy1, cx2, cy2) { - var tmpx = (-cx1 * 2 + cx2) * 0.03, tmpy = (-cy1 * 2 + cy2) * 0.03; - var dddfx = ((cx1 - cx2) * 3 + 1) * 0.006, dddfy = ((cy1 - cy2) * 3 + 1) * 0.006; - var ddfx = tmpx * 2 + dddfx, ddfy = tmpy * 2 + dddfy; - var dfx = cx1 * 0.3 + tmpx + dddfx * 0.16666667, dfy = cy1 * 0.3 + tmpy + dddfy * 0.16666667; - var i = frameIndex * CurveTimeline.BEZIER_SIZE; - var curves = this.curves; - curves[i++] = CurveTimeline.BEZIER; - var x = dfx, y = dfy; - for (var 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; - } - }; - CurveTimeline.prototype.getCurvePercent = function (frameIndex, percent) { - percent = spine.MathUtils.clamp(percent, 0, 1); - var curves = this.curves; - var i = frameIndex * CurveTimeline.BEZIER_SIZE; - var type = curves[i]; - if (type == CurveTimeline.LINEAR) - return percent; - if (type == CurveTimeline.STEPPED) - return 0; - i++; - var x = 0; - for (var start = i, n = i + CurveTimeline.BEZIER_SIZE - 1; i < n; i += 2) { - x = curves[i]; - if (x >= percent) { - var prevX = void 0, prevY = void 0; - 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); - } - } - var y = curves[i - 1]; - return y + (1 - y) * (percent - x) / (1 - x); - }; - CurveTimeline.LINEAR = 0; - CurveTimeline.STEPPED = 1; - CurveTimeline.BEZIER = 2; - CurveTimeline.BEZIER_SIZE = 10 * 2 - 1; - return CurveTimeline; - }()); - spine.CurveTimeline = CurveTimeline; - var RotateTimeline = (function (_super) { - __extends(RotateTimeline, _super); - function RotateTimeline(frameCount) { - var _this = _super.call(this, frameCount) || this; - _this.frames = spine.Utils.newFloatArray(frameCount << 1); - return _this; - } - RotateTimeline.prototype.getPropertyId = function () { - return (TimelineType.rotate << 24) + this.boneIndex; - }; - RotateTimeline.prototype.setFrame = function (frameIndex, time, degrees) { - frameIndex <<= 1; - this.frames[frameIndex] = time; - this.frames[frameIndex + RotateTimeline.ROTATION] = degrees; - }; - RotateTimeline.prototype.apply = function (skeleton, lastTime, time, events, alpha, blend, direction) { - var frames = this.frames; - var 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: - var r_1 = bone.data.rotation - bone.rotation; - bone.rotation += (r_1 - (16384 - ((16384.499999999996 - r_1 / 360) | 0)) * 360) * alpha; - } - return; - } - if (time >= frames[frames.length - RotateTimeline.ENTRIES]) { - var r_2 = frames[frames.length + RotateTimeline.PREV_ROTATION]; - switch (blend) { - case MixBlend.setup: - bone.rotation = bone.data.rotation + r_2 * alpha; - break; - case MixBlend.first: - case MixBlend.replace: - r_2 += bone.data.rotation - bone.rotation; - r_2 -= (16384 - ((16384.499999999996 - r_2 / 360) | 0)) * 360; - case MixBlend.add: - bone.rotation += r_2 * alpha; - } - return; - } - var frame = Animation.binarySearch(frames, time, RotateTimeline.ENTRIES); - var prevRotation = frames[frame + RotateTimeline.PREV_ROTATION]; - var frameTime = frames[frame]; - var percent = this.getCurvePercent((frame >> 1) - 1, 1 - (time - frameTime) / (frames[frame + RotateTimeline.PREV_TIME] - frameTime)); - var 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.ENTRIES = 2; - RotateTimeline.PREV_TIME = -2; - RotateTimeline.PREV_ROTATION = -1; - RotateTimeline.ROTATION = 1; - return RotateTimeline; - }(CurveTimeline)); - spine.RotateTimeline = RotateTimeline; - var TranslateTimeline = (function (_super) { - __extends(TranslateTimeline, _super); - function TranslateTimeline(frameCount) { - var _this = _super.call(this, frameCount) || this; - _this.frames = spine.Utils.newFloatArray(frameCount * TranslateTimeline.ENTRIES); - return _this; - } - TranslateTimeline.prototype.getPropertyId = function () { - return (TimelineType.translate << 24) + this.boneIndex; - }; - TranslateTimeline.prototype.setFrame = function (frameIndex, time, x, y) { - frameIndex *= TranslateTimeline.ENTRIES; - this.frames[frameIndex] = time; - this.frames[frameIndex + TranslateTimeline.X] = x; - this.frames[frameIndex + TranslateTimeline.Y] = y; - }; - TranslateTimeline.prototype.apply = function (skeleton, lastTime, time, events, alpha, blend, direction) { - var frames = this.frames; - var 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; - } - var x = 0, y = 0; - if (time >= frames[frames.length - TranslateTimeline.ENTRIES]) { - x = frames[frames.length + TranslateTimeline.PREV_X]; - y = frames[frames.length + TranslateTimeline.PREV_Y]; - } - else { - var frame = Animation.binarySearch(frames, time, TranslateTimeline.ENTRIES); - x = frames[frame + TranslateTimeline.PREV_X]; - y = frames[frame + TranslateTimeline.PREV_Y]; - var frameTime = frames[frame]; - var 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.ENTRIES = 3; - TranslateTimeline.PREV_TIME = -3; - TranslateTimeline.PREV_X = -2; - TranslateTimeline.PREV_Y = -1; - TranslateTimeline.X = 1; - TranslateTimeline.Y = 2; - return TranslateTimeline; - }(CurveTimeline)); - spine.TranslateTimeline = TranslateTimeline; - var ScaleTimeline = (function (_super) { - __extends(ScaleTimeline, _super); - function ScaleTimeline(frameCount) { - return _super.call(this, frameCount) || this; - } - ScaleTimeline.prototype.getPropertyId = function () { - return (TimelineType.scale << 24) + this.boneIndex; - }; - ScaleTimeline.prototype.apply = function (skeleton, lastTime, time, events, alpha, blend, direction) { - var frames = this.frames; - var 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; - } - var x = 0, y = 0; - if (time >= frames[frames.length - ScaleTimeline.ENTRIES]) { - x = frames[frames.length + ScaleTimeline.PREV_X] * bone.data.scaleX; - y = frames[frames.length + ScaleTimeline.PREV_Y] * bone.data.scaleY; - } - else { - var frame = Animation.binarySearch(frames, time, ScaleTimeline.ENTRIES); - x = frames[frame + ScaleTimeline.PREV_X]; - y = frames[frame + ScaleTimeline.PREV_Y]; - var frameTime = frames[frame]; - var 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 { - var 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) * spine.MathUtils.signum(bx) - bx) * alpha; - bone.scaleY = by + (Math.abs(y) * spine.MathUtils.signum(by) - by) * alpha; - break; - case MixBlend.first: - case MixBlend.replace: - bx = bone.scaleX; - by = bone.scaleY; - bone.scaleX = bx + (Math.abs(x) * spine.MathUtils.signum(bx) - bx) * alpha; - bone.scaleY = by + (Math.abs(y) * spine.MathUtils.signum(by) - by) * alpha; - break; - case MixBlend.add: - bx = bone.scaleX; - by = bone.scaleY; - bone.scaleX = bx + (Math.abs(x) * spine.MathUtils.signum(bx) - bone.data.scaleX) * alpha; - bone.scaleY = by + (Math.abs(y) * spine.MathUtils.signum(by) - bone.data.scaleY) * alpha; - } - } - else { - switch (blend) { - case MixBlend.setup: - bx = Math.abs(bone.data.scaleX) * spine.MathUtils.signum(x); - by = Math.abs(bone.data.scaleY) * spine.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) * spine.MathUtils.signum(x); - by = Math.abs(bone.scaleY) * spine.MathUtils.signum(y); - bone.scaleX = bx + (x - bx) * alpha; - bone.scaleY = by + (y - by) * alpha; - break; - case MixBlend.add: - bx = spine.MathUtils.signum(x); - by = spine.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; - } - } - } - }; - return ScaleTimeline; - }(TranslateTimeline)); - spine.ScaleTimeline = ScaleTimeline; - var ShearTimeline = (function (_super) { - __extends(ShearTimeline, _super); - function ShearTimeline(frameCount) { - return _super.call(this, frameCount) || this; - } - ShearTimeline.prototype.getPropertyId = function () { - return (TimelineType.shear << 24) + this.boneIndex; - }; - ShearTimeline.prototype.apply = function (skeleton, lastTime, time, events, alpha, blend, direction) { - var frames = this.frames; - var 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; - } - var x = 0, y = 0; - if (time >= frames[frames.length - ShearTimeline.ENTRIES]) { - x = frames[frames.length + ShearTimeline.PREV_X]; - y = frames[frames.length + ShearTimeline.PREV_Y]; - } - else { - var frame = Animation.binarySearch(frames, time, ShearTimeline.ENTRIES); - x = frames[frame + ShearTimeline.PREV_X]; - y = frames[frame + ShearTimeline.PREV_Y]; - var frameTime = frames[frame]; - var 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; - } - }; - return ShearTimeline; - }(TranslateTimeline)); - spine.ShearTimeline = ShearTimeline; - var ColorTimeline = (function (_super) { - __extends(ColorTimeline, _super); - function ColorTimeline(frameCount) { - var _this = _super.call(this, frameCount) || this; - _this.frames = spine.Utils.newFloatArray(frameCount * ColorTimeline.ENTRIES); - return _this; - } - ColorTimeline.prototype.getPropertyId = function () { - return (TimelineType.color << 24) + this.slotIndex; - }; - ColorTimeline.prototype.setFrame = function (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; - }; - ColorTimeline.prototype.apply = function (skeleton, lastTime, time, events, alpha, blend, direction) { - var slot = skeleton.slots[this.slotIndex]; - if (!slot.bone.active) - return; - var frames = this.frames; - if (time < frames[0]) { - switch (blend) { - case MixBlend.setup: - slot.color.setFromColor(slot.data.color); - return; - case MixBlend.first: - var 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; - } - var r = 0, g = 0, b = 0, a = 0; - if (time >= frames[frames.length - ColorTimeline.ENTRIES]) { - var 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 { - var 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]; - var frameTime = frames[frame]; - var 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 { - var 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.ENTRIES = 5; - ColorTimeline.PREV_TIME = -5; - ColorTimeline.PREV_R = -4; - ColorTimeline.PREV_G = -3; - ColorTimeline.PREV_B = -2; - ColorTimeline.PREV_A = -1; - ColorTimeline.R = 1; - ColorTimeline.G = 2; - ColorTimeline.B = 3; - ColorTimeline.A = 4; - return ColorTimeline; - }(CurveTimeline)); - spine.ColorTimeline = ColorTimeline; - var TwoColorTimeline = (function (_super) { - __extends(TwoColorTimeline, _super); - function TwoColorTimeline(frameCount) { - var _this = _super.call(this, frameCount) || this; - _this.frames = spine.Utils.newFloatArray(frameCount * TwoColorTimeline.ENTRIES); - return _this; - } - TwoColorTimeline.prototype.getPropertyId = function () { - return (TimelineType.twoColor << 24) + this.slotIndex; - }; - TwoColorTimeline.prototype.setFrame = function (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; - }; - TwoColorTimeline.prototype.apply = function (skeleton, lastTime, time, events, alpha, blend, direction) { - var slot = skeleton.slots[this.slotIndex]; - if (!slot.bone.active) - return; - var 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: - var 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; - } - var r = 0, g = 0, b = 0, a = 0, r2 = 0, g2 = 0, b2 = 0; - if (time >= frames[frames.length - TwoColorTimeline.ENTRIES]) { - var 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 { - var 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]; - var frameTime = frames[frame]; - var 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 { - var 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.ENTRIES = 8; - TwoColorTimeline.PREV_TIME = -8; - TwoColorTimeline.PREV_R = -7; - TwoColorTimeline.PREV_G = -6; - TwoColorTimeline.PREV_B = -5; - TwoColorTimeline.PREV_A = -4; - TwoColorTimeline.PREV_R2 = -3; - TwoColorTimeline.PREV_G2 = -2; - TwoColorTimeline.PREV_B2 = -1; - TwoColorTimeline.R = 1; - TwoColorTimeline.G = 2; - TwoColorTimeline.B = 3; - TwoColorTimeline.A = 4; - TwoColorTimeline.R2 = 5; - TwoColorTimeline.G2 = 6; - TwoColorTimeline.B2 = 7; - return TwoColorTimeline; - }(CurveTimeline)); - spine.TwoColorTimeline = TwoColorTimeline; - var AttachmentTimeline = (function () { - function AttachmentTimeline(frameCount) { - this.frames = spine.Utils.newFloatArray(frameCount); - this.attachmentNames = new Array(frameCount); - } - AttachmentTimeline.prototype.getPropertyId = function () { - return (TimelineType.attachment << 24) + this.slotIndex; - }; - AttachmentTimeline.prototype.getFrameCount = function () { - return this.frames.length; - }; - AttachmentTimeline.prototype.setFrame = function (frameIndex, time, attachmentName) { - this.frames[frameIndex] = time; - this.attachmentNames[frameIndex] = attachmentName; - }; - AttachmentTimeline.prototype.apply = function (skeleton, lastTime, time, events, alpha, blend, direction) { - var 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; - } - var frames = this.frames; - if (time < frames[0]) { - if (blend == MixBlend.setup || blend == MixBlend.first) - this.setAttachment(skeleton, slot, slot.data.attachmentName); - return; - } - var frameIndex = 0; - if (time >= frames[frames.length - 1]) - frameIndex = frames.length - 1; - else - frameIndex = Animation.binarySearch(frames, time, 1) - 1; - var attachmentName = this.attachmentNames[frameIndex]; - skeleton.slots[this.slotIndex] - .setAttachment(attachmentName == null ? null : skeleton.getAttachment(this.slotIndex, attachmentName)); - }; - AttachmentTimeline.prototype.setAttachment = function (skeleton, slot, attachmentName) { - slot.attachment = attachmentName == null ? null : skeleton.getAttachment(this.slotIndex, attachmentName); - }; - return AttachmentTimeline; - }()); - spine.AttachmentTimeline = AttachmentTimeline; - var zeros = null; - var DeformTimeline = (function (_super) { - __extends(DeformTimeline, _super); - function DeformTimeline(frameCount) { - var _this = _super.call(this, frameCount) || this; - _this.frames = spine.Utils.newFloatArray(frameCount); - _this.frameVertices = new Array(frameCount); - if (zeros == null) - zeros = spine.Utils.newFloatArray(64); - return _this; - } - DeformTimeline.prototype.getPropertyId = function () { - return (TimelineType.deform << 27) + +this.attachment.id + this.slotIndex; - }; - DeformTimeline.prototype.setFrame = function (frameIndex, time, vertices) { - this.frames[frameIndex] = time; - this.frameVertices[frameIndex] = vertices; - }; - DeformTimeline.prototype.apply = function (skeleton, lastTime, time, firedEvents, alpha, blend, direction) { - var slot = skeleton.slots[this.slotIndex]; - if (!slot.bone.active) - return; - var slotAttachment = slot.getAttachment(); - if (!(slotAttachment instanceof spine.VertexAttachment) || !(slotAttachment.deformAttachment == this.attachment)) - return; - var deformArray = slot.deform; - if (deformArray.length == 0) - blend = MixBlend.setup; - var frameVertices = this.frameVertices; - var vertexCount = frameVertices[0].length; - var frames = this.frames; - if (time < frames[0]) { - var vertexAttachment = slotAttachment; - switch (blend) { - case MixBlend.setup: - deformArray.length = 0; - return; - case MixBlend.first: - if (alpha == 1) { - deformArray.length = 0; - break; - } - var deform_1 = spine.Utils.setArraySize(deformArray, vertexCount); - if (vertexAttachment.bones == null) { - var setupVertices = vertexAttachment.vertices; - for (var i = 0; i < vertexCount; i++) - deform_1[i] += (setupVertices[i] - deform_1[i]) * alpha; - } - else { - alpha = 1 - alpha; - for (var i = 0; i < vertexCount; i++) - deform_1[i] *= alpha; - } - } - return; - } - var deform = spine.Utils.setArraySize(deformArray, vertexCount); - if (time >= frames[frames.length - 1]) { - var lastVertices = frameVertices[frames.length - 1]; - if (alpha == 1) { - if (blend == MixBlend.add) { - var vertexAttachment = slotAttachment; - if (vertexAttachment.bones == null) { - var setupVertices = vertexAttachment.vertices; - for (var i_1 = 0; i_1 < vertexCount; i_1++) { - deform[i_1] += lastVertices[i_1] - setupVertices[i_1]; - } - } - else { - for (var i_2 = 0; i_2 < vertexCount; i_2++) - deform[i_2] += lastVertices[i_2]; - } - } - else { - spine.Utils.arrayCopy(lastVertices, 0, deform, 0, vertexCount); - } - } - else { - switch (blend) { - case MixBlend.setup: { - var vertexAttachment_1 = slotAttachment; - if (vertexAttachment_1.bones == null) { - var setupVertices = vertexAttachment_1.vertices; - for (var i_3 = 0; i_3 < vertexCount; i_3++) { - var setup = setupVertices[i_3]; - deform[i_3] = setup + (lastVertices[i_3] - setup) * alpha; - } - } - else { - for (var i_4 = 0; i_4 < vertexCount; i_4++) - deform[i_4] = lastVertices[i_4] * alpha; - } - break; - } - case MixBlend.first: - case MixBlend.replace: - for (var i_5 = 0; i_5 < vertexCount; i_5++) - deform[i_5] += (lastVertices[i_5] - deform[i_5]) * alpha; - break; - case MixBlend.add: - var vertexAttachment = slotAttachment; - if (vertexAttachment.bones == null) { - var setupVertices = vertexAttachment.vertices; - for (var i_6 = 0; i_6 < vertexCount; i_6++) { - deform[i_6] += (lastVertices[i_6] - setupVertices[i_6]) * alpha; - } - } - else { - for (var i_7 = 0; i_7 < vertexCount; i_7++) - deform[i_7] += lastVertices[i_7] * alpha; - } - } - } - return; - } - var frame = Animation.binarySearch(frames, time); - var prevVertices = frameVertices[frame - 1]; - var nextVertices = frameVertices[frame]; - var frameTime = frames[frame]; - var percent = this.getCurvePercent(frame - 1, 1 - (time - frameTime) / (frames[frame - 1] - frameTime)); - if (alpha == 1) { - if (blend == MixBlend.add) { - var vertexAttachment = slotAttachment; - if (vertexAttachment.bones == null) { - var setupVertices = vertexAttachment.vertices; - for (var i_8 = 0; i_8 < vertexCount; i_8++) { - var prev = prevVertices[i_8]; - deform[i_8] += prev + (nextVertices[i_8] - prev) * percent - setupVertices[i_8]; - } - } - else { - for (var i_9 = 0; i_9 < vertexCount; i_9++) { - var prev = prevVertices[i_9]; - deform[i_9] += prev + (nextVertices[i_9] - prev) * percent; - } - } - } - else { - for (var i_10 = 0; i_10 < vertexCount; i_10++) { - var prev = prevVertices[i_10]; - deform[i_10] = prev + (nextVertices[i_10] - prev) * percent; - } - } - } - else { - switch (blend) { - case MixBlend.setup: { - var vertexAttachment_2 = slotAttachment; - if (vertexAttachment_2.bones == null) { - var setupVertices = vertexAttachment_2.vertices; - for (var i_11 = 0; i_11 < vertexCount; i_11++) { - var prev = prevVertices[i_11], setup = setupVertices[i_11]; - deform[i_11] = setup + (prev + (nextVertices[i_11] - prev) * percent - setup) * alpha; - } - } - else { - for (var i_12 = 0; i_12 < vertexCount; i_12++) { - var prev = prevVertices[i_12]; - deform[i_12] = (prev + (nextVertices[i_12] - prev) * percent) * alpha; - } - } - break; - } - case MixBlend.first: - case MixBlend.replace: - for (var i_13 = 0; i_13 < vertexCount; i_13++) { - var prev = prevVertices[i_13]; - deform[i_13] += (prev + (nextVertices[i_13] - prev) * percent - deform[i_13]) * alpha; - } - break; - case MixBlend.add: - var vertexAttachment = slotAttachment; - if (vertexAttachment.bones == null) { - var setupVertices = vertexAttachment.vertices; - for (var i_14 = 0; i_14 < vertexCount; i_14++) { - var prev = prevVertices[i_14]; - deform[i_14] += (prev + (nextVertices[i_14] - prev) * percent - setupVertices[i_14]) * alpha; - } - } - else { - for (var i_15 = 0; i_15 < vertexCount; i_15++) { - var prev = prevVertices[i_15]; - deform[i_15] += (prev + (nextVertices[i_15] - prev) * percent) * alpha; - } - } - } - } - }; - return DeformTimeline; - }(CurveTimeline)); - spine.DeformTimeline = DeformTimeline; - var EventTimeline = (function () { - function EventTimeline(frameCount) { - this.frames = spine.Utils.newFloatArray(frameCount); - this.events = new Array(frameCount); - } - EventTimeline.prototype.getPropertyId = function () { - return TimelineType.event << 24; - }; - EventTimeline.prototype.getFrameCount = function () { - return this.frames.length; - }; - EventTimeline.prototype.setFrame = function (frameIndex, event) { - this.frames[frameIndex] = event.time; - this.events[frameIndex] = event; - }; - EventTimeline.prototype.apply = function (skeleton, lastTime, time, firedEvents, alpha, blend, direction) { - if (firedEvents == null) - return; - var frames = this.frames; - var frameCount = this.frames.length; - if (lastTime > time) { - this.apply(skeleton, lastTime, Number.MAX_VALUE, firedEvents, alpha, blend, direction); - lastTime = -1; - } - else if (lastTime >= frames[frameCount - 1]) - return; - if (time < frames[0]) - return; - var frame = 0; - if (lastTime < frames[0]) - frame = 0; - else { - frame = Animation.binarySearch(frames, lastTime); - var frameTime = frames[frame]; - while (frame > 0) { - if (frames[frame - 1] != frameTime) - break; - frame--; - } - } - for (; frame < frameCount && time >= frames[frame]; frame++) - firedEvents.push(this.events[frame]); - }; - return EventTimeline; - }()); - spine.EventTimeline = EventTimeline; - var DrawOrderTimeline = (function () { - function DrawOrderTimeline(frameCount) { - this.frames = spine.Utils.newFloatArray(frameCount); - this.drawOrders = new Array(frameCount); - } - DrawOrderTimeline.prototype.getPropertyId = function () { - return TimelineType.drawOrder << 24; - }; - DrawOrderTimeline.prototype.getFrameCount = function () { - return this.frames.length; - }; - DrawOrderTimeline.prototype.setFrame = function (frameIndex, time, drawOrder) { - this.frames[frameIndex] = time; - this.drawOrders[frameIndex] = drawOrder; - }; - DrawOrderTimeline.prototype.apply = function (skeleton, lastTime, time, firedEvents, alpha, blend, direction) { - var drawOrder = skeleton.drawOrder; - var slots = skeleton.slots; - if (direction == MixDirection.mixOut) { - if (blend == MixBlend.setup) - spine.Utils.arrayCopy(skeleton.slots, 0, skeleton.drawOrder, 0, skeleton.slots.length); - return; - } - var frames = this.frames; - if (time < frames[0]) { - if (blend == MixBlend.setup || blend == MixBlend.first) - spine.Utils.arrayCopy(skeleton.slots, 0, skeleton.drawOrder, 0, skeleton.slots.length); - return; - } - var frame = 0; - if (time >= frames[frames.length - 1]) - frame = frames.length - 1; - else - frame = Animation.binarySearch(frames, time) - 1; - var drawOrderToSetupIndex = this.drawOrders[frame]; - if (drawOrderToSetupIndex == null) - spine.Utils.arrayCopy(slots, 0, drawOrder, 0, slots.length); - else { - for (var i = 0, n = drawOrderToSetupIndex.length; i < n; i++) - drawOrder[i] = slots[drawOrderToSetupIndex[i]]; - } - }; - return DrawOrderTimeline; - }()); - spine.DrawOrderTimeline = DrawOrderTimeline; - var IkConstraintTimeline = (function (_super) { - __extends(IkConstraintTimeline, _super); - function IkConstraintTimeline(frameCount) { - var _this = _super.call(this, frameCount) || this; - _this.frames = spine.Utils.newFloatArray(frameCount * IkConstraintTimeline.ENTRIES); - return _this; - } - IkConstraintTimeline.prototype.getPropertyId = function () { - return (TimelineType.ikConstraint << 24) + this.ikConstraintIndex; - }; - IkConstraintTimeline.prototype.setFrame = function (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; - }; - IkConstraintTimeline.prototype.apply = function (skeleton, lastTime, time, firedEvents, alpha, blend, direction) { - var frames = this.frames; - var 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]) { - 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; - } - var frame = Animation.binarySearch(frames, time, IkConstraintTimeline.ENTRIES); - var mix = frames[frame + IkConstraintTimeline.PREV_MIX]; - var softness = frames[frame + IkConstraintTimeline.PREV_SOFTNESS]; - var frameTime = frames[frame]; - var 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.ENTRIES = 6; - IkConstraintTimeline.PREV_TIME = -6; - IkConstraintTimeline.PREV_MIX = -5; - IkConstraintTimeline.PREV_SOFTNESS = -4; - IkConstraintTimeline.PREV_BEND_DIRECTION = -3; - IkConstraintTimeline.PREV_COMPRESS = -2; - IkConstraintTimeline.PREV_STRETCH = -1; - IkConstraintTimeline.MIX = 1; - IkConstraintTimeline.SOFTNESS = 2; - IkConstraintTimeline.BEND_DIRECTION = 3; - IkConstraintTimeline.COMPRESS = 4; - IkConstraintTimeline.STRETCH = 5; - return IkConstraintTimeline; - }(CurveTimeline)); - spine.IkConstraintTimeline = IkConstraintTimeline; - var TransformConstraintTimeline = (function (_super) { - __extends(TransformConstraintTimeline, _super); - function TransformConstraintTimeline(frameCount) { - var _this = _super.call(this, frameCount) || this; - _this.frames = spine.Utils.newFloatArray(frameCount * TransformConstraintTimeline.ENTRIES); - return _this; - } - TransformConstraintTimeline.prototype.getPropertyId = function () { - return (TimelineType.transformConstraint << 24) + this.transformConstraintIndex; - }; - TransformConstraintTimeline.prototype.setFrame = function (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; - }; - TransformConstraintTimeline.prototype.apply = function (skeleton, lastTime, time, firedEvents, alpha, blend, direction) { - var frames = this.frames; - var constraint = skeleton.transformConstraints[this.transformConstraintIndex]; - if (!constraint.active) - return; - if (time < frames[0]) { - var 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; - } - var rotate = 0, translate = 0, scale = 0, shear = 0; - if (time >= frames[frames.length - TransformConstraintTimeline.ENTRIES]) { - var 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 { - var 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]; - var frameTime = frames[frame]; - var 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) { - var 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.ENTRIES = 5; - TransformConstraintTimeline.PREV_TIME = -5; - TransformConstraintTimeline.PREV_ROTATE = -4; - TransformConstraintTimeline.PREV_TRANSLATE = -3; - TransformConstraintTimeline.PREV_SCALE = -2; - TransformConstraintTimeline.PREV_SHEAR = -1; - TransformConstraintTimeline.ROTATE = 1; - TransformConstraintTimeline.TRANSLATE = 2; - TransformConstraintTimeline.SCALE = 3; - TransformConstraintTimeline.SHEAR = 4; - return TransformConstraintTimeline; - }(CurveTimeline)); - spine.TransformConstraintTimeline = TransformConstraintTimeline; - var PathConstraintPositionTimeline = (function (_super) { - __extends(PathConstraintPositionTimeline, _super); - function PathConstraintPositionTimeline(frameCount) { - var _this = _super.call(this, frameCount) || this; - _this.frames = spine.Utils.newFloatArray(frameCount * PathConstraintPositionTimeline.ENTRIES); - return _this; - } - PathConstraintPositionTimeline.prototype.getPropertyId = function () { - return (TimelineType.pathConstraintPosition << 24) + this.pathConstraintIndex; - }; - PathConstraintPositionTimeline.prototype.setFrame = function (frameIndex, time, value) { - frameIndex *= PathConstraintPositionTimeline.ENTRIES; - this.frames[frameIndex] = time; - this.frames[frameIndex + PathConstraintPositionTimeline.VALUE] = value; - }; - PathConstraintPositionTimeline.prototype.apply = function (skeleton, lastTime, time, firedEvents, alpha, blend, direction) { - var frames = this.frames; - var 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; - } - var position = 0; - if (time >= frames[frames.length - PathConstraintPositionTimeline.ENTRIES]) - position = frames[frames.length + PathConstraintPositionTimeline.PREV_VALUE]; - else { - var frame = Animation.binarySearch(frames, time, PathConstraintPositionTimeline.ENTRIES); - position = frames[frame + PathConstraintPositionTimeline.PREV_VALUE]; - var frameTime = frames[frame]; - var 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.ENTRIES = 2; - PathConstraintPositionTimeline.PREV_TIME = -2; - PathConstraintPositionTimeline.PREV_VALUE = -1; - PathConstraintPositionTimeline.VALUE = 1; - return PathConstraintPositionTimeline; - }(CurveTimeline)); - spine.PathConstraintPositionTimeline = PathConstraintPositionTimeline; - var PathConstraintSpacingTimeline = (function (_super) { - __extends(PathConstraintSpacingTimeline, _super); - function PathConstraintSpacingTimeline(frameCount) { - return _super.call(this, frameCount) || this; - } - PathConstraintSpacingTimeline.prototype.getPropertyId = function () { - return (TimelineType.pathConstraintSpacing << 24) + this.pathConstraintIndex; - }; - PathConstraintSpacingTimeline.prototype.apply = function (skeleton, lastTime, time, firedEvents, alpha, blend, direction) { - var frames = this.frames; - var 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; - } - var spacing = 0; - if (time >= frames[frames.length - PathConstraintSpacingTimeline.ENTRIES]) - spacing = frames[frames.length + PathConstraintSpacingTimeline.PREV_VALUE]; - else { - var frame = Animation.binarySearch(frames, time, PathConstraintSpacingTimeline.ENTRIES); - spacing = frames[frame + PathConstraintSpacingTimeline.PREV_VALUE]; - var frameTime = frames[frame]; - var 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; - }; - return PathConstraintSpacingTimeline; - }(PathConstraintPositionTimeline)); - spine.PathConstraintSpacingTimeline = PathConstraintSpacingTimeline; - var PathConstraintMixTimeline = (function (_super) { - __extends(PathConstraintMixTimeline, _super); - function PathConstraintMixTimeline(frameCount) { - var _this = _super.call(this, frameCount) || this; - _this.frames = spine.Utils.newFloatArray(frameCount * PathConstraintMixTimeline.ENTRIES); - return _this; - } - PathConstraintMixTimeline.prototype.getPropertyId = function () { - return (TimelineType.pathConstraintMix << 24) + this.pathConstraintIndex; - }; - PathConstraintMixTimeline.prototype.setFrame = function (frameIndex, time, rotateMix, translateMix) { - frameIndex *= PathConstraintMixTimeline.ENTRIES; - this.frames[frameIndex] = time; - this.frames[frameIndex + PathConstraintMixTimeline.ROTATE] = rotateMix; - this.frames[frameIndex + PathConstraintMixTimeline.TRANSLATE] = translateMix; - }; - PathConstraintMixTimeline.prototype.apply = function (skeleton, lastTime, time, firedEvents, alpha, blend, direction) { - var frames = this.frames; - var 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; - } - var rotate = 0, translate = 0; - if (time >= frames[frames.length - PathConstraintMixTimeline.ENTRIES]) { - rotate = frames[frames.length + PathConstraintMixTimeline.PREV_ROTATE]; - translate = frames[frames.length + PathConstraintMixTimeline.PREV_TRANSLATE]; - } - else { - var frame = Animation.binarySearch(frames, time, PathConstraintMixTimeline.ENTRIES); - rotate = frames[frame + PathConstraintMixTimeline.PREV_ROTATE]; - translate = frames[frame + PathConstraintMixTimeline.PREV_TRANSLATE]; - var frameTime = frames[frame]; - var 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.ENTRIES = 3; - PathConstraintMixTimeline.PREV_TIME = -3; - PathConstraintMixTimeline.PREV_ROTATE = -2; - PathConstraintMixTimeline.PREV_TRANSLATE = -1; - PathConstraintMixTimeline.ROTATE = 1; - PathConstraintMixTimeline.TRANSLATE = 2; - return PathConstraintMixTimeline; - }(CurveTimeline)); - spine.PathConstraintMixTimeline = PathConstraintMixTimeline; -})(spine || (spine = {})); -var spine; -(function (spine) { - var AnimationState = (function () { - function AnimationState(data) { - this.tracks = new Array(); - this.timeScale = 1; - this.unkeyedState = 0; - this.events = new Array(); - this.listeners = new Array(); - this.queue = new EventQueue(this); - this.propertyIDs = new spine.IntSet(); - this.animationsChanged = false; - this.trackEntryPool = new spine.Pool(function () { return new TrackEntry(); }); - this.data = data; - } - AnimationState.prototype.update = function (delta) { - delta *= this.timeScale; - var tracks = this.tracks; - for (var i = 0, n = tracks.length; i < n; i++) { - var current = tracks[i]; - if (current == null) - continue; - current.animationLast = current.nextAnimationLast; - current.trackLast = current.nextTrackLast; - var currentDelta = delta * current.timeScale; - if (current.delay > 0) { - current.delay -= currentDelta; - if (current.delay > 0) - continue; - currentDelta = -current.delay; - current.delay = 0; - } - var next = current.next; - if (next != null) { - var 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)) { - var 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(); - }; - AnimationState.prototype.updateMixingFrom = function (to, delta) { - var from = to.mixingFrom; - if (from == null) - return true; - var finished = this.updateMixingFrom(from, delta); - from.animationLast = from.nextAnimationLast; - from.trackLast = from.nextTrackLast; - if (to.mixTime > 0 && to.mixTime >= to.mixDuration) { - 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; - }; - AnimationState.prototype.apply = function (skeleton) { - if (skeleton == null) - throw new Error("skeleton cannot be null."); - if (this.animationsChanged) - this._animationsChanged(); - var events = this.events; - var tracks = this.tracks; - var applied = false; - for (var i_16 = 0, n_1 = tracks.length; i_16 < n_1; i_16++) { - var current = tracks[i_16]; - if (current == null || current.delay > 0) - continue; - applied = true; - var blend = i_16 == 0 ? spine.MixBlend.first : current.mixBlend; - var mix = current.alpha; - if (current.mixingFrom != null) - mix *= this.applyMixingFrom(current, skeleton, blend); - else if (current.trackTime >= current.trackEnd && current.next == null) - mix = 0; - var animationLast = current.animationLast, animationTime = current.getAnimationTime(); - var timelineCount = current.animation.timelines.length; - var timelines = current.animation.timelines; - if ((i_16 == 0 && mix == 1) || blend == spine.MixBlend.add) { - for (var ii = 0; ii < timelineCount; ii++) { - spine.Utils.webkit602BugfixHelper(mix, blend); - var timeline = timelines[ii]; - if (timeline instanceof spine.AttachmentTimeline) - this.applyAttachmentTimeline(timeline, skeleton, animationTime, blend, true); - else - timeline.apply(skeleton, animationLast, animationTime, events, mix, blend, spine.MixDirection.mixIn); - } - } - else { - var timelineMode = current.timelineMode; - var firstFrame = current.timelinesRotation.length == 0; - if (firstFrame) - spine.Utils.setArraySize(current.timelinesRotation, timelineCount << 1, null); - var timelinesRotation = current.timelinesRotation; - for (var ii = 0; ii < timelineCount; ii++) { - var timeline_1 = timelines[ii]; - var timelineBlend = timelineMode[ii] == AnimationState.SUBSEQUENT ? blend : spine.MixBlend.setup; - if (timeline_1 instanceof spine.RotateTimeline) { - this.applyRotateTimeline(timeline_1, skeleton, animationTime, mix, timelineBlend, timelinesRotation, ii << 1, firstFrame); - } - else if (timeline_1 instanceof spine.AttachmentTimeline) { - this.applyAttachmentTimeline(timeline_1, skeleton, animationTime, blend, true); - } - else { - spine.Utils.webkit602BugfixHelper(mix, blend); - timeline_1.apply(skeleton, animationLast, animationTime, events, mix, timelineBlend, spine.MixDirection.mixIn); - } - } - } - this.queueEvents(current, animationTime); - events.length = 0; - current.nextAnimationLast = animationTime; - current.nextTrackLast = current.trackTime; - } - 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.attachment = (attachmentName == null ? null : skeleton.getAttachment(slot.data.index, attachmentName)); - } - } - this.unkeyedState += 2; - this.queue.drain(); - return applied; - }; - AnimationState.prototype.applyMixingFrom = function (to, skeleton, blend) { - var from = to.mixingFrom; - if (from.mixingFrom != null) - this.applyMixingFrom(from, skeleton, blend); - var mix = 0; - if (to.mixDuration == 0) { - mix = 1; - if (blend == spine.MixBlend.first) - blend = spine.MixBlend.setup; - } - else { - mix = to.mixTime / to.mixDuration; - if (mix > 1) - mix = 1; - if (blend != spine.MixBlend.first) - blend = from.mixBlend; - } - var events = mix < from.eventThreshold ? this.events : null; - var attachments = mix < from.attachmentThreshold, drawOrder = mix < from.drawOrderThreshold; - var animationLast = from.animationLast, animationTime = from.getAnimationTime(); - var timelineCount = from.animation.timelines.length; - var timelines = from.animation.timelines; - var alphaHold = from.alpha * to.interruptAlpha, alphaMix = alphaHold * (1 - mix); - if (blend == spine.MixBlend.add) { - for (var i = 0; i < timelineCount; i++) - timelines[i].apply(skeleton, animationLast, animationTime, events, alphaMix, blend, spine.MixDirection.mixOut); - } - else { - var timelineMode = from.timelineMode; - var timelineHoldMix = from.timelineHoldMix; - var firstFrame = from.timelinesRotation.length == 0; - if (firstFrame) - spine.Utils.setArraySize(from.timelinesRotation, timelineCount << 1, null); - var timelinesRotation = from.timelinesRotation; - from.totalAlpha = 0; - for (var i = 0; i < timelineCount; i++) { - var timeline = timelines[i]; - var direction = spine.MixDirection.mixOut; - var timelineBlend = void 0; - var alpha = 0; - switch (timelineMode[i]) { - case AnimationState.SUBSEQUENT: - if (!drawOrder && timeline instanceof spine.DrawOrderTimeline) - continue; - timelineBlend = blend; - alpha = alphaMix; - break; - case AnimationState.FIRST: - timelineBlend = spine.MixBlend.setup; - alpha = alphaMix; - break; - case AnimationState.HOLD_SUBSEQUENT: - timelineBlend = blend; - alpha = alphaHold; - break; - case AnimationState.HOLD_FIRST: - timelineBlend = spine.MixBlend.setup; - alpha = alphaHold; - break; - default: - timelineBlend = spine.MixBlend.setup; - var holdMix = timelineHoldMix[i]; - alpha = alphaHold * Math.max(0, 1 - holdMix.mixTime / holdMix.mixDuration); - break; - } - from.totalAlpha += alpha; - if (timeline instanceof spine.RotateTimeline) - this.applyRotateTimeline(timeline, skeleton, animationTime, alpha, timelineBlend, timelinesRotation, i << 1, firstFrame); - else if (timeline instanceof spine.AttachmentTimeline) - this.applyAttachmentTimeline(timeline, skeleton, animationTime, timelineBlend, attachments); - else { - spine.Utils.webkit602BugfixHelper(alpha, blend); - if (drawOrder && timeline instanceof spine.DrawOrderTimeline && timelineBlend == spine.MixBlend.setup) - direction = spine.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; - }; - AnimationState.prototype.applyAttachmentTimeline = function (timeline, skeleton, time, blend, attachments) { - var slot = skeleton.slots[timeline.slotIndex]; - if (!slot.bone.active) - return; - var frames = timeline.frames; - if (time < frames[0]) { - if (blend == spine.MixBlend.setup || blend == spine.MixBlend.first) - this.setAttachment(skeleton, slot, slot.data.attachmentName, attachments); - } - else { - var frameIndex; - if (time >= frames[frames.length - 1]) - frameIndex = frames.length - 1; - else - frameIndex = spine.Animation.binarySearch(frames, time) - 1; - this.setAttachment(skeleton, slot, timeline.attachmentNames[frameIndex], attachments); - } - if (slot.attachmentState <= this.unkeyedState) - slot.attachmentState = this.unkeyedState + AnimationState.SETUP; - }; - AnimationState.prototype.setAttachment = function (skeleton, slot, attachmentName, attachments) { - slot.attachment = attachmentName == null ? null : skeleton.getAttachment(slot.data.index, attachmentName); - if (attachments) - slot.attachmentState = this.unkeyedState + AnimationState.CURRENT; - }; - AnimationState.prototype.applyRotateTimeline = function (timeline, skeleton, time, alpha, blend, timelinesRotation, i, firstFrame) { - if (firstFrame) - timelinesRotation[i] = 0; - if (alpha == 1) { - timeline.apply(skeleton, 0, time, null, 1, blend, spine.MixDirection.mixIn); - return; - } - var rotateTimeline = timeline; - var frames = rotateTimeline.frames; - var bone = skeleton.bones[rotateTimeline.boneIndex]; - if (!bone.active) - return; - var r1 = 0, r2 = 0; - if (time < frames[0]) { - switch (blend) { - case spine.MixBlend.setup: - bone.rotation = bone.data.rotation; - default: - return; - case spine.MixBlend.first: - r1 = bone.rotation; - r2 = bone.data.rotation; - } - } - else { - r1 = blend == spine.MixBlend.setup ? bone.data.rotation : bone.rotation; - if (time >= frames[frames.length - spine.RotateTimeline.ENTRIES]) - r2 = bone.data.rotation + frames[frames.length + spine.RotateTimeline.PREV_ROTATION]; - else { - var frame = spine.Animation.binarySearch(frames, time, spine.RotateTimeline.ENTRIES); - var prevRotation = frames[frame + spine.RotateTimeline.PREV_ROTATION]; - var frameTime = frames[frame]; - var percent = rotateTimeline.getCurvePercent((frame >> 1) - 1, 1 - (time - frameTime) / (frames[frame + spine.RotateTimeline.PREV_TIME] - frameTime)); - r2 = frames[frame + spine.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; - } - } - var total = 0, diff = r2 - r1; - diff -= (16384 - ((16384.499999999996 - diff / 360) | 0)) * 360; - if (diff == 0) { - total = timelinesRotation[i]; - } - else { - var lastTotal = 0, lastDiff = 0; - if (firstFrame) { - lastTotal = 0; - lastDiff = diff; - } - else { - lastTotal = timelinesRotation[i]; - lastDiff = timelinesRotation[i + 1]; - } - var current = diff > 0, dir = lastTotal >= 0; - if (spine.MathUtils.signum(lastDiff) != spine.MathUtils.signum(diff) && Math.abs(lastDiff) <= 90) { - if (Math.abs(lastTotal) > 180) - lastTotal += 360 * spine.MathUtils.signum(lastTotal); - dir = current; - } - total = diff + lastTotal - lastTotal % 360; - if (dir != current) - total += 360 * spine.MathUtils.signum(lastTotal); - timelinesRotation[i] = total; - } - timelinesRotation[i + 1] = diff; - r1 += total * alpha; - bone.rotation = r1 - (16384 - ((16384.499999999996 - r1 / 360) | 0)) * 360; - }; - AnimationState.prototype.queueEvents = function (entry, animationTime) { - var animationStart = entry.animationStart, animationEnd = entry.animationEnd; - var duration = animationEnd - animationStart; - var trackLastWrapped = entry.trackLast % duration; - var events = this.events; - var i = 0, n = events.length; - for (; i < n; i++) { - var event_1 = events[i]; - if (event_1.time < trackLastWrapped) - break; - if (event_1.time > animationEnd) - continue; - this.queue.event(entry, event_1); - } - var 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); - for (; i < n; i++) { - var event_2 = events[i]; - if (event_2.time < animationStart) - continue; - this.queue.event(entry, events[i]); - } - }; - AnimationState.prototype.clearTracks = function () { - var oldDrainDisabled = this.queue.drainDisabled; - this.queue.drainDisabled = true; - for (var i = 0, n = this.tracks.length; i < n; i++) - this.clearTrack(i); - this.tracks.length = 0; - this.queue.drainDisabled = oldDrainDisabled; - this.queue.drain(); - }; - AnimationState.prototype.clearTrack = function (trackIndex) { - if (trackIndex >= this.tracks.length) - return; - var current = this.tracks[trackIndex]; - if (current == null) - return; - this.queue.end(current); - this.disposeNext(current); - var entry = current; - while (true) { - var 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(); - }; - AnimationState.prototype.setCurrent = function (index, current, interrupt) { - var 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; - if (from.mixingFrom != null && from.mixDuration > 0) - current.interruptAlpha *= Math.min(1, from.mixTime / from.mixDuration); - from.timelinesRotation.length = 0; - } - this.queue.start(current); - }; - AnimationState.prototype.setAnimation = function (trackIndex, animationName, loop) { - var animation = this.data.skeletonData.findAnimation(animationName); - if (animation == null) - throw new Error("Animation not found: " + animationName); - return this.setAnimationWith(trackIndex, animation, loop); - }; - AnimationState.prototype.setAnimationWith = function (trackIndex, animation, loop) { - if (animation == null) - throw new Error("animation cannot be null."); - var interrupt = true; - var current = this.expandToIndex(trackIndex); - if (current != null) { - if (current.nextTrackLast == -1) { - 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); - } - var entry = this.trackEntry(trackIndex, animation, loop, current); - this.setCurrent(trackIndex, entry, interrupt); - this.queue.drain(); - return entry; - }; - AnimationState.prototype.addAnimation = function (trackIndex, animationName, loop, delay) { - var animation = this.data.skeletonData.findAnimation(animationName); - if (animation == null) - throw new Error("Animation not found: " + animationName); - return this.addAnimationWith(trackIndex, animation, loop, delay); - }; - AnimationState.prototype.addAnimationWith = function (trackIndex, animation, loop, delay) { - if (animation == null) - throw new Error("animation cannot be null."); - var last = this.expandToIndex(trackIndex); - if (last != null) { - while (last.next != null) - last = last.next; - } - var 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) { - var 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; - }; - AnimationState.prototype.setEmptyAnimation = function (trackIndex, mixDuration) { - var entry = this.setAnimationWith(trackIndex, AnimationState.emptyAnimation, false); - entry.mixDuration = mixDuration; - entry.trackEnd = mixDuration; - return entry; - }; - AnimationState.prototype.addEmptyAnimation = function (trackIndex, mixDuration, delay) { - if (delay <= 0) - delay -= mixDuration; - var entry = this.addAnimationWith(trackIndex, AnimationState.emptyAnimation, false, delay); - entry.mixDuration = mixDuration; - entry.trackEnd = mixDuration; - return entry; - }; - AnimationState.prototype.setEmptyAnimations = function (mixDuration) { - var oldDrainDisabled = this.queue.drainDisabled; - this.queue.drainDisabled = true; - for (var i = 0, n = this.tracks.length; i < n; i++) { - var current = this.tracks[i]; - if (current != null) - this.setEmptyAnimation(current.trackIndex, mixDuration); - } - this.queue.drainDisabled = oldDrainDisabled; - this.queue.drain(); - }; - AnimationState.prototype.expandToIndex = function (index) { - if (index < this.tracks.length) - return this.tracks[index]; - spine.Utils.ensureArrayCapacity(this.tracks, index + 1, null); - this.tracks.length = index + 1; - return null; - }; - AnimationState.prototype.trackEntry = function (trackIndex, animation, loop, last) { - var 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 = spine.MixBlend.replace; - return entry; - }; - AnimationState.prototype.disposeNext = function (entry) { - var next = entry.next; - while (next != null) { - this.queue.dispose(next); - next = next.next; - } - entry.next = null; - }; - AnimationState.prototype._animationsChanged = function () { - this.animationsChanged = false; - this.propertyIDs.clear(); - for (var i = 0, n = this.tracks.length; i < n; i++) { - var entry = this.tracks[i]; - if (entry == null) - continue; - while (entry.mixingFrom != null) - entry = entry.mixingFrom; - do { - if (entry.mixingFrom == null || entry.mixBlend != spine.MixBlend.add) - this.computeHold(entry); - entry = entry.mixingTo; - } while (entry != null); - } - }; - AnimationState.prototype.computeHold = function (entry) { - var to = entry.mixingTo; - var timelines = entry.animation.timelines; - var timelinesCount = entry.animation.timelines.length; - var timelineMode = spine.Utils.setArraySize(entry.timelineMode, timelinesCount); - entry.timelineHoldMix.length = 0; - var timelineDipMix = spine.Utils.setArraySize(entry.timelineHoldMix, timelinesCount); - var propertyIDs = this.propertyIDs; - if (to != null && to.holdPrevious) { - for (var i = 0; i < timelinesCount; i++) { - timelineMode[i] = propertyIDs.add(timelines[i].getPropertyId()) ? AnimationState.HOLD_FIRST : AnimationState.HOLD_SUBSEQUENT; - } - return; - } - outer: for (var i = 0; i < timelinesCount; i++) { - var timeline = timelines[i]; - var id = timeline.getPropertyId(); - if (!propertyIDs.add(id)) - timelineMode[i] = AnimationState.SUBSEQUENT; - else if (to == null || timeline instanceof spine.AttachmentTimeline || timeline instanceof spine.DrawOrderTimeline - || timeline instanceof spine.EventTimeline || !to.animation.hasTimeline(id)) { - timelineMode[i] = AnimationState.FIRST; - } - else { - for (var 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; - } - } - }; - AnimationState.prototype.getCurrent = function (trackIndex) { - if (trackIndex >= this.tracks.length) - return null; - return this.tracks[trackIndex]; - }; - AnimationState.prototype.addListener = function (listener) { - if (listener == null) - throw new Error("listener cannot be null."); - this.listeners.push(listener); - }; - AnimationState.prototype.removeListener = function (listener) { - var index = this.listeners.indexOf(listener); - if (index >= 0) - this.listeners.splice(index, 1); - }; - AnimationState.prototype.clearListeners = function () { - this.listeners.length = 0; - }; - AnimationState.prototype.clearListenerNotifications = function () { - this.queue.clear(); - }; - AnimationState.emptyAnimation = new spine.Animation("", [], 0); - AnimationState.SUBSEQUENT = 0; - AnimationState.FIRST = 1; - AnimationState.HOLD_SUBSEQUENT = 2; - AnimationState.HOLD_FIRST = 3; - AnimationState.HOLD_MIX = 4; - AnimationState.SETUP = 1; - AnimationState.CURRENT = 2; - return AnimationState; - }()); - spine.AnimationState = AnimationState; - var TrackEntry = (function () { - function TrackEntry() { - this.mixBlend = spine.MixBlend.replace; - this.timelineMode = new Array(); - this.timelineHoldMix = new Array(); - this.timelinesRotation = new Array(); - } - TrackEntry.prototype.reset = function () { - 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; - }; - TrackEntry.prototype.getAnimationTime = function () { - if (this.loop) { - var 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); - }; - TrackEntry.prototype.setAnimationLast = function (animationLast) { - this.animationLast = animationLast; - this.nextAnimationLast = animationLast; - }; - TrackEntry.prototype.isComplete = function () { - return this.trackTime >= this.animationEnd - this.animationStart; - }; - TrackEntry.prototype.resetRotationDirections = function () { - this.timelinesRotation.length = 0; - }; - return TrackEntry; - }()); - spine.TrackEntry = TrackEntry; - var EventQueue = (function () { - function EventQueue(animState) { - this.objects = []; - this.drainDisabled = false; - this.animState = animState; - } - EventQueue.prototype.start = function (entry) { - this.objects.push(EventType.start); - this.objects.push(entry); - this.animState.animationsChanged = true; - }; - EventQueue.prototype.interrupt = function (entry) { - this.objects.push(EventType.interrupt); - this.objects.push(entry); - }; - EventQueue.prototype.end = function (entry) { - this.objects.push(EventType.end); - this.objects.push(entry); - this.animState.animationsChanged = true; - }; - EventQueue.prototype.dispose = function (entry) { - this.objects.push(EventType.dispose); - this.objects.push(entry); - }; - EventQueue.prototype.complete = function (entry) { - this.objects.push(EventType.complete); - this.objects.push(entry); - }; - EventQueue.prototype.event = function (entry, event) { - this.objects.push(EventType.event); - this.objects.push(entry); - this.objects.push(event); - }; - EventQueue.prototype.drain = function () { - if (this.drainDisabled) - return; - this.drainDisabled = true; - var objects = this.objects; - var listeners = this.animState.listeners; - for (var i = 0; i < objects.length; i += 2) { - var type = objects[i]; - var entry = objects[i + 1]; - switch (type) { - case EventType.start: - if (entry.listener != null && entry.listener.start) - entry.listener.start(entry); - for (var ii = 0; ii < listeners.length; ii++) - if (listeners[ii].start) - listeners[ii].start(entry); - break; - case EventType.interrupt: - if (entry.listener != null && entry.listener.interrupt) - entry.listener.interrupt(entry); - for (var 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 (var ii = 0; ii < listeners.length; ii++) - if (listeners[ii].end) - listeners[ii].end(entry); - case EventType.dispose: - if (entry.listener != null && entry.listener.dispose) - entry.listener.dispose(entry); - for (var 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 (var ii = 0; ii < listeners.length; ii++) - if (listeners[ii].complete) - listeners[ii].complete(entry); - break; - case EventType.event: - var event_3 = objects[i++ + 2]; - if (entry.listener != null && entry.listener.event) - entry.listener.event(entry, event_3); - for (var ii = 0; ii < listeners.length; ii++) - if (listeners[ii].event) - listeners[ii].event(entry, event_3); - break; - } - } - this.clear(); - this.drainDisabled = false; - }; - EventQueue.prototype.clear = function () { - this.objects.length = 0; - }; - return EventQueue; - }()); - spine.EventQueue = EventQueue; - var EventType; - (function (EventType) { - EventType[EventType["start"] = 0] = "start"; - EventType[EventType["interrupt"] = 1] = "interrupt"; - EventType[EventType["end"] = 2] = "end"; - EventType[EventType["dispose"] = 3] = "dispose"; - EventType[EventType["complete"] = 4] = "complete"; - EventType[EventType["event"] = 5] = "event"; - })(EventType = spine.EventType || (spine.EventType = {})); - var AnimationStateAdapter = (function () { - function AnimationStateAdapter() { - } - AnimationStateAdapter.prototype.start = function (entry) { - }; - AnimationStateAdapter.prototype.interrupt = function (entry) { - }; - AnimationStateAdapter.prototype.end = function (entry) { - }; - AnimationStateAdapter.prototype.dispose = function (entry) { - }; - AnimationStateAdapter.prototype.complete = function (entry) { - }; - AnimationStateAdapter.prototype.event = function (entry, event) { - }; - return AnimationStateAdapter; - }()); - spine.AnimationStateAdapter = AnimationStateAdapter; -})(spine || (spine = {})); -var spine; -(function (spine) { - var AnimationStateData = (function () { - function AnimationStateData(skeletonData) { - this.animationToMixTime = {}; - this.defaultMix = 0; - if (skeletonData == null) - throw new Error("skeletonData cannot be null."); - this.skeletonData = skeletonData; - } - AnimationStateData.prototype.setMix = function (fromName, toName, duration) { - var from = this.skeletonData.findAnimation(fromName); - if (from == null) - throw new Error("Animation not found: " + fromName); - var to = this.skeletonData.findAnimation(toName); - if (to == null) - throw new Error("Animation not found: " + toName); - this.setMixWith(from, to, duration); - }; - AnimationStateData.prototype.setMixWith = function (from, to, duration) { - if (from == null) - throw new Error("from cannot be null."); - if (to == null) - throw new Error("to cannot be null."); - var key = from.name + "." + to.name; - this.animationToMixTime[key] = duration; - }; - AnimationStateData.prototype.getMix = function (from, to) { - var key = from.name + "." + to.name; - var value = this.animationToMixTime[key]; - return value === undefined ? this.defaultMix : value; - }; - return AnimationStateData; - }()); - spine.AnimationStateData = AnimationStateData; -})(spine || (spine = {})); -var spine; -(function (spine) { - var AssetManager = (function () { - function AssetManager(textureLoader, pathPrefix) { - if (pathPrefix === void 0) { pathPrefix = ""; } - this.assets = {}; - this.errors = {}; - this.toLoad = 0; - this.loaded = 0; - this.rawDataUris = {}; - this.textureLoader = textureLoader; - this.pathPrefix = pathPrefix; - } - AssetManager.prototype.downloadText = function (url, success, error) { - var request = new XMLHttpRequest(); - request.overrideMimeType("text/html"); - if (this.rawDataUris[url]) - url = this.rawDataUris[url]; - request.open("GET", url, true); - request.onload = function () { - if (request.status == 200) { - success(request.responseText); - } - else { - error(request.status, request.responseText); - } - }; - request.onerror = function () { - error(request.status, request.responseText); - }; - request.send(); - }; - AssetManager.prototype.downloadBinary = function (url, success, error) { - var request = new XMLHttpRequest(); - if (this.rawDataUris[url]) - url = this.rawDataUris[url]; - request.open("GET", url, true); - request.responseType = "arraybuffer"; - request.onload = function () { - if (request.status == 200) { - success(new Uint8Array(request.response)); - } - else { - error(request.status, request.responseText); - } - }; - request.onerror = function () { - error(request.status, request.responseText); - }; - request.send(); - }; - AssetManager.prototype.setRawDataURI = function (path, data) { - this.rawDataUris[this.pathPrefix + path] = data; - }; - AssetManager.prototype.loadBinary = function (path, success, error) { - var _this = this; - if (success === void 0) { success = null; } - if (error === void 0) { error = null; } - path = this.pathPrefix + path; - this.toLoad++; - this.downloadBinary(path, function (data) { - _this.assets[path] = data; - if (success) - success(path, data); - _this.toLoad--; - _this.loaded++; - }, function (state, responseText) { - _this.errors[path] = "Couldn't load binary " + path + ": status " + status + ", " + responseText; - if (error) - error(path, "Couldn't load binary " + path + ": status " + status + ", " + responseText); - _this.toLoad--; - _this.loaded++; - }); - }; - AssetManager.prototype.loadText = function (path, success, error) { - var _this = this; - if (success === void 0) { success = null; } - if (error === void 0) { error = null; } - path = this.pathPrefix + path; - this.toLoad++; - this.downloadText(path, function (data) { - _this.assets[path] = data; - if (success) - success(path, data); - _this.toLoad--; - _this.loaded++; - }, function (state, responseText) { - _this.errors[path] = "Couldn't load text " + path + ": status " + status + ", " + responseText; - if (error) - error(path, "Couldn't load text " + path + ": status " + status + ", " + responseText); - _this.toLoad--; - _this.loaded++; - }); - }; - AssetManager.prototype.loadTexture = function (path, success, error) { - var _this = this; - if (success === void 0) { success = null; } - if (error === void 0) { error = null; } - path = this.pathPrefix + path; - var storagePath = path; - this.toLoad++; - var img = new Image(); - img.crossOrigin = "anonymous"; - img.onload = function (ev) { - var texture = _this.textureLoader(img); - _this.assets[storagePath] = texture; - _this.toLoad--; - _this.loaded++; - if (success) - success(path, img); - }; - img.onerror = function (ev) { - _this.errors[path] = "Couldn't load image " + path; - _this.toLoad--; - _this.loaded++; - if (error) - error(path, "Couldn't load image " + path); - }; - if (this.rawDataUris[path]) - path = this.rawDataUris[path]; - img.src = path; - }; - AssetManager.prototype.loadTextureAtlas = function (path, success, error) { - var _this = this; - if (success === void 0) { success = null; } - if (error === void 0) { error = null; } - var parent = path.lastIndexOf("/") >= 0 ? path.substring(0, path.lastIndexOf("/")) : ""; - path = this.pathPrefix + path; - this.toLoad++; - this.downloadText(path, function (atlasData) { - var pagesLoaded = { count: 0 }; - var atlasPages = new Array(); - try { - var atlas = new spine.TextureAtlas(atlasData, function (path) { - atlasPages.push(parent == "" ? path : parent + "/" + path); - var image = document.createElement("img"); - image.width = 16; - image.height = 16; - return new spine.FakeTexture(image); - }); - } - catch (e) { - var ex = e; - _this.errors[path] = "Couldn't load texture atlas " + path + ": " + ex.message; - if (error) - error(path, "Couldn't load texture atlas " + path + ": " + ex.message); - _this.toLoad--; - _this.loaded++; - return; - } - var _loop_1 = function (atlasPage) { - var pageLoadError = false; - _this.loadTexture(atlasPage, function (imagePath, image) { - pagesLoaded.count++; - if (pagesLoaded.count == atlasPages.length) { - if (!pageLoadError) { - try { - var atlas = new spine.TextureAtlas(atlasData, function (path) { - return _this.get(parent == "" ? path : parent + "/" + path); - }); - _this.assets[path] = atlas; - if (success) - success(path, atlas); - _this.toLoad--; - _this.loaded++; - } - catch (e) { - var ex = e; - _this.errors[path] = "Couldn't load texture atlas " + path + ": " + ex.message; - if (error) - error(path, "Couldn't load texture atlas " + path + ": " + ex.message); - _this.toLoad--; - _this.loaded++; - } - } - else { - _this.errors[path] = "Couldn't load texture atlas page " + imagePath + "} of atlas " + path; - if (error) - error(path, "Couldn't load texture atlas page " + imagePath + " of atlas " + path); - _this.toLoad--; - _this.loaded++; - } - } - }, function (imagePath, errorMessage) { - pageLoadError = true; - pagesLoaded.count++; - if (pagesLoaded.count == atlasPages.length) { - _this.errors[path] = "Couldn't load texture atlas page " + imagePath + "} of atlas " + path; - if (error) - error(path, "Couldn't load texture atlas page " + imagePath + " of atlas " + path); - _this.toLoad--; - _this.loaded++; - } - }); - }; - for (var _i = 0, atlasPages_1 = atlasPages; _i < atlasPages_1.length; _i++) { - var atlasPage = atlasPages_1[_i]; - _loop_1(atlasPage); - } - }, function (state, responseText) { - _this.errors[path] = "Couldn't load texture atlas " + path + ": status " + status + ", " + responseText; - if (error) - error(path, "Couldn't load texture atlas " + path + ": status " + status + ", " + responseText); - _this.toLoad--; - _this.loaded++; - }); - }; - AssetManager.prototype.get = function (path) { - path = this.pathPrefix + path; - return this.assets[path]; - }; - AssetManager.prototype.remove = function (path) { - path = this.pathPrefix + path; - var asset = this.assets[path]; - if (asset.dispose) - asset.dispose(); - this.assets[path] = null; - }; - AssetManager.prototype.removeAll = function () { - for (var key in this.assets) { - var asset = this.assets[key]; - if (asset.dispose) - asset.dispose(); - } - this.assets = {}; - }; - AssetManager.prototype.isLoadingComplete = function () { - return this.toLoad == 0; - }; - AssetManager.prototype.getToLoad = function () { - return this.toLoad; - }; - AssetManager.prototype.getLoaded = function () { - return this.loaded; - }; - AssetManager.prototype.dispose = function () { - this.removeAll(); - }; - AssetManager.prototype.hasErrors = function () { - return Object.keys(this.errors).length > 0; - }; - AssetManager.prototype.getErrors = function () { - return this.errors; - }; - return AssetManager; - }()); - spine.AssetManager = AssetManager; -})(spine || (spine = {})); -var spine; -(function (spine) { - var AtlasAttachmentLoader = (function () { - function AtlasAttachmentLoader(atlas) { - this.atlas = atlas; - } - AtlasAttachmentLoader.prototype.newRegionAttachment = function (skin, name, path) { - var region = this.atlas.findRegion(path); - if (region == null) - throw new Error("Region not found in atlas: " + path + " (region attachment: " + name + ")"); - region.renderObject = region; - var attachment = new spine.RegionAttachment(name); - attachment.setRegion(region); - return attachment; - }; - AtlasAttachmentLoader.prototype.newMeshAttachment = function (skin, name, path) { - var region = this.atlas.findRegion(path); - if (region == null) - throw new Error("Region not found in atlas: " + path + " (mesh attachment: " + name + ")"); - region.renderObject = region; - var attachment = new spine.MeshAttachment(name); - attachment.region = region; - return attachment; - }; - AtlasAttachmentLoader.prototype.newBoundingBoxAttachment = function (skin, name) { - return new spine.BoundingBoxAttachment(name); - }; - AtlasAttachmentLoader.prototype.newPathAttachment = function (skin, name) { - return new spine.PathAttachment(name); - }; - AtlasAttachmentLoader.prototype.newPointAttachment = function (skin, name) { - return new spine.PointAttachment(name); - }; - AtlasAttachmentLoader.prototype.newClippingAttachment = function (skin, name) { - return new spine.ClippingAttachment(name); - }; - return AtlasAttachmentLoader; - }()); - spine.AtlasAttachmentLoader = AtlasAttachmentLoader; -})(spine || (spine = {})); -var spine; -(function (spine) { - var BlendMode; - (function (BlendMode) { - BlendMode[BlendMode["Normal"] = 0] = "Normal"; - BlendMode[BlendMode["Additive"] = 1] = "Additive"; - BlendMode[BlendMode["Multiply"] = 2] = "Multiply"; - BlendMode[BlendMode["Screen"] = 3] = "Screen"; - })(BlendMode = spine.BlendMode || (spine.BlendMode = {})); -})(spine || (spine = {})); -var spine; -(function (spine) { - var Bone = (function () { - function Bone(data, skeleton, parent) { - this.children = new Array(); - this.x = 0; - this.y = 0; - this.rotation = 0; - this.scaleX = 0; - this.scaleY = 0; - this.shearX = 0; - this.shearY = 0; - this.ax = 0; - this.ay = 0; - this.arotation = 0; - this.ascaleX = 0; - this.ascaleY = 0; - this.ashearX = 0; - this.ashearY = 0; - this.appliedValid = false; - this.a = 0; - this.b = 0; - this.c = 0; - this.d = 0; - this.worldY = 0; - this.worldX = 0; - this.sorted = false; - this.active = false; - 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(); - } - Bone.prototype.isActive = function () { - return this.active; - }; - Bone.prototype.update = function () { - this.updateWorldTransformWith(this.x, this.y, this.rotation, this.scaleX, this.scaleY, this.shearX, this.shearY); - }; - Bone.prototype.updateWorldTransform = function () { - this.updateWorldTransformWith(this.x, this.y, this.rotation, this.scaleX, this.scaleY, this.shearX, this.shearY); - }; - Bone.prototype.updateWorldTransformWith = function (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; - var parent = this.parent; - if (parent == null) { - var skeleton = this.skeleton; - var rotationY = rotation + 90 + shearY; - var sx = skeleton.scaleX; - var sy = skeleton.scaleY; - this.a = spine.MathUtils.cosDeg(rotation + shearX) * scaleX * sx; - this.b = spine.MathUtils.cosDeg(rotationY) * scaleY * sx; - this.c = spine.MathUtils.sinDeg(rotation + shearX) * scaleX * sy; - this.d = spine.MathUtils.sinDeg(rotationY) * scaleY * sy; - this.worldX = x * sx + skeleton.x; - this.worldY = y * sy + skeleton.y; - return; - } - var pa = parent.a, pb = parent.b, pc = parent.c, pd = parent.d; - this.worldX = pa * x + pb * y + parent.worldX; - this.worldY = pc * x + pd * y + parent.worldY; - switch (this.data.transformMode) { - case spine.TransformMode.Normal: { - var rotationY = rotation + 90 + shearY; - var la = spine.MathUtils.cosDeg(rotation + shearX) * scaleX; - var lb = spine.MathUtils.cosDeg(rotationY) * scaleY; - var lc = spine.MathUtils.sinDeg(rotation + shearX) * scaleX; - var ld = spine.MathUtils.sinDeg(rotationY) * scaleY; - this.a = pa * la + pb * lc; - this.b = pa * lb + pb * ld; - this.c = pc * la + pd * lc; - this.d = pc * lb + pd * ld; - return; - } - case spine.TransformMode.OnlyTranslation: { - var rotationY = rotation + 90 + shearY; - this.a = spine.MathUtils.cosDeg(rotation + shearX) * scaleX; - this.b = spine.MathUtils.cosDeg(rotationY) * scaleY; - this.c = spine.MathUtils.sinDeg(rotation + shearX) * scaleX; - this.d = spine.MathUtils.sinDeg(rotationY) * scaleY; - break; - } - case spine.TransformMode.NoRotationOrReflection: { - var s = pa * pa + pc * pc; - var 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) * spine.MathUtils.radDeg; - } - else { - pa = 0; - pc = 0; - prx = 90 - Math.atan2(pd, pb) * spine.MathUtils.radDeg; - } - var rx = rotation + shearX - prx; - var ry = rotation + shearY - prx + 90; - var la = spine.MathUtils.cosDeg(rx) * scaleX; - var lb = spine.MathUtils.cosDeg(ry) * scaleY; - var lc = spine.MathUtils.sinDeg(rx) * scaleX; - var ld = spine.MathUtils.sinDeg(ry) * scaleY; - this.a = pa * la - pb * lc; - this.b = pa * lb - pb * ld; - this.c = pc * la + pd * lc; - this.d = pc * lb + pd * ld; - break; - } - case spine.TransformMode.NoScale: - case spine.TransformMode.NoScaleOrReflection: { - var cos = spine.MathUtils.cosDeg(rotation); - var sin = spine.MathUtils.sinDeg(rotation); - var za = (pa * cos + pb * sin) / this.skeleton.scaleX; - var zc = (pc * cos + pd * sin) / this.skeleton.scaleY; - var 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 == spine.TransformMode.NoScale - && (pa * pd - pb * pc < 0) != (this.skeleton.scaleX < 0 != this.skeleton.scaleY < 0)) - s = -s; - var r = Math.PI / 2 + Math.atan2(zc, za); - var zb = Math.cos(r) * s; - var zd = Math.sin(r) * s; - var la = spine.MathUtils.cosDeg(shearX) * scaleX; - var lb = spine.MathUtils.cosDeg(90 + shearY) * scaleY; - var lc = spine.MathUtils.sinDeg(shearX) * scaleX; - var ld = spine.MathUtils.sinDeg(90 + shearY) * scaleY; - this.a = za * la + zb * lc; - this.b = za * lb + zb * ld; - this.c = zc * la + zd * lc; - this.d = zc * lb + zd * ld; - break; - } - } - this.a *= this.skeleton.scaleX; - this.b *= this.skeleton.scaleX; - this.c *= this.skeleton.scaleY; - this.d *= this.skeleton.scaleY; - }; - Bone.prototype.setToSetupPose = function () { - var 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; - }; - Bone.prototype.getWorldRotationX = function () { - return Math.atan2(this.c, this.a) * spine.MathUtils.radDeg; - }; - Bone.prototype.getWorldRotationY = function () { - return Math.atan2(this.d, this.b) * spine.MathUtils.radDeg; - }; - Bone.prototype.getWorldScaleX = function () { - return Math.sqrt(this.a * this.a + this.c * this.c); - }; - Bone.prototype.getWorldScaleY = function () { - return Math.sqrt(this.b * this.b + this.d * this.d); - }; - Bone.prototype.updateAppliedTransform = function () { - this.appliedValid = true; - var parent = this.parent; - if (parent == null) { - this.ax = this.worldX; - this.ay = this.worldY; - this.arotation = Math.atan2(this.c, this.a) * spine.MathUtils.radDeg; - this.ascaleX = Math.sqrt(this.a * this.a + this.c * this.c); - this.ascaleY = Math.sqrt(this.b * this.b + this.d * this.d); - this.ashearX = 0; - this.ashearY = Math.atan2(this.a * this.b + this.c * this.d, this.a * this.d - this.b * this.c) * spine.MathUtils.radDeg; - return; - } - var pa = parent.a, pb = parent.b, pc = parent.c, pd = parent.d; - var pid = 1 / (pa * pd - pb * pc); - var dx = this.worldX - parent.worldX, dy = this.worldY - parent.worldY; - this.ax = (dx * pd * pid - dy * pb * pid); - this.ay = (dy * pa * pid - dx * pc * pid); - var ia = pid * pd; - var id = pid * pa; - var ib = pid * pb; - var ic = pid * pc; - var ra = ia * this.a - ib * this.c; - var rb = ia * this.b - ib * this.d; - var rc = id * this.c - ic * this.a; - var rd = id * this.d - ic * this.b; - this.ashearX = 0; - this.ascaleX = Math.sqrt(ra * ra + rc * rc); - if (this.ascaleX > 0.0001) { - var det = ra * rd - rb * rc; - this.ascaleY = det / this.ascaleX; - this.ashearY = Math.atan2(ra * rb + rc * rd, det) * spine.MathUtils.radDeg; - this.arotation = Math.atan2(rc, ra) * spine.MathUtils.radDeg; - } - else { - this.ascaleX = 0; - this.ascaleY = Math.sqrt(rb * rb + rd * rd); - this.ashearY = 0; - this.arotation = 90 - Math.atan2(rd, rb) * spine.MathUtils.radDeg; - } - }; - Bone.prototype.worldToLocal = function (world) { - var a = this.a, b = this.b, c = this.c, d = this.d; - var invDet = 1 / (a * d - b * c); - var x = world.x - this.worldX, y = world.y - this.worldY; - world.x = (x * d * invDet - y * b * invDet); - world.y = (y * a * invDet - x * c * invDet); - return world; - }; - Bone.prototype.localToWorld = function (local) { - var x = local.x, y = local.y; - local.x = x * this.a + y * this.b + this.worldX; - local.y = x * this.c + y * this.d + this.worldY; - return local; - }; - Bone.prototype.worldToLocalRotation = function (worldRotation) { - var sin = spine.MathUtils.sinDeg(worldRotation), cos = spine.MathUtils.cosDeg(worldRotation); - return Math.atan2(this.a * sin - this.c * cos, this.d * cos - this.b * sin) * spine.MathUtils.radDeg + this.rotation - this.shearX; - }; - Bone.prototype.localToWorldRotation = function (localRotation) { - localRotation -= this.rotation - this.shearX; - var sin = spine.MathUtils.sinDeg(localRotation), cos = spine.MathUtils.cosDeg(localRotation); - return Math.atan2(cos * this.c + sin * this.d, cos * this.a + sin * this.b) * spine.MathUtils.radDeg; - }; - Bone.prototype.rotateWorld = function (degrees) { - var a = this.a, b = this.b, c = this.c, d = this.d; - var cos = spine.MathUtils.cosDeg(degrees), sin = spine.MathUtils.sinDeg(degrees); - this.a = cos * a - sin * c; - this.b = cos * b - sin * d; - this.c = sin * a + cos * c; - this.d = sin * b + cos * d; - this.appliedValid = false; - }; - return Bone; - }()); - spine.Bone = Bone; -})(spine || (spine = {})); -var spine; -(function (spine) { - var BoneData = (function () { - function BoneData(index, name, parent) { - this.x = 0; - this.y = 0; - this.rotation = 0; - this.scaleX = 1; - this.scaleY = 1; - this.shearX = 0; - this.shearY = 0; - this.transformMode = TransformMode.Normal; - this.skinRequired = false; - this.color = new spine.Color(); - 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; - } - return BoneData; - }()); - spine.BoneData = BoneData; - var TransformMode; - (function (TransformMode) { - TransformMode[TransformMode["Normal"] = 0] = "Normal"; - TransformMode[TransformMode["OnlyTranslation"] = 1] = "OnlyTranslation"; - TransformMode[TransformMode["NoRotationOrReflection"] = 2] = "NoRotationOrReflection"; - TransformMode[TransformMode["NoScale"] = 3] = "NoScale"; - TransformMode[TransformMode["NoScaleOrReflection"] = 4] = "NoScaleOrReflection"; - })(TransformMode = spine.TransformMode || (spine.TransformMode = {})); -})(spine || (spine = {})); -var spine; -(function (spine) { - var ConstraintData = (function () { - function ConstraintData(name, order, skinRequired) { - this.name = name; - this.order = order; - this.skinRequired = skinRequired; - } - return ConstraintData; - }()); - spine.ConstraintData = ConstraintData; -})(spine || (spine = {})); -var spine; -(function (spine) { - var Event = (function () { - function Event(time, data) { - if (data == null) - throw new Error("data cannot be null."); - this.time = time; - this.data = data; - } - return Event; - }()); - spine.Event = Event; -})(spine || (spine = {})); -var spine; -(function (spine) { - var EventData = (function () { - function EventData(name) { - this.name = name; - } - return EventData; - }()); - spine.EventData = EventData; -})(spine || (spine = {})); -var spine; -(function (spine) { - var IkConstraint = (function () { - function IkConstraint(data, skeleton) { - this.bendDirection = 0; - this.compress = false; - this.stretch = false; - this.mix = 1; - this.softness = 0; - this.active = false; - 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 (var i = 0; i < data.bones.length; i++) - this.bones.push(skeleton.findBone(data.bones[i].name)); - this.target = skeleton.findBone(data.target.name); - } - IkConstraint.prototype.isActive = function () { - return this.active; - }; - IkConstraint.prototype.apply = function () { - this.update(); - }; - IkConstraint.prototype.update = function () { - var target = this.target; - var 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; - } - }; - IkConstraint.prototype.apply1 = function (bone, targetX, targetY, compress, stretch, uniform, alpha) { - if (!bone.appliedValid) - bone.updateAppliedTransform(); - var p = bone.parent; - var pa = p.a, pb = p.b, pc = p.c, pd = p.d; - var rotationIK = -bone.ashearX - bone.arotation, tx = 0, ty = 0; - switch (bone.data.transformMode) { - case spine.TransformMode.OnlyTranslation: - tx = targetX - bone.worldX; - ty = targetY - bone.worldY; - break; - case spine.TransformMode.NoRotationOrReflection: - var s = Math.abs(pa * pd - pb * pc) / (pa * pa + pc * pc); - var sa = pa / bone.skeleton.scaleX; - var sc = pc / bone.skeleton.scaleY; - pb = -sc * s * bone.skeleton.scaleX; - pd = sa * s * bone.skeleton.scaleY; - rotationIK += Math.atan2(sc, sa) * spine.MathUtils.radDeg; - default: - var x = targetX - p.worldX, y = targetY - p.worldY; - var 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) * spine.MathUtils.radDeg; - if (bone.ascaleX < 0) - rotationIK += 180; - if (rotationIK > 180) - rotationIK -= 360; - else if (rotationIK < -180) - rotationIK += 360; - var sx = bone.ascaleX, sy = bone.ascaleY; - if (compress || stretch) { - switch (bone.data.transformMode) { - case spine.TransformMode.NoScale: - case spine.TransformMode.NoScaleOrReflection: - tx = targetX - bone.worldX; - ty = targetY - bone.worldY; - } - var b = bone.data.length * sx, dd = Math.sqrt(tx * tx + ty * ty); - if ((compress && dd < b) || (stretch && dd > b) && b > 0.0001) { - var 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); - }; - IkConstraint.prototype.apply2 = function (parent, child, targetX, targetY, bendDir, stretch, softness, alpha) { - if (alpha == 0) { - child.updateWorldTransform(); - return; - } - if (!parent.appliedValid) - parent.updateAppliedTransform(); - if (!child.appliedValid) - child.updateAppliedTransform(); - var px = parent.ax, py = parent.ay, psx = parent.ascaleX, sx = psx, psy = parent.ascaleY, csx = child.ascaleX; - var 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; - var cx = child.ax, cy = 0, cwx = 0, cwy = 0, a = parent.a, b = parent.b, c = parent.c, d = parent.d; - var u = Math.abs(psx - psy) <= 0.0001; - if (!u) { - cy = 0; - cwx = a * cx + parent.worldX; - cwy = c * cx + parent.worldY; - } - else { - cy = child.ay; - cwx = a * cx + b * cy + parent.worldX; - cwy = c * cx + d * cy + parent.worldY; - } - var pp = parent.parent; - a = pp.a; - b = pp.b; - c = pp.c; - d = pp.d; - var id = 1 / (a * d - b * c), x = cwx - pp.worldX, y = cwy - pp.worldY; - var dx = (x * d - y * b) * id - px, dy = (y * a - x * c) * id - py; - var 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.worldX; - y = targetY - pp.worldY; - var tx = (x * d - y * b) * id - px, ty = (y * a - x * c) * id - py; - var dd = tx * tx + ty * ty; - if (softness != 0) { - softness *= psx * (csx + 1) / 2; - var td = Math.sqrt(dd), sd = td - l1 - l2 * psx + softness; - if (sd > 0) { - var 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; - var 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; - var aa = a * a, bb = b * b, ta = Math.atan2(ty, tx); - c = bb * l1 * l1 + aa * dd - aa * bb; - var c1 = -2 * bb * l1, c2 = bb - aa; - d = c1 * c1 - 4 * c2 * c; - if (d >= 0) { - var q = Math.sqrt(d); - if (c1 < 0) - q = -q; - q = -(c1 + q) / 2; - var r0 = q / c2, r1 = c / q; - var 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; - } - } - var minAngle = spine.MathUtils.PI, minX = l1 - a, minDist = minX * minX, minY = 0; - var 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; - } - } - var os = Math.atan2(cy, cx) * s2; - var rotation = parent.arotation; - a1 = (a1 - os) * spine.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) * spine.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); - }; - return IkConstraint; - }()); - spine.IkConstraint = IkConstraint; -})(spine || (spine = {})); -var spine; -(function (spine) { - var IkConstraintData = (function (_super) { - __extends(IkConstraintData, _super); - function IkConstraintData(name) { - var _this = _super.call(this, name, 0, false) || this; - _this.bones = new Array(); - _this.bendDirection = 1; - _this.compress = false; - _this.stretch = false; - _this.uniform = false; - _this.mix = 1; - _this.softness = 0; - return _this; - } - return IkConstraintData; - }(spine.ConstraintData)); - spine.IkConstraintData = IkConstraintData; -})(spine || (spine = {})); -var spine; -(function (spine) { - var PathConstraint = (function () { - function PathConstraint(data, skeleton) { - this.position = 0; - this.spacing = 0; - this.rotateMix = 0; - this.translateMix = 0; - this.spaces = new Array(); - this.positions = new Array(); - this.world = new Array(); - this.curves = new Array(); - this.lengths = new Array(); - this.segments = new Array(); - this.active = false; - 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 (var 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; - } - PathConstraint.prototype.isActive = function () { - return this.active; - }; - PathConstraint.prototype.apply = function () { - this.update(); - }; - PathConstraint.prototype.update = function () { - var attachment = this.target.getAttachment(); - if (!(attachment instanceof spine.PathAttachment)) - return; - var rotateMix = this.rotateMix, translateMix = this.translateMix; - var translate = translateMix > 0, rotate = rotateMix > 0; - if (!translate && !rotate) - return; - var data = this.data; - var percentSpacing = data.spacingMode == spine.SpacingMode.Percent; - var rotateMode = data.rotateMode; - var tangents = rotateMode == spine.RotateMode.Tangent, scale = rotateMode == spine.RotateMode.ChainScale; - var boneCount = this.bones.length, spacesCount = tangents ? boneCount : boneCount + 1; - var bones = this.bones; - var spaces = spine.Utils.setArraySize(this.spaces, spacesCount), lengths = null; - var spacing = this.spacing; - if (scale || !percentSpacing) { - if (scale) - lengths = spine.Utils.setArraySize(this.lengths, boneCount); - var lengthSpacing = data.spacingMode == spine.SpacingMode.Length; - for (var i = 0, n = spacesCount - 1; i < n;) { - var bone = bones[i]; - var setupLength = bone.data.length; - if (setupLength < PathConstraint.epsilon) { - if (scale) - lengths[i] = 0; - spaces[++i] = 0; - } - else if (percentSpacing) { - if (scale) { - var x = setupLength * bone.a, y = setupLength * bone.c; - var length_1 = Math.sqrt(x * x + y * y); - lengths[i] = length_1; - } - spaces[++i] = spacing; - } - else { - var x = setupLength * bone.a, y = setupLength * bone.c; - var length_2 = Math.sqrt(x * x + y * y); - if (scale) - lengths[i] = length_2; - spaces[++i] = (lengthSpacing ? setupLength + spacing : spacing) * length_2 / setupLength; - } - } - } - else { - for (var i = 1; i < spacesCount; i++) - spaces[i] = spacing; - } - var positions = this.computeWorldPositions(attachment, spacesCount, tangents, data.positionMode == spine.PositionMode.Percent, percentSpacing); - var boneX = positions[0], boneY = positions[1], offsetRotation = data.offsetRotation; - var tip = false; - if (offsetRotation == 0) - tip = rotateMode == spine.RotateMode.Chain; - else { - tip = false; - var p = this.target.bone; - offsetRotation *= p.a * p.d - p.b * p.c > 0 ? spine.MathUtils.degRad : -spine.MathUtils.degRad; - } - for (var i = 0, p = 3; i < boneCount; i++, p += 3) { - var bone = bones[i]; - bone.worldX += (boneX - bone.worldX) * translateMix; - bone.worldY += (boneY - bone.worldY) * translateMix; - var x = positions[p], y = positions[p + 1], dx = x - boneX, dy = y - boneY; - if (scale) { - var length_3 = lengths[i]; - if (length_3 != 0) { - var s = (Math.sqrt(dx * dx + dy * dy) / length_3 - 1) * rotateMix + 1; - bone.a *= s; - bone.c *= s; - } - } - boneX = x; - boneY = y; - if (rotate) { - var a = bone.a, b = bone.b, c = bone.c, d = bone.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); - var length_4 = bone.data.length; - boneX += (length_4 * (cos * a - sin * c) - dx) * rotateMix; - boneY += (length_4 * (sin * a + cos * c) - dy) * rotateMix; - } - else { - r += offsetRotation; - } - if (r > spine.MathUtils.PI) - r -= spine.MathUtils.PI2; - else if (r < -spine.MathUtils.PI) - r += spine.MathUtils.PI2; - r *= rotateMix; - cos = Math.cos(r); - sin = Math.sin(r); - bone.a = cos * a - sin * c; - bone.b = cos * b - sin * d; - bone.c = sin * a + cos * c; - bone.d = sin * b + cos * d; - } - bone.appliedValid = false; - } - }; - PathConstraint.prototype.computeWorldPositions = function (path, spacesCount, tangents, percentPosition, percentSpacing) { - var target = this.target; - var position = this.position; - var spaces = this.spaces, out = spine.Utils.setArraySize(this.positions, spacesCount * 3 + 2), world = null; - var closed = path.closed; - var verticesLength = path.worldVerticesLength, curveCount = verticesLength / 6, prevCurve = PathConstraint.NONE; - if (!path.constantSpeed) { - var lengths = path.lengths; - curveCount -= closed ? 1 : 2; - var pathLength_1 = lengths[curveCount]; - if (percentPosition) - position *= pathLength_1; - if (percentSpacing) { - for (var i = 1; i < spacesCount; i++) - spaces[i] *= pathLength_1; - } - world = spine.Utils.setArraySize(this.world, 8); - for (var i = 0, o = 0, curve = 0; i < spacesCount; i++, o += 3) { - var space = spaces[i]; - position += space; - var p = position; - if (closed) { - p %= pathLength_1; - if (p < 0) - p += pathLength_1; - 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_1) { - if (prevCurve != PathConstraint.AFTER) { - prevCurve = PathConstraint.AFTER; - path.computeWorldVertices(target, verticesLength - 6, 4, world, 0, 2); - } - this.addAfterPosition(p - pathLength_1, world, 0, out, o); - continue; - } - for (;; curve++) { - var length_5 = lengths[curve]; - if (p > length_5) - continue; - if (curve == 0) - p /= length_5; - else { - var prev = lengths[curve - 1]; - p = (p - prev) / (length_5 - 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; - } - if (closed) { - verticesLength += 2; - world = spine.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 = spine.Utils.setArraySize(this.world, verticesLength); - path.computeWorldVertices(target, 2, verticesLength, world, 0, 2); - } - var curves = spine.Utils.setArraySize(this.curves, curveCount); - var pathLength = 0; - var x1 = world[0], y1 = world[1], cx1 = 0, cy1 = 0, cx2 = 0, cy2 = 0, x2 = 0, y2 = 0; - var tmpx = 0, tmpy = 0, dddfx = 0, dddfy = 0, ddfx = 0, ddfy = 0, dfx = 0, dfy = 0; - for (var 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; - else - position *= pathLength / path.lengths[curveCount - 1]; - if (percentSpacing) { - for (var i = 1; i < spacesCount; i++) - spaces[i] *= pathLength; - } - var segments = this.segments; - var curveLength = 0; - for (var i = 0, o = 0, curve = 0, segment = 0; i < spacesCount; i++, o += 3) { - var space = spaces[i]; - position += space; - var 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; - } - for (;; curve++) { - var length_6 = curves[curve]; - if (p > length_6) - continue; - if (curve == 0) - p /= length_6; - else { - var prev = curves[curve - 1]; - p = (p - prev) / (length_6 - prev); - } - break; - } - if (curve != prevCurve) { - prevCurve = curve; - var 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; - } - p *= curveLength; - for (;; segment++) { - var length_7 = segments[segment]; - if (p > length_7) - continue; - if (segment == 0) - p /= length_7; - else { - var prev = segments[segment - 1]; - p = segment + (p - prev) / (length_7 - prev); - } - break; - } - this.addCurvePosition(p * 0.1, x1, y1, cx1, cy1, cx2, cy2, x2, y2, out, o, tangents || (i > 0 && space == 0)); - } - return out; - }; - PathConstraint.prototype.addBeforePosition = function (p, temp, i, out, o) { - var 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; - }; - PathConstraint.prototype.addAfterPosition = function (p, temp, i, out, o) { - var 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; - }; - PathConstraint.prototype.addCurvePosition = function (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; - } - var tt = p * p, ttt = tt * p, u = 1 - p, uu = u * u, uuu = uu * u; - var ut = u * p, ut3 = ut * 3, uut3 = u * ut3, utt3 = ut3 * p; - var 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.NONE = -1; - PathConstraint.BEFORE = -2; - PathConstraint.AFTER = -3; - PathConstraint.epsilon = 0.00001; - return PathConstraint; - }()); - spine.PathConstraint = PathConstraint; -})(spine || (spine = {})); -var spine; -(function (spine) { - var PathConstraintData = (function (_super) { - __extends(PathConstraintData, _super); - function PathConstraintData(name) { - var _this = _super.call(this, name, 0, false) || this; - _this.bones = new Array(); - return _this; - } - return PathConstraintData; - }(spine.ConstraintData)); - spine.PathConstraintData = PathConstraintData; - var PositionMode; - (function (PositionMode) { - PositionMode[PositionMode["Fixed"] = 0] = "Fixed"; - PositionMode[PositionMode["Percent"] = 1] = "Percent"; - })(PositionMode = spine.PositionMode || (spine.PositionMode = {})); - var SpacingMode; - (function (SpacingMode) { - SpacingMode[SpacingMode["Length"] = 0] = "Length"; - SpacingMode[SpacingMode["Fixed"] = 1] = "Fixed"; - SpacingMode[SpacingMode["Percent"] = 2] = "Percent"; - })(SpacingMode = spine.SpacingMode || (spine.SpacingMode = {})); - var RotateMode; - (function (RotateMode) { - RotateMode[RotateMode["Tangent"] = 0] = "Tangent"; - RotateMode[RotateMode["Chain"] = 1] = "Chain"; - RotateMode[RotateMode["ChainScale"] = 2] = "ChainScale"; - })(RotateMode = spine.RotateMode || (spine.RotateMode = {})); -})(spine || (spine = {})); -var spine; -(function (spine) { - var Assets = (function () { - function Assets(clientId) { - this.toLoad = new Array(); - this.assets = {}; - this.clientId = clientId; - } - Assets.prototype.loaded = function () { - var i = 0; - for (var v in this.assets) - i++; - return i; - }; - return Assets; - }()); - var SharedAssetManager = (function () { - function SharedAssetManager(pathPrefix) { - if (pathPrefix === void 0) { pathPrefix = ""; } - this.clientAssets = {}; - this.queuedAssets = {}; - this.rawAssets = {}; - this.errors = {}; - this.pathPrefix = pathPrefix; - } - SharedAssetManager.prototype.queueAsset = function (clientId, textureLoader, path) { - var clientAssets = this.clientAssets[clientId]; - if (clientAssets === null || clientAssets === undefined) { - clientAssets = new Assets(clientId); - this.clientAssets[clientId] = clientAssets; - } - if (textureLoader !== null) - clientAssets.textureLoader = textureLoader; - clientAssets.toLoad.push(path); - if (this.queuedAssets[path] === path) { - return false; - } - else { - this.queuedAssets[path] = path; - return true; - } - }; - SharedAssetManager.prototype.loadText = function (clientId, path) { - var _this = this; - path = this.pathPrefix + path; - if (!this.queueAsset(clientId, null, path)) - return; - var request = new XMLHttpRequest(); - request.overrideMimeType("text/html"); - request.onreadystatechange = function () { - if (request.readyState == XMLHttpRequest.DONE) { - if (request.status >= 200 && request.status < 300) { - _this.rawAssets[path] = request.responseText; - } - else { - _this.errors[path] = "Couldn't load text " + path + ": status " + request.status + ", " + request.responseText; - } - } - }; - request.open("GET", path, true); - request.send(); - }; - SharedAssetManager.prototype.loadJson = function (clientId, path) { - var _this = this; - path = this.pathPrefix + path; - if (!this.queueAsset(clientId, null, path)) - return; - var request = new XMLHttpRequest(); - request.overrideMimeType("text/html"); - request.onreadystatechange = function () { - if (request.readyState == XMLHttpRequest.DONE) { - if (request.status >= 200 && request.status < 300) { - _this.rawAssets[path] = JSON.parse(request.responseText); - } - else { - _this.errors[path] = "Couldn't load text " + path + ": status " + request.status + ", " + request.responseText; - } - } - }; - request.open("GET", path, true); - request.send(); - }; - SharedAssetManager.prototype.loadTexture = function (clientId, textureLoader, path) { - var _this = this; - path = this.pathPrefix + path; - if (!this.queueAsset(clientId, textureLoader, path)) - return; - var isBrowser = !!(typeof window !== 'undefined' && typeof navigator !== 'undefined' && window.document); - var isWebWorker = !isBrowser && typeof importScripts !== 'undefined'; - if (isWebWorker) { - var options = { mode: "cors" }; - fetch(path, options).then(function (response) { - if (!response.ok) { - _this.errors[path] = "Couldn't load image " + path; - } - return response.blob(); - }).then(function (blob) { - return createImageBitmap(blob, { - premultiplyAlpha: 'none', - colorSpaceConversion: 'none' - }); - }).then(function (bitmap) { - _this.rawAssets[path] = bitmap; - }); - } - else { - var img_1 = new Image(); - img_1.crossOrigin = "anonymous"; - img_1.onload = function (ev) { - _this.rawAssets[path] = img_1; - }; - img_1.onerror = function (ev) { - _this.errors[path] = "Couldn't load image " + path; - }; - img_1.src = path; - } - }; - SharedAssetManager.prototype.get = function (clientId, path) { - path = this.pathPrefix + path; - var clientAssets = this.clientAssets[clientId]; - if (clientAssets === null || clientAssets === undefined) - return true; - return clientAssets.assets[path]; - }; - SharedAssetManager.prototype.updateClientAssets = function (clientAssets) { - var isBrowser = !!(typeof window !== 'undefined' && typeof navigator !== 'undefined' && window.document); - var isWebWorker = !isBrowser && typeof importScripts !== 'undefined'; - for (var i = 0; i < clientAssets.toLoad.length; i++) { - var path = clientAssets.toLoad[i]; - var asset = clientAssets.assets[path]; - if (asset === null || asset === undefined) { - var rawAsset = this.rawAssets[path]; - if (rawAsset === null || rawAsset === undefined) - continue; - if (isWebWorker) { - if (rawAsset instanceof ImageBitmap) { - clientAssets.assets[path] = clientAssets.textureLoader(rawAsset); - } - else { - clientAssets.assets[path] = rawAsset; - } - } - else { - if (rawAsset instanceof HTMLImageElement) { - clientAssets.assets[path] = clientAssets.textureLoader(rawAsset); - } - else { - clientAssets.assets[path] = rawAsset; - } - } - } - } - }; - SharedAssetManager.prototype.isLoadingComplete = function (clientId) { - var clientAssets = this.clientAssets[clientId]; - if (clientAssets === null || clientAssets === undefined) - return true; - this.updateClientAssets(clientAssets); - return clientAssets.toLoad.length == clientAssets.loaded(); - }; - SharedAssetManager.prototype.dispose = function () { - }; - SharedAssetManager.prototype.hasErrors = function () { - return Object.keys(this.errors).length > 0; - }; - SharedAssetManager.prototype.getErrors = function () { - return this.errors; - }; - return SharedAssetManager; - }()); - spine.SharedAssetManager = SharedAssetManager; -})(spine || (spine = {})); -var spine; -(function (spine) { - var Skeleton = (function () { - function Skeleton(data) { - this._updateCache = new Array(); - this.updateCacheReset = new Array(); - this.time = 0; - this.scaleX = 1; - this.scaleY = 1; - this.x = 0; - this.y = 0; - if (data == null) - throw new Error("data cannot be null."); - this.data = data; - this.bones = new Array(); - for (var i = 0; i < data.bones.length; i++) { - var boneData = data.bones[i]; - var bone = void 0; - if (boneData.parent == null) - bone = new spine.Bone(boneData, this, null); - else { - var parent_1 = this.bones[boneData.parent.index]; - bone = new spine.Bone(boneData, this, parent_1); - parent_1.children.push(bone); - } - this.bones.push(bone); - } - this.slots = new Array(); - this.drawOrder = new Array(); - for (var i = 0; i < data.slots.length; i++) { - var slotData = data.slots[i]; - var bone = this.bones[slotData.boneData.index]; - var slot = new spine.Slot(slotData, bone); - this.slots.push(slot); - this.drawOrder.push(slot); - } - this.ikConstraints = new Array(); - for (var i = 0; i < data.ikConstraints.length; i++) { - var ikConstraintData = data.ikConstraints[i]; - this.ikConstraints.push(new spine.IkConstraint(ikConstraintData, this)); - } - this.transformConstraints = new Array(); - for (var i = 0; i < data.transformConstraints.length; i++) { - var transformConstraintData = data.transformConstraints[i]; - this.transformConstraints.push(new spine.TransformConstraint(transformConstraintData, this)); - } - this.pathConstraints = new Array(); - for (var i = 0; i < data.pathConstraints.length; i++) { - var pathConstraintData = data.pathConstraints[i]; - this.pathConstraints.push(new spine.PathConstraint(pathConstraintData, this)); - } - this.color = new spine.Color(1, 1, 1, 1); - this.updateCache(); - } - Skeleton.prototype.updateCache = function () { - var updateCache = this._updateCache; - updateCache.length = 0; - this.updateCacheReset.length = 0; - var bones = this.bones; - for (var i = 0, n = bones.length; i < n; i++) { - var bone = bones[i]; - bone.sorted = bone.data.skinRequired; - bone.active = !bone.sorted; - } - if (this.skin != null) { - var skinBones = this.skin.bones; - for (var i = 0, n = this.skin.bones.length; i < n; i++) { - var bone = this.bones[skinBones[i].index]; - do { - bone.sorted = false; - bone.active = true; - bone = bone.parent; - } while (bone != null); - } - } - var ikConstraints = this.ikConstraints; - var transformConstraints = this.transformConstraints; - var pathConstraints = this.pathConstraints; - var ikCount = ikConstraints.length, transformCount = transformConstraints.length, pathCount = pathConstraints.length; - var constraintCount = ikCount + transformCount + pathCount; - outer: for (var i = 0; i < constraintCount; i++) { - for (var ii = 0; ii < ikCount; ii++) { - var constraint = ikConstraints[ii]; - if (constraint.data.order == i) { - this.sortIkConstraint(constraint); - continue outer; - } - } - for (var ii = 0; ii < transformCount; ii++) { - var constraint = transformConstraints[ii]; - if (constraint.data.order == i) { - this.sortTransformConstraint(constraint); - continue outer; - } - } - for (var ii = 0; ii < pathCount; ii++) { - var constraint = pathConstraints[ii]; - if (constraint.data.order == i) { - this.sortPathConstraint(constraint); - continue outer; - } - } - } - for (var i = 0, n = bones.length; i < n; i++) - this.sortBone(bones[i]); - }; - Skeleton.prototype.sortIkConstraint = function (constraint) { - constraint.active = constraint.target.isActive() && (!constraint.data.skinRequired || (this.skin != null && spine.Utils.contains(this.skin.constraints, constraint.data, true))); - if (!constraint.active) - return; - var target = constraint.target; - this.sortBone(target); - var constrained = constraint.bones; - var parent = constrained[0]; - this.sortBone(parent); - if (constrained.length > 1) { - var 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; - }; - Skeleton.prototype.sortPathConstraint = function (constraint) { - constraint.active = constraint.target.bone.isActive() && (!constraint.data.skinRequired || (this.skin != null && spine.Utils.contains(this.skin.constraints, constraint.data, true))); - if (!constraint.active) - return; - var slot = constraint.target; - var slotIndex = slot.data.index; - var 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 (var i = 0, n = this.data.skins.length; i < n; i++) - this.sortPathConstraintAttachment(this.data.skins[i], slotIndex, slotBone); - var attachment = slot.getAttachment(); - if (attachment instanceof spine.PathAttachment) - this.sortPathConstraintAttachmentWith(attachment, slotBone); - var constrained = constraint.bones; - var boneCount = constrained.length; - for (var i = 0; i < boneCount; i++) - this.sortBone(constrained[i]); - this._updateCache.push(constraint); - for (var i = 0; i < boneCount; i++) - this.sortReset(constrained[i].children); - for (var i = 0; i < boneCount; i++) - constrained[i].sorted = true; - }; - Skeleton.prototype.sortTransformConstraint = function (constraint) { - constraint.active = constraint.target.isActive() && (!constraint.data.skinRequired || (this.skin != null && spine.Utils.contains(this.skin.constraints, constraint.data, true))); - if (!constraint.active) - return; - this.sortBone(constraint.target); - var constrained = constraint.bones; - var boneCount = constrained.length; - if (constraint.data.local) { - for (var i = 0; i < boneCount; i++) { - var child = constrained[i]; - this.sortBone(child.parent); - if (!(this._updateCache.indexOf(child) > -1)) - this.updateCacheReset.push(child); - } - } - else { - for (var i = 0; i < boneCount; i++) { - this.sortBone(constrained[i]); - } - } - this._updateCache.push(constraint); - for (var ii = 0; ii < boneCount; ii++) - this.sortReset(constrained[ii].children); - for (var ii = 0; ii < boneCount; ii++) - constrained[ii].sorted = true; - }; - Skeleton.prototype.sortPathConstraintAttachment = function (skin, slotIndex, slotBone) { - var attachments = skin.attachments[slotIndex]; - if (!attachments) - return; - for (var key in attachments) { - this.sortPathConstraintAttachmentWith(attachments[key], slotBone); - } - }; - Skeleton.prototype.sortPathConstraintAttachmentWith = function (attachment, slotBone) { - if (!(attachment instanceof spine.PathAttachment)) - return; - var pathBones = attachment.bones; - if (pathBones == null) - this.sortBone(slotBone); - else { - var bones = this.bones; - var i = 0; - while (i < pathBones.length) { - var boneCount = pathBones[i++]; - for (var n = i + boneCount; i < n; i++) { - var boneIndex = pathBones[i]; - this.sortBone(bones[boneIndex]); - } - } - } - }; - Skeleton.prototype.sortBone = function (bone) { - if (bone.sorted) - return; - var parent = bone.parent; - if (parent != null) - this.sortBone(parent); - bone.sorted = true; - this._updateCache.push(bone); - }; - Skeleton.prototype.sortReset = function (bones) { - for (var i = 0, n = bones.length; i < n; i++) { - var bone = bones[i]; - if (!bone.active) - continue; - if (bone.sorted) - this.sortReset(bone.children); - bone.sorted = false; - } - }; - Skeleton.prototype.updateWorldTransform = function () { - var updateCacheReset = this.updateCacheReset; - for (var i = 0, n = updateCacheReset.length; i < n; i++) { - var 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; - } - var updateCache = this._updateCache; - for (var i = 0, n = updateCache.length; i < n; i++) - updateCache[i].update(); - }; - Skeleton.prototype.setToSetupPose = function () { - this.setBonesToSetupPose(); - this.setSlotsToSetupPose(); - }; - Skeleton.prototype.setBonesToSetupPose = function () { - var bones = this.bones; - for (var i = 0, n = bones.length; i < n; i++) - bones[i].setToSetupPose(); - var ikConstraints = this.ikConstraints; - for (var i = 0, n = ikConstraints.length; i < n; i++) { - var 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; - } - var transformConstraints = this.transformConstraints; - for (var i = 0, n = transformConstraints.length; i < n; i++) { - var constraint = transformConstraints[i]; - var data = constraint.data; - constraint.rotateMix = data.rotateMix; - constraint.translateMix = data.translateMix; - constraint.scaleMix = data.scaleMix; - constraint.shearMix = data.shearMix; - } - var pathConstraints = this.pathConstraints; - for (var i = 0, n = pathConstraints.length; i < n; i++) { - var constraint = pathConstraints[i]; - var data = constraint.data; - constraint.position = data.position; - constraint.spacing = data.spacing; - constraint.rotateMix = data.rotateMix; - constraint.translateMix = data.translateMix; - } - }; - Skeleton.prototype.setSlotsToSetupPose = function () { - var slots = this.slots; - spine.Utils.arrayCopy(slots, 0, this.drawOrder, 0, slots.length); - for (var i = 0, n = slots.length; i < n; i++) - slots[i].setToSetupPose(); - }; - Skeleton.prototype.getRootBone = function () { - if (this.bones.length == 0) - return null; - return this.bones[0]; - }; - Skeleton.prototype.findBone = function (boneName) { - if (boneName == null) - throw new Error("boneName cannot be null."); - var bones = this.bones; - for (var i = 0, n = bones.length; i < n; i++) { - var bone = bones[i]; - if (bone.data.name == boneName) - return bone; - } - return null; - }; - Skeleton.prototype.findBoneIndex = function (boneName) { - if (boneName == null) - throw new Error("boneName cannot be null."); - var bones = this.bones; - for (var i = 0, n = bones.length; i < n; i++) - if (bones[i].data.name == boneName) - return i; - return -1; - }; - Skeleton.prototype.findSlot = function (slotName) { - if (slotName == null) - throw new Error("slotName cannot be null."); - var slots = this.slots; - for (var i = 0, n = slots.length; i < n; i++) { - var slot = slots[i]; - if (slot.data.name == slotName) - return slot; - } - return null; - }; - Skeleton.prototype.findSlotIndex = function (slotName) { - if (slotName == null) - throw new Error("slotName cannot be null."); - var slots = this.slots; - for (var i = 0, n = slots.length; i < n; i++) - if (slots[i].data.name == slotName) - return i; - return -1; - }; - Skeleton.prototype.setSkinByName = function (skinName) { - var skin = this.data.findSkin(skinName); - if (skin == null) - throw new Error("Skin not found: " + skinName); - this.setSkin(skin); - }; - Skeleton.prototype.setSkin = function (newSkin) { - if (newSkin == this.skin) - return; - if (newSkin != null) { - if (this.skin != null) - newSkin.attachAll(this, this.skin); - else { - var slots = this.slots; - for (var i = 0, n = slots.length; i < n; i++) { - var slot = slots[i]; - var name_1 = slot.data.attachmentName; - if (name_1 != null) { - var attachment = newSkin.getAttachment(i, name_1); - if (attachment != null) - slot.setAttachment(attachment); - } - } - } - } - this.skin = newSkin; - this.updateCache(); - }; - Skeleton.prototype.getAttachmentByName = function (slotName, attachmentName) { - return this.getAttachment(this.data.findSlotIndex(slotName), attachmentName); - }; - Skeleton.prototype.getAttachment = function (slotIndex, attachmentName) { - if (attachmentName == null) - throw new Error("attachmentName cannot be null."); - if (this.skin != null) { - var 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; - }; - Skeleton.prototype.setAttachment = function (slotName, attachmentName) { - if (slotName == null) - throw new Error("slotName cannot be null."); - var slots = this.slots; - for (var i = 0, n = slots.length; i < n; i++) { - var slot = slots[i]; - if (slot.data.name == slotName) { - var 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); - }; - Skeleton.prototype.findIkConstraint = function (constraintName) { - if (constraintName == null) - throw new Error("constraintName cannot be null."); - var ikConstraints = this.ikConstraints; - for (var i = 0, n = ikConstraints.length; i < n; i++) { - var ikConstraint = ikConstraints[i]; - if (ikConstraint.data.name == constraintName) - return ikConstraint; - } - return null; - }; - Skeleton.prototype.findTransformConstraint = function (constraintName) { - if (constraintName == null) - throw new Error("constraintName cannot be null."); - var transformConstraints = this.transformConstraints; - for (var i = 0, n = transformConstraints.length; i < n; i++) { - var constraint = transformConstraints[i]; - if (constraint.data.name == constraintName) - return constraint; - } - return null; - }; - Skeleton.prototype.findPathConstraint = function (constraintName) { - if (constraintName == null) - throw new Error("constraintName cannot be null."); - var pathConstraints = this.pathConstraints; - for (var i = 0, n = pathConstraints.length; i < n; i++) { - var constraint = pathConstraints[i]; - if (constraint.data.name == constraintName) - return constraint; - } - return null; - }; - Skeleton.prototype.getBounds = function (offset, size, temp) { - if (temp === void 0) { temp = new Array(2); } - if (offset == null) - throw new Error("offset cannot be null."); - if (size == null) - throw new Error("size cannot be null."); - var drawOrder = this.drawOrder; - var minX = Number.POSITIVE_INFINITY, minY = Number.POSITIVE_INFINITY, maxX = Number.NEGATIVE_INFINITY, maxY = Number.NEGATIVE_INFINITY; - for (var i = 0, n = drawOrder.length; i < n; i++) { - var slot = drawOrder[i]; - if (!slot.bone.active) - continue; - var verticesLength = 0; - var vertices = null; - var attachment = slot.getAttachment(); - if (attachment instanceof spine.RegionAttachment) { - verticesLength = 8; - vertices = spine.Utils.setArraySize(temp, verticesLength, 0); - attachment.computeWorldVertices(slot.bone, vertices, 0, 2); - } - else if (attachment instanceof spine.MeshAttachment) { - var mesh = attachment; - verticesLength = mesh.worldVerticesLength; - vertices = spine.Utils.setArraySize(temp, verticesLength, 0); - mesh.computeWorldVertices(slot, 0, verticesLength, vertices, 0, 2); - } - if (vertices != null) { - for (var ii = 0, nn = vertices.length; ii < nn; ii += 2) { - var 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); - }; - Skeleton.prototype.update = function (delta) { - this.time += delta; - }; - return Skeleton; - }()); - spine.Skeleton = Skeleton; -})(spine || (spine = {})); -var spine; -(function (spine) { - var SkeletonBinary = (function () { - function SkeletonBinary(attachmentLoader) { - this.scale = 1; - this.linkedMeshes = new Array(); - this.attachmentLoader = attachmentLoader; - } - SkeletonBinary.prototype.readSkeletonData = function (binary) { - var scale = this.scale; - var skeletonData = new spine.SkeletonData(); - skeletonData.name = ""; - var input = new BinaryInput(binary); - skeletonData.hash = input.readString(); - skeletonData.version = input.readString(); - if ("3.8.75" == skeletonData.version) - throw new Error("Unsupported skeleton data, please export with a newer version of Spine."); - skeletonData.x = input.readFloat(); - skeletonData.y = input.readFloat(); - skeletonData.width = input.readFloat(); - skeletonData.height = input.readFloat(); - var nonessential = input.readBoolean(); - if (nonessential) { - skeletonData.fps = input.readFloat(); - skeletonData.imagesPath = input.readString(); - skeletonData.audioPath = input.readString(); - } - var n = 0; - n = input.readInt(true); - for (var i = 0; i < n; i++) - input.strings.push(input.readString()); - n = input.readInt(true); - for (var i = 0; i < n; i++) { - var name_2 = input.readString(); - var parent_2 = i == 0 ? null : skeletonData.bones[input.readInt(true)]; - var data = new spine.BoneData(i, name_2, parent_2); - 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) - spine.Color.rgba8888ToColor(data.color, input.readInt32()); - skeletonData.bones.push(data); - } - n = input.readInt(true); - for (var i = 0; i < n; i++) { - var slotName = input.readString(); - var boneData = skeletonData.bones[input.readInt(true)]; - var data = new spine.SlotData(i, slotName, boneData); - spine.Color.rgba8888ToColor(data.color, input.readInt32()); - var darkColor = input.readInt32(); - if (darkColor != -1) - spine.Color.rgb888ToColor(data.darkColor = new spine.Color(), darkColor); - data.attachmentName = input.readStringRef(); - data.blendMode = SkeletonBinary.BlendModeValues[input.readInt(true)]; - skeletonData.slots.push(data); - } - n = input.readInt(true); - for (var i = 0, nn = void 0; i < n; i++) { - var data = new spine.IkConstraintData(input.readString()); - data.order = input.readInt(true); - data.skinRequired = input.readBoolean(); - nn = input.readInt(true); - for (var 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); - } - n = input.readInt(true); - for (var i = 0, nn = void 0; i < n; i++) { - var data = new spine.TransformConstraintData(input.readString()); - data.order = input.readInt(true); - data.skinRequired = input.readBoolean(); - nn = input.readInt(true); - for (var 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); - } - n = input.readInt(true); - for (var i = 0, nn = void 0; i < n; i++) { - var data = new spine.PathConstraintData(input.readString()); - data.order = input.readInt(true); - data.skinRequired = input.readBoolean(); - nn = input.readInt(true); - for (var 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 == spine.PositionMode.Fixed) - data.position *= scale; - data.spacing = input.readFloat(); - if (data.spacingMode == spine.SpacingMode.Length || data.spacingMode == spine.SpacingMode.Fixed) - data.spacing *= scale; - data.rotateMix = input.readFloat(); - data.translateMix = input.readFloat(); - skeletonData.pathConstraints.push(data); - } - var defaultSkin = this.readSkin(input, skeletonData, true, nonessential); - if (defaultSkin != null) { - skeletonData.defaultSkin = defaultSkin; - skeletonData.skins.push(defaultSkin); - } - { - var i = skeletonData.skins.length; - spine.Utils.setArraySize(skeletonData.skins, n = i + input.readInt(true)); - for (; i < n; i++) - skeletonData.skins[i] = this.readSkin(input, skeletonData, false, nonessential); - } - n = this.linkedMeshes.length; - for (var i = 0; i < n; i++) { - var linkedMesh = this.linkedMeshes[i]; - var skin = linkedMesh.skin == null ? skeletonData.defaultSkin : skeletonData.findSkin(linkedMesh.skin); - if (skin == null) - throw new Error("Skin not found: " + linkedMesh.skin); - var parent_3 = skin.getAttachment(linkedMesh.slotIndex, linkedMesh.parent); - if (parent_3 == null) - throw new Error("Parent mesh not found: " + linkedMesh.parent); - linkedMesh.mesh.deformAttachment = linkedMesh.inheritDeform ? parent_3 : linkedMesh.mesh; - linkedMesh.mesh.setParentMesh(parent_3); - linkedMesh.mesh.updateUVs(); - } - this.linkedMeshes.length = 0; - n = input.readInt(true); - for (var i = 0; i < n; i++) { - var data = new spine.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); - } - n = input.readInt(true); - for (var i = 0; i < n; i++) - skeletonData.animations.push(this.readAnimation(input, input.readString(), skeletonData)); - return skeletonData; - }; - SkeletonBinary.prototype.readSkin = function (input, skeletonData, defaultSkin, nonessential) { - var skin = null; - var slotCount = 0; - if (defaultSkin) { - slotCount = input.readInt(true); - if (slotCount == 0) - return null; - skin = new spine.Skin("default"); - } - else { - skin = new spine.Skin(input.readStringRef()); - skin.bones.length = input.readInt(true); - for (var i = 0, n = skin.bones.length; i < n; i++) - skin.bones[i] = skeletonData.bones[input.readInt(true)]; - for (var i = 0, n = input.readInt(true); i < n; i++) - skin.constraints.push(skeletonData.ikConstraints[input.readInt(true)]); - for (var i = 0, n = input.readInt(true); i < n; i++) - skin.constraints.push(skeletonData.transformConstraints[input.readInt(true)]); - for (var i = 0, n = input.readInt(true); i < n; i++) - skin.constraints.push(skeletonData.pathConstraints[input.readInt(true)]); - slotCount = input.readInt(true); - } - for (var i = 0; i < slotCount; i++) { - var slotIndex = input.readInt(true); - for (var ii = 0, nn = input.readInt(true); ii < nn; ii++) { - var name_3 = input.readStringRef(); - var attachment = this.readAttachment(input, skeletonData, skin, slotIndex, name_3, nonessential); - if (attachment != null) - skin.setAttachment(slotIndex, name_3, attachment); - } - } - return skin; - }; - SkeletonBinary.prototype.readAttachment = function (input, skeletonData, skin, slotIndex, attachmentName, nonessential) { - var scale = this.scale; - var name = input.readStringRef(); - if (name == null) - name = attachmentName; - var typeIndex = input.readByte(); - var type = SkeletonBinary.AttachmentTypeValues[typeIndex]; - switch (type) { - case spine.AttachmentType.Region: { - var path = input.readStringRef(); - var rotation = input.readFloat(); - var x = input.readFloat(); - var y = input.readFloat(); - var scaleX = input.readFloat(); - var scaleY = input.readFloat(); - var width = input.readFloat(); - var height = input.readFloat(); - var color = input.readInt32(); - if (path == null) - path = name; - var 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; - spine.Color.rgba8888ToColor(region.color, color); - region.updateOffset(); - return region; - } - case spine.AttachmentType.BoundingBox: { - var vertexCount = input.readInt(true); - var vertices = this.readVertices(input, vertexCount); - var color = nonessential ? input.readInt32() : 0; - var 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) - spine.Color.rgba8888ToColor(box.color, color); - return box; - } - case spine.AttachmentType.Mesh: { - var path = input.readStringRef(); - var color = input.readInt32(); - var vertexCount = input.readInt(true); - var uvs = this.readFloatArray(input, vertexCount << 1, 1); - var triangles = this.readShortArray(input); - var vertices = this.readVertices(input, vertexCount); - var hullLength = input.readInt(true); - var edges = null; - var width = 0, height = 0; - if (nonessential) { - edges = this.readShortArray(input); - width = input.readFloat(); - height = input.readFloat(); - } - if (path == null) - path = name; - var mesh = this.attachmentLoader.newMeshAttachment(skin, name, path); - if (mesh == null) - return null; - mesh.path = path; - spine.Color.rgba8888ToColor(mesh.color, color); - mesh.bones = vertices.bones; - mesh.vertices = vertices.vertices; - mesh.worldVerticesLength = vertexCount << 1; - mesh.triangles = triangles; - mesh.regionUVs = uvs; - mesh.updateUVs(); - mesh.hullLength = hullLength << 1; - if (nonessential) { - mesh.edges = edges; - mesh.width = width * scale; - mesh.height = height * scale; - } - return mesh; - } - case spine.AttachmentType.LinkedMesh: { - var path = input.readStringRef(); - var color = input.readInt32(); - var skinName = input.readStringRef(); - var parent_4 = input.readStringRef(); - var inheritDeform = input.readBoolean(); - var width = 0, height = 0; - if (nonessential) { - width = input.readFloat(); - height = input.readFloat(); - } - if (path == null) - path = name; - var mesh = this.attachmentLoader.newMeshAttachment(skin, name, path); - if (mesh == null) - return null; - mesh.path = path; - spine.Color.rgba8888ToColor(mesh.color, color); - if (nonessential) { - mesh.width = width * scale; - mesh.height = height * scale; - } - this.linkedMeshes.push(new LinkedMesh(mesh, skinName, slotIndex, parent_4, inheritDeform)); - return mesh; - } - case spine.AttachmentType.Path: { - var closed_1 = input.readBoolean(); - var constantSpeed = input.readBoolean(); - var vertexCount = input.readInt(true); - var vertices = this.readVertices(input, vertexCount); - var lengths = spine.Utils.newArray(vertexCount / 3, 0); - for (var i = 0, n = lengths.length; i < n; i++) - lengths[i] = input.readFloat() * scale; - var color = nonessential ? input.readInt32() : 0; - var path = this.attachmentLoader.newPathAttachment(skin, name); - if (path == null) - return null; - path.closed = closed_1; - path.constantSpeed = constantSpeed; - path.worldVerticesLength = vertexCount << 1; - path.vertices = vertices.vertices; - path.bones = vertices.bones; - path.lengths = lengths; - if (nonessential) - spine.Color.rgba8888ToColor(path.color, color); - return path; - } - case spine.AttachmentType.Point: { - var rotation = input.readFloat(); - var x = input.readFloat(); - var y = input.readFloat(); - var color = nonessential ? input.readInt32() : 0; - var point = this.attachmentLoader.newPointAttachment(skin, name); - if (point == null) - return null; - point.x = x * scale; - point.y = y * scale; - point.rotation = rotation; - if (nonessential) - spine.Color.rgba8888ToColor(point.color, color); - return point; - } - case spine.AttachmentType.Clipping: { - var endSlotIndex = input.readInt(true); - var vertexCount = input.readInt(true); - var vertices = this.readVertices(input, vertexCount); - var color = nonessential ? input.readInt32() : 0; - var 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) - spine.Color.rgba8888ToColor(clip.color, color); - return clip; - } - } - return null; - }; - SkeletonBinary.prototype.readVertices = function (input, vertexCount) { - var verticesLength = vertexCount << 1; - var vertices = new Vertices(); - var scale = this.scale; - if (!input.readBoolean()) { - vertices.vertices = this.readFloatArray(input, verticesLength, scale); - return vertices; - } - var weights = new Array(); - var bonesArray = new Array(); - for (var i = 0; i < vertexCount; i++) { - var boneCount = input.readInt(true); - bonesArray.push(boneCount); - for (var 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 = spine.Utils.toFloatArray(weights); - vertices.bones = bonesArray; - return vertices; - }; - SkeletonBinary.prototype.readFloatArray = function (input, n, scale) { - var array = new Array(n); - if (scale == 1) { - for (var i = 0; i < n; i++) - array[i] = input.readFloat(); - } - else { - for (var i = 0; i < n; i++) - array[i] = input.readFloat() * scale; - } - return array; - }; - SkeletonBinary.prototype.readShortArray = function (input) { - var n = input.readInt(true); - var array = new Array(n); - for (var i = 0; i < n; i++) - array[i] = input.readShort(); - return array; - }; - SkeletonBinary.prototype.readAnimation = function (input, name, skeletonData) { - var timelines = new Array(); - var scale = this.scale; - var duration = 0; - var tempColor1 = new spine.Color(); - var tempColor2 = new spine.Color(); - for (var i = 0, n = input.readInt(true); i < n; i++) { - var slotIndex = input.readInt(true); - for (var ii = 0, nn = input.readInt(true); ii < nn; ii++) { - var timelineType = input.readByte(); - var frameCount = input.readInt(true); - switch (timelineType) { - case SkeletonBinary.SLOT_ATTACHMENT: { - var timeline = new spine.AttachmentTimeline(frameCount); - timeline.slotIndex = slotIndex; - for (var 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: { - var timeline = new spine.ColorTimeline(frameCount); - timeline.slotIndex = slotIndex; - for (var frameIndex = 0; frameIndex < frameCount; frameIndex++) { - var time = input.readFloat(); - spine.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) * spine.ColorTimeline.ENTRIES]); - break; - } - case SkeletonBinary.SLOT_TWO_COLOR: { - var timeline = new spine.TwoColorTimeline(frameCount); - timeline.slotIndex = slotIndex; - for (var frameIndex = 0; frameIndex < frameCount; frameIndex++) { - var time = input.readFloat(); - spine.Color.rgba8888ToColor(tempColor1, input.readInt32()); - spine.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) * spine.TwoColorTimeline.ENTRIES]); - break; - } - } - } - } - for (var i = 0, n = input.readInt(true); i < n; i++) { - var boneIndex = input.readInt(true); - for (var ii = 0, nn = input.readInt(true); ii < nn; ii++) { - var timelineType = input.readByte(); - var frameCount = input.readInt(true); - switch (timelineType) { - case SkeletonBinary.BONE_ROTATE: { - var timeline = new spine.RotateTimeline(frameCount); - timeline.boneIndex = boneIndex; - for (var 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) * spine.RotateTimeline.ENTRIES]); - break; - } - case SkeletonBinary.BONE_TRANSLATE: - case SkeletonBinary.BONE_SCALE: - case SkeletonBinary.BONE_SHEAR: { - var timeline = void 0; - var timelineScale = 1; - if (timelineType == SkeletonBinary.BONE_SCALE) - timeline = new spine.ScaleTimeline(frameCount); - else if (timelineType == SkeletonBinary.BONE_SHEAR) - timeline = new spine.ShearTimeline(frameCount); - else { - timeline = new spine.TranslateTimeline(frameCount); - timelineScale = scale; - } - timeline.boneIndex = boneIndex; - for (var 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) * spine.TranslateTimeline.ENTRIES]); - break; - } - } - } - } - for (var i = 0, n = input.readInt(true); i < n; i++) { - var index = input.readInt(true); - var frameCount = input.readInt(true); - var timeline = new spine.IkConstraintTimeline(frameCount); - timeline.ikConstraintIndex = index; - for (var 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) * spine.IkConstraintTimeline.ENTRIES]); - } - for (var i = 0, n = input.readInt(true); i < n; i++) { - var index = input.readInt(true); - var frameCount = input.readInt(true); - var timeline = new spine.TransformConstraintTimeline(frameCount); - timeline.transformConstraintIndex = index; - for (var 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) * spine.TransformConstraintTimeline.ENTRIES]); - } - for (var i = 0, n = input.readInt(true); i < n; i++) { - var index = input.readInt(true); - var data = skeletonData.pathConstraints[index]; - for (var ii = 0, nn = input.readInt(true); ii < nn; ii++) { - var timelineType = input.readByte(); - var frameCount = input.readInt(true); - switch (timelineType) { - case SkeletonBinary.PATH_POSITION: - case SkeletonBinary.PATH_SPACING: { - var timeline = void 0; - var timelineScale = 1; - if (timelineType == SkeletonBinary.PATH_SPACING) { - timeline = new spine.PathConstraintSpacingTimeline(frameCount); - if (data.spacingMode == spine.SpacingMode.Length || data.spacingMode == spine.SpacingMode.Fixed) - timelineScale = scale; - } - else { - timeline = new spine.PathConstraintPositionTimeline(frameCount); - if (data.positionMode == spine.PositionMode.Fixed) - timelineScale = scale; - } - timeline.pathConstraintIndex = index; - for (var 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) * spine.PathConstraintPositionTimeline.ENTRIES]); - break; - } - case SkeletonBinary.PATH_MIX: { - var timeline = new spine.PathConstraintMixTimeline(frameCount); - timeline.pathConstraintIndex = index; - for (var 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) * spine.PathConstraintMixTimeline.ENTRIES]); - break; - } - } - } - } - for (var i = 0, n = input.readInt(true); i < n; i++) { - var skin = skeletonData.skins[input.readInt(true)]; - for (var ii = 0, nn = input.readInt(true); ii < nn; ii++) { - var slotIndex = input.readInt(true); - for (var iii = 0, nnn = input.readInt(true); iii < nnn; iii++) { - var attachment = skin.getAttachment(slotIndex, input.readStringRef()); - var weighted = attachment.bones != null; - var vertices = attachment.vertices; - var deformLength = weighted ? vertices.length / 3 * 2 : vertices.length; - var frameCount = input.readInt(true); - var timeline = new spine.DeformTimeline(frameCount); - timeline.slotIndex = slotIndex; - timeline.attachment = attachment; - for (var frameIndex = 0; frameIndex < frameCount; frameIndex++) { - var time = input.readFloat(); - var deform = void 0; - var end = input.readInt(true); - if (end == 0) - deform = weighted ? spine.Utils.newFloatArray(deformLength) : vertices; - else { - deform = spine.Utils.newFloatArray(deformLength); - var start = input.readInt(true); - end += start; - if (scale == 1) { - for (var v = start; v < end; v++) - deform[v] = input.readFloat(); - } - else { - for (var v = start; v < end; v++) - deform[v] = input.readFloat() * scale; - } - if (!weighted) { - for (var 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]); - } - } - } - var drawOrderCount = input.readInt(true); - if (drawOrderCount > 0) { - var timeline = new spine.DrawOrderTimeline(drawOrderCount); - var slotCount = skeletonData.slots.length; - for (var i = 0; i < drawOrderCount; i++) { - var time = input.readFloat(); - var offsetCount = input.readInt(true); - var drawOrder = spine.Utils.newArray(slotCount, 0); - for (var ii = slotCount - 1; ii >= 0; ii--) - drawOrder[ii] = -1; - var unchanged = spine.Utils.newArray(slotCount - offsetCount, 0); - var originalIndex = 0, unchangedIndex = 0; - for (var ii = 0; ii < offsetCount; ii++) { - var slotIndex = input.readInt(true); - while (originalIndex != slotIndex) - unchanged[unchangedIndex++] = originalIndex++; - drawOrder[originalIndex + input.readInt(true)] = originalIndex++; - } - while (originalIndex < slotCount) - unchanged[unchangedIndex++] = originalIndex++; - for (var 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]); - } - var eventCount = input.readInt(true); - if (eventCount > 0) { - var timeline = new spine.EventTimeline(eventCount); - for (var i = 0; i < eventCount; i++) { - var time = input.readFloat(); - var eventData = skeletonData.events[input.readInt(true)]; - var event_4 = new spine.Event(time, eventData); - event_4.intValue = input.readInt(false); - event_4.floatValue = input.readFloat(); - event_4.stringValue = input.readBoolean() ? input.readString() : eventData.stringValue; - if (event_4.data.audioPath != null) { - event_4.volume = input.readFloat(); - event_4.balance = input.readFloat(); - } - timeline.setFrame(i, event_4); - } - timelines.push(timeline); - duration = Math.max(duration, timeline.frames[eventCount - 1]); - } - return new spine.Animation(name, timelines, duration); - }; - SkeletonBinary.prototype.readCurve = function (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; - } - }; - SkeletonBinary.prototype.setCurve = function (timeline, frameIndex, cx1, cy1, cx2, cy2) { - timeline.setCurve(frameIndex, cx1, cy1, cx2, cy2); - }; - SkeletonBinary.AttachmentTypeValues = [0, 1, 2, 3, 4, 5, 6]; - SkeletonBinary.TransformModeValues = [spine.TransformMode.Normal, spine.TransformMode.OnlyTranslation, spine.TransformMode.NoRotationOrReflection, spine.TransformMode.NoScale, spine.TransformMode.NoScaleOrReflection]; - SkeletonBinary.PositionModeValues = [spine.PositionMode.Fixed, spine.PositionMode.Percent]; - SkeletonBinary.SpacingModeValues = [spine.SpacingMode.Length, spine.SpacingMode.Fixed, spine.SpacingMode.Percent]; - SkeletonBinary.RotateModeValues = [spine.RotateMode.Tangent, spine.RotateMode.Chain, spine.RotateMode.ChainScale]; - SkeletonBinary.BlendModeValues = [spine.BlendMode.Normal, spine.BlendMode.Additive, spine.BlendMode.Multiply, spine.BlendMode.Screen]; - SkeletonBinary.BONE_ROTATE = 0; - SkeletonBinary.BONE_TRANSLATE = 1; - SkeletonBinary.BONE_SCALE = 2; - SkeletonBinary.BONE_SHEAR = 3; - SkeletonBinary.SLOT_ATTACHMENT = 0; - SkeletonBinary.SLOT_COLOR = 1; - SkeletonBinary.SLOT_TWO_COLOR = 2; - SkeletonBinary.PATH_POSITION = 0; - SkeletonBinary.PATH_SPACING = 1; - SkeletonBinary.PATH_MIX = 2; - SkeletonBinary.CURVE_LINEAR = 0; - SkeletonBinary.CURVE_STEPPED = 1; - SkeletonBinary.CURVE_BEZIER = 2; - return SkeletonBinary; - }()); - spine.SkeletonBinary = SkeletonBinary; - var BinaryInput = (function () { - function BinaryInput(data, strings, index, buffer) { - if (strings === void 0) { strings = new Array(); } - if (index === void 0) { index = 0; } - if (buffer === void 0) { buffer = new DataView(data.buffer); } - this.strings = strings; - this.index = index; - this.buffer = buffer; - } - BinaryInput.prototype.readByte = function () { - return this.buffer.getInt8(this.index++); - }; - BinaryInput.prototype.readShort = function () { - var value = this.buffer.getInt16(this.index); - this.index += 2; - return value; - }; - BinaryInput.prototype.readInt32 = function () { - var value = this.buffer.getInt32(this.index); - this.index += 4; - return value; - }; - BinaryInput.prototype.readInt = function (optimizePositive) { - var b = this.readByte(); - var 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)); - }; - BinaryInput.prototype.readStringRef = function () { - var index = this.readInt(true); - return index == 0 ? null : this.strings[index - 1]; - }; - BinaryInput.prototype.readString = function () { - var byteCount = this.readInt(true); - switch (byteCount) { - case 0: - return null; - case 1: - return ""; - } - byteCount--; - var chars = ""; - var charCount = 0; - for (var i = 0; i < byteCount;) { - var 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; - }; - BinaryInput.prototype.readFloat = function () { - var value = this.buffer.getFloat32(this.index); - this.index += 4; - return value; - }; - BinaryInput.prototype.readBoolean = function () { - return this.readByte() != 0; - }; - return BinaryInput; - }()); - var LinkedMesh = (function () { - function LinkedMesh(mesh, skin, slotIndex, parent, inheritDeform) { - this.mesh = mesh; - this.skin = skin; - this.slotIndex = slotIndex; - this.parent = parent; - this.inheritDeform = inheritDeform; - } - return LinkedMesh; - }()); - var Vertices = (function () { - function Vertices(bones, vertices) { - if (bones === void 0) { bones = null; } - if (vertices === void 0) { vertices = null; } - this.bones = bones; - this.vertices = vertices; - } - return Vertices; - }()); -})(spine || (spine = {})); -var spine; -(function (spine) { - var SkeletonBounds = (function () { - function SkeletonBounds() { - this.minX = 0; - this.minY = 0; - this.maxX = 0; - this.maxY = 0; - this.boundingBoxes = new Array(); - this.polygons = new Array(); - this.polygonPool = new spine.Pool(function () { - return spine.Utils.newFloatArray(16); - }); +var spine = (() => { + var __defProp = Object.defineProperty; + var __markAsModule = (target) => __defProp(target, "__esModule", { value: true }); + var __export = (target, all) => { + __markAsModule(target); + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); + }; + + // spine-webgl/src/index.ts + var src_exports = {}; + __export(src_exports, { + AlphaTimeline: () => AlphaTimeline, + Animation: () => Animation, + AnimationState: () => AnimationState, + AnimationStateAdapter: () => AnimationStateAdapter, + AnimationStateData: () => AnimationStateData, + AssetManager: () => AssetManager, + AssetManagerBase: () => AssetManagerBase, + AtlasAttachmentLoader: () => AtlasAttachmentLoader, + Attachment: () => Attachment, + AttachmentTimeline: () => AttachmentTimeline, + BinaryInput: () => BinaryInput, + BlendMode: () => BlendMode, + Bone: () => Bone, + BoneData: () => BoneData, + BoundingBoxAttachment: () => BoundingBoxAttachment, + CURRENT: () => CURRENT, + CameraController: () => CameraController, + ClippingAttachment: () => ClippingAttachment, + Color: () => Color, + Color2Attribute: () => Color2Attribute, + ColorAttribute: () => ColorAttribute, + ConstraintData: () => ConstraintData, + CurveTimeline: () => CurveTimeline, + CurveTimeline1: () => CurveTimeline1, + CurveTimeline2: () => CurveTimeline2, + DebugUtils: () => DebugUtils, + DeformTimeline: () => DeformTimeline, + Downloader: () => Downloader, + DrawOrderTimeline: () => DrawOrderTimeline, + Event: () => Event, + EventData: () => EventData, + EventQueue: () => EventQueue, + EventTimeline: () => EventTimeline, + EventType: () => EventType, + FIRST: () => FIRST, + FakeTexture: () => FakeTexture, + GLTexture: () => GLTexture, + HOLD_FIRST: () => HOLD_FIRST, + HOLD_MIX: () => HOLD_MIX, + HOLD_SUBSEQUENT: () => HOLD_SUBSEQUENT, + IkConstraint: () => IkConstraint, + IkConstraintData: () => IkConstraintData, + IkConstraintTimeline: () => IkConstraintTimeline, + Input: () => Input, + IntSet: () => IntSet, + Interpolation: () => Interpolation, + JitterEffect: () => JitterEffect, + LoadingScreen: () => LoadingScreen, + M00: () => M00, + M01: () => M01, + M02: () => M02, + M03: () => M03, + M10: () => M10, + M11: () => M11, + M12: () => M12, + M13: () => M13, + M20: () => M20, + M21: () => M21, + M22: () => M22, + M23: () => M23, + M30: () => M30, + M31: () => M31, + M32: () => M32, + M33: () => M33, + ManagedWebGLRenderingContext: () => ManagedWebGLRenderingContext, + MathUtils: () => MathUtils, + Matrix4: () => Matrix42, + Mesh: () => Mesh, + MeshAttachment: () => MeshAttachment, + MixBlend: () => MixBlend, + MixDirection: () => MixDirection, + OrthoCamera: () => OrthoCamera, + PathAttachment: () => PathAttachment, + PathConstraint: () => PathConstraint, + PathConstraintData: () => PathConstraintData, + PathConstraintMixTimeline: () => PathConstraintMixTimeline, + PathConstraintPositionTimeline: () => PathConstraintPositionTimeline, + PathConstraintSpacingTimeline: () => PathConstraintSpacingTimeline, + PointAttachment: () => PointAttachment, + PolygonBatcher: () => PolygonBatcher, + Pool: () => Pool, + Position2Attribute: () => Position2Attribute, + Position3Attribute: () => Position3Attribute, + PositionMode: () => PositionMode, + Pow: () => Pow, + PowOut: () => PowOut, + RGB2Timeline: () => RGB2Timeline, + RGBA2Timeline: () => RGBA2Timeline, + RGBATimeline: () => RGBATimeline, + RGBTimeline: () => RGBTimeline, + RegionAttachment: () => RegionAttachment, + ResizeMode: () => ResizeMode, + RotateMode: () => RotateMode, + RotateTimeline: () => RotateTimeline, + SETUP: () => SETUP, + SUBSEQUENT: () => SUBSEQUENT, + ScaleTimeline: () => ScaleTimeline, + ScaleXTimeline: () => ScaleXTimeline, + ScaleYTimeline: () => ScaleYTimeline, + SceneRenderer: () => SceneRenderer, + Shader: () => Shader, + ShapeRenderer: () => ShapeRenderer, + ShapeType: () => ShapeType, + ShearTimeline: () => ShearTimeline, + ShearXTimeline: () => ShearXTimeline, + ShearYTimeline: () => ShearYTimeline, + Skeleton: () => Skeleton, + SkeletonBinary: () => SkeletonBinary, + SkeletonBounds: () => SkeletonBounds, + SkeletonClipping: () => SkeletonClipping, + SkeletonData: () => SkeletonData, + SkeletonDebugRenderer: () => SkeletonDebugRenderer, + SkeletonJson: () => SkeletonJson, + SkeletonRenderer: () => SkeletonRenderer, + Skin: () => Skin, + SkinEntry: () => SkinEntry, + Slot: () => Slot, + SlotData: () => SlotData, + SpacingMode: () => SpacingMode, + SpineCanvas: () => SpineCanvas, + StringSet: () => StringSet, + SwirlEffect: () => SwirlEffect, + TexCoordAttribute: () => TexCoordAttribute, + Texture: () => Texture, + TextureAtlas: () => TextureAtlas, + TextureAtlasPage: () => TextureAtlasPage, + TextureAtlasRegion: () => TextureAtlasRegion, + TextureFilter: () => TextureFilter, + TextureRegion: () => TextureRegion, + TextureWrap: () => TextureWrap, + TimeKeeper: () => TimeKeeper, + Timeline: () => Timeline, + Touch: () => Touch, + TrackEntry: () => TrackEntry, + TransformConstraint: () => TransformConstraint, + TransformConstraintData: () => TransformConstraintData, + TransformConstraintTimeline: () => TransformConstraintTimeline, + TransformMode: () => TransformMode, + TranslateTimeline: () => TranslateTimeline, + TranslateXTimeline: () => TranslateXTimeline, + TranslateYTimeline: () => TranslateYTimeline, + Triangulator: () => Triangulator, + Utils: () => Utils, + Vector2: () => Vector2, + Vector3: () => Vector3, + VertexAttachment: () => VertexAttachment, + VertexAttribute: () => VertexAttribute, + VertexAttributeType: () => VertexAttributeType, + WebGLBlendModeConverter: () => WebGLBlendModeConverter, + WindowedMean: () => WindowedMean + }); + + // spine-core/src/Utils.ts + var IntSet = class { + constructor() { + 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] != void 0; + } + remove(value) { + this.array[value | 0] = void 0; + } + clear() { + this.array.length = 0; + } + }; + var StringSet = class { + constructor() { + this.entries = {}; + this.size = 0; + } + add(value) { + let contains = this.entries[value]; + this.entries[value] = true; + if (!contains) { + this.size++; + return true; + } + return false; + } + 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) { + return this.entries[value]; + } + clear() { + this.entries = {}; + this.size = 0; + } + }; + var _Color = class { + 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; + return this.clamp(); + } + 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; + this.g = parseInt(hex.substr(2, 2), 16) / 255; + this.b = parseInt(hex.substr(4, 2), 16) / 255; + this.a = hex.length != 8 ? 1 : parseInt(hex.substr(6, 2), 16) / 255; + return this; + } + add(r, g, b, a) { + this.r += r; + this.g += g; + this.b += b; + this.a += a; + return this.clamp(); + } + 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 & 4278190080) >>> 24) / 255; + color.g = ((value & 16711680) >>> 16) / 255; + color.b = ((value & 65280) >>> 8) / 255; + color.a = (value & 255) / 255; + } + static rgb888ToColor(color, value) { + color.r = ((value & 16711680) >>> 16) / 255; + color.g = ((value & 65280) >>> 8) / 255; + color.b = (value & 255) / 255; + } + static fromString(hex) { + return new _Color().setFromString(hex); + } + }; + var Color = _Color; + Color.WHITE = new _Color(1, 1, 1, 1); + Color.RED = new _Color(1, 0, 0, 1); + Color.GREEN = new _Color(0, 1, 0, 1); + Color.BLUE = new _Color(0, 0, 1, 1); + Color.MAGENTA = new _Color(1, 0, 1, 1); + var _MathUtils = class { + 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)); + } + static isPowerOfTwo(value) { + return value && (value & value - 1) === 0; + } + }; + var MathUtils = _MathUtils; + MathUtils.PI = 3.1415927; + MathUtils.PI2 = _MathUtils.PI * 2; + MathUtils.radiansToDegrees = 180 / _MathUtils.PI; + MathUtils.radDeg = _MathUtils.radiansToDegrees; + MathUtils.degreesToRadians = _MathUtils.PI / 180; + MathUtils.degRad = _MathUtils.degreesToRadians; + var Interpolation = class { + apply(start, end, a) { + return start + (end - start) * this.applyInternal(a); + } + }; + var Pow = class extends Interpolation { + constructor(power) { + super(); + this.power = 2; + 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; + } + }; + var PowOut = class extends Pow { + constructor(power) { + super(power); + } + applyInternal(a) { + return Math.pow(a - 1, this.power) * (this.power % 2 == 0 ? -1 : 1) + 1; + } + }; + var _Utils = class { + 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 ? Math.fround(value) : value; + } + static webkit602BugfixHelper(alpha, blend) { + } + static contains(array, element, identity = true) { + for (var i = 0; i < array.length; i++) + if (array[i] == element) + return true; + return false; + } + static enumValue(type, name) { + return type[name[0].toUpperCase() + name.slice(1)]; + } + }; + var Utils = _Utils; + Utils.SUPPORTS_TYPED_ARRAYS = typeof Float32Array !== "undefined"; + var DebugUtils = class { + static logBones(skeleton) { + for (let i = 0; i < skeleton.bones.length; i++) { + let bone = skeleton.bones[i]; + console.log(bone.data.name + ", " + bone.a + ", " + bone.b + ", " + bone.c + ", " + bone.d + ", " + bone.worldX + ", " + bone.worldY); + } + } + }; + var Pool = class { + constructor(instantiator) { + this.items = new Array(); + 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; + } + }; + var Vector2 = class { + 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; + } + }; + var TimeKeeper = class { + constructor() { + this.maxDelta = 0.064; + this.framesPerSecond = 0; + this.delta = 0; + this.totalTime = 0; + this.lastTime = Date.now() / 1e3; + this.frameCount = 0; + this.frameTime = 0; + } + update() { + let now = Date.now() / 1e3; + 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; + } + } + }; + var WindowedMean = class { + constructor(windowSize = 32) { + this.addedValues = 0; + this.lastValue = 0; + this.mean = 0; + this.dirty = true; + 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; } - SkeletonBounds.prototype.update = function (skeleton, updateAabb) { - if (skeleton == null) - throw new Error("skeleton cannot be null."); - var boundingBoxes = this.boundingBoxes; - var polygons = this.polygons; - var polygonPool = this.polygonPool; - var slots = skeleton.slots; - var slotCount = slots.length; - boundingBoxes.length = 0; - polygonPool.freeAll(polygons); - polygons.length = 0; - for (var i = 0; i < slotCount; i++) { - var slot = slots[i]; - if (!slot.bone.active) - continue; - var attachment = slot.getAttachment(); - if (attachment instanceof spine.BoundingBoxAttachment) { - var boundingBox = attachment; - boundingBoxes.push(boundingBox); - var polygon = polygonPool.obtain(); - if (polygon.length != boundingBox.worldVerticesLength) { - polygon = spine.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; - } - }; - SkeletonBounds.prototype.aabbCompute = function () { - var minX = Number.POSITIVE_INFINITY, minY = Number.POSITIVE_INFINITY, maxX = Number.NEGATIVE_INFINITY, maxY = Number.NEGATIVE_INFINITY; - var polygons = this.polygons; - for (var i = 0, n = polygons.length; i < n; i++) { - var polygon = polygons[i]; - var vertices = polygon; - for (var ii = 0, nn = polygon.length; ii < nn; ii += 2) { - var x = vertices[ii]; - var 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; - }; - SkeletonBounds.prototype.aabbContainsPoint = function (x, y) { - return x >= this.minX && x <= this.maxX && y >= this.minY && y <= this.maxY; - }; - SkeletonBounds.prototype.aabbIntersectsSegment = function (x1, y1, x2, y2) { - var minX = this.minX; - var minY = this.minY; - var maxX = this.maxX; - var maxY = this.maxY; - if ((x1 <= minX && x2 <= minX) || (y1 <= minY && y2 <= minY) || (x1 >= maxX && x2 >= maxX) || (y1 >= maxY && y2 >= maxY)) - return false; - var m = (y2 - y1) / (x2 - x1); - var y = m * (minX - x1) + y1; - if (y > minY && y < maxY) - return true; - y = m * (maxX - x1) + y1; - if (y > minY && y < maxY) - return true; - var 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; - }; - SkeletonBounds.prototype.aabbIntersectsSkeleton = function (bounds) { - return this.minX < bounds.maxX && this.maxX > bounds.minX && this.minY < bounds.maxY && this.maxY > bounds.minY; - }; - SkeletonBounds.prototype.containsPoint = function (x, y) { - var polygons = this.polygons; - for (var i = 0, n = polygons.length; i < n; i++) - if (this.containsPointPolygon(polygons[i], x, y)) - return this.boundingBoxes[i]; - return null; - }; - SkeletonBounds.prototype.containsPointPolygon = function (polygon, x, y) { - var vertices = polygon; - var nn = polygon.length; - var prevIndex = nn - 2; - var inside = false; - for (var ii = 0; ii < nn; ii += 2) { - var vertexY = vertices[ii + 1]; - var prevY = vertices[prevIndex + 1]; - if ((vertexY < y && prevY >= y) || (prevY < y && vertexY >= y)) { - var vertexX = vertices[ii]; - if (vertexX + (y - vertexY) / (prevY - vertexY) * (vertices[prevIndex] - vertexX) < x) - inside = !inside; - } - prevIndex = ii; - } - return inside; - }; - SkeletonBounds.prototype.intersectsSegment = function (x1, y1, x2, y2) { - var polygons = this.polygons; - for (var i = 0, n = polygons.length; i < n; i++) - if (this.intersectsSegmentPolygon(polygons[i], x1, y1, x2, y2)) - return this.boundingBoxes[i]; - return null; - }; - SkeletonBounds.prototype.intersectsSegmentPolygon = function (polygon, x1, y1, x2, y2) { - var vertices = polygon; - var nn = polygon.length; - var width12 = x1 - x2, height12 = y1 - y2; - var det1 = x1 * y2 - y1 * x2; - var x3 = vertices[nn - 2], y3 = vertices[nn - 1]; - for (var ii = 0; ii < nn; ii += 2) { - var x4 = vertices[ii], y4 = vertices[ii + 1]; - var det2 = x3 * y4 - y3 * x4; - var width34 = x3 - x4, height34 = y3 - y4; - var det3 = width12 * height34 - height12 * width34; - var x = (det1 * width34 - width12 * det2) / det3; - if (((x >= x3 && x <= x4) || (x >= x4 && x <= x3)) && ((x >= x1 && x <= x2) || (x >= x2 && x <= x1))) { - var 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; - }; - SkeletonBounds.prototype.getPolygon = function (boundingBox) { - if (boundingBox == null) - throw new Error("boundingBox cannot be null."); - var index = this.boundingBoxes.indexOf(boundingBox); - return index == -1 ? null : this.polygons[index]; - }; - SkeletonBounds.prototype.getWidth = function () { - return this.maxX - this.minX; - }; - SkeletonBounds.prototype.getHeight = function () { - return this.maxY - this.minY; - }; - return SkeletonBounds; - }()); - spine.SkeletonBounds = SkeletonBounds; -})(spine || (spine = {})); -var spine; -(function (spine) { - var SkeletonClipping = (function () { - function SkeletonClipping() { - this.triangulator = new spine.Triangulator(); - this.clippingPolygon = new Array(); - this.clipOutput = new Array(); - this.clippedVertices = new Array(); - this.clippedTriangles = new Array(); - this.scratch = new Array(); - } - SkeletonClipping.prototype.clipStart = function (slot, clip) { - if (this.clipAttachment != null) - return 0; - this.clipAttachment = clip; - var n = clip.worldVerticesLength; - var vertices = spine.Utils.setArraySize(this.clippingPolygon, n); - clip.computeWorldVertices(slot, 0, n, vertices, 0, 2); - var clippingPolygon = this.clippingPolygon; - SkeletonClipping.makeClockwise(clippingPolygon); - var clippingPolygons = this.clippingPolygons = this.triangulator.decompose(clippingPolygon, this.triangulator.triangulate(clippingPolygon)); - for (var i = 0, n_2 = clippingPolygons.length; i < n_2; i++) { - var polygon = clippingPolygons[i]; - SkeletonClipping.makeClockwise(polygon); - polygon.push(polygon[0]); - polygon.push(polygon[1]); - } - return clippingPolygons.length; - }; - SkeletonClipping.prototype.clipEndWithSlot = function (slot) { - if (this.clipAttachment != null && this.clipAttachment.endSlot == slot.data) - this.clipEnd(); - }; - SkeletonClipping.prototype.clipEnd = function () { - if (this.clipAttachment == null) - return; - this.clipAttachment = null; - this.clippingPolygons = null; - this.clippedVertices.length = 0; - this.clippedTriangles.length = 0; - this.clippingPolygon.length = 0; - }; - SkeletonClipping.prototype.isClipping = function () { - return this.clipAttachment != null; - }; - SkeletonClipping.prototype.clipTriangles = function (vertices, verticesLength, triangles, trianglesLength, uvs, light, dark, twoColor) { - var clipOutput = this.clipOutput, clippedVertices = this.clippedVertices; - var clippedTriangles = this.clippedTriangles; - var polygons = this.clippingPolygons; - var polygonsCount = this.clippingPolygons.length; - var vertexSize = twoColor ? 12 : 8; - var index = 0; - clippedVertices.length = 0; - clippedTriangles.length = 0; - outer: for (var i = 0; i < trianglesLength; i += 3) { - var vertexOffset = triangles[i] << 1; - var x1 = vertices[vertexOffset], y1 = vertices[vertexOffset + 1]; - var u1 = uvs[vertexOffset], v1 = uvs[vertexOffset + 1]; - vertexOffset = triangles[i + 1] << 1; - var x2 = vertices[vertexOffset], y2 = vertices[vertexOffset + 1]; - var u2 = uvs[vertexOffset], v2 = uvs[vertexOffset + 1]; - vertexOffset = triangles[i + 2] << 1; - var x3 = vertices[vertexOffset], y3 = vertices[vertexOffset + 1]; - var u3 = uvs[vertexOffset], v3 = uvs[vertexOffset + 1]; - for (var p = 0; p < polygonsCount; p++) { - var s = clippedVertices.length; - if (this.clip(x1, y1, x2, y2, x3, y3, polygons[p], clipOutput)) { - var clipOutputLength = clipOutput.length; - if (clipOutputLength == 0) - continue; - var d0 = y2 - y3, d1 = x3 - x2, d2 = x1 - x3, d4 = y3 - y1; - var d = 1 / (d0 * d2 + d1 * (y1 - y3)); - var clipOutputCount = clipOutputLength >> 1; - var clipOutputItems = this.clipOutput; - var clippedVerticesItems = spine.Utils.setArraySize(clippedVertices, s + clipOutputCount * vertexSize); - for (var ii = 0; ii < clipOutputLength; ii += 2) { - var x = clipOutputItems[ii], y = clipOutputItems[ii + 1]; - clippedVerticesItems[s] = x; - clippedVerticesItems[s + 1] = y; - clippedVerticesItems[s + 2] = light.r; - clippedVerticesItems[s + 3] = light.g; - clippedVerticesItems[s + 4] = light.b; - clippedVerticesItems[s + 5] = light.a; - var c0 = x - x3, c1 = y - y3; - var a = (d0 * c0 + d1 * c1) * d; - var b = (d4 * c0 + d2 * c1) * d; - var c = 1 - a - b; - clippedVerticesItems[s + 6] = u1 * a + u2 * b + u3 * c; - clippedVerticesItems[s + 7] = v1 * a + v2 * b + v3 * c; - if (twoColor) { - clippedVerticesItems[s + 8] = dark.r; - clippedVerticesItems[s + 9] = dark.g; - clippedVerticesItems[s + 10] = dark.b; - clippedVerticesItems[s + 11] = dark.a; - } - s += vertexSize; - } - s = clippedTriangles.length; - var clippedTrianglesItems = spine.Utils.setArraySize(clippedTriangles, s + 3 * (clipOutputCount - 2)); - clipOutputCount--; - for (var ii = 1; ii < clipOutputCount; ii++) { - clippedTrianglesItems[s] = index; - clippedTrianglesItems[s + 1] = (index + ii); - clippedTrianglesItems[s + 2] = (index + ii + 1); - s += 3; - } - index += clipOutputCount + 1; - } - else { - var clippedVerticesItems = spine.Utils.setArraySize(clippedVertices, s + 3 * vertexSize); - clippedVerticesItems[s] = x1; - clippedVerticesItems[s + 1] = y1; - clippedVerticesItems[s + 2] = light.r; - clippedVerticesItems[s + 3] = light.g; - clippedVerticesItems[s + 4] = light.b; - clippedVerticesItems[s + 5] = light.a; - if (!twoColor) { - clippedVerticesItems[s + 6] = u1; - clippedVerticesItems[s + 7] = v1; - clippedVerticesItems[s + 8] = x2; - clippedVerticesItems[s + 9] = y2; - clippedVerticesItems[s + 10] = light.r; - clippedVerticesItems[s + 11] = light.g; - clippedVerticesItems[s + 12] = light.b; - clippedVerticesItems[s + 13] = light.a; - clippedVerticesItems[s + 14] = u2; - clippedVerticesItems[s + 15] = v2; - clippedVerticesItems[s + 16] = x3; - clippedVerticesItems[s + 17] = y3; - clippedVerticesItems[s + 18] = light.r; - clippedVerticesItems[s + 19] = light.g; - clippedVerticesItems[s + 20] = light.b; - clippedVerticesItems[s + 21] = light.a; - clippedVerticesItems[s + 22] = u3; - clippedVerticesItems[s + 23] = v3; - } - else { - clippedVerticesItems[s + 6] = u1; - clippedVerticesItems[s + 7] = v1; - clippedVerticesItems[s + 8] = dark.r; - clippedVerticesItems[s + 9] = dark.g; - clippedVerticesItems[s + 10] = dark.b; - clippedVerticesItems[s + 11] = dark.a; - clippedVerticesItems[s + 12] = x2; - clippedVerticesItems[s + 13] = y2; - clippedVerticesItems[s + 14] = light.r; - clippedVerticesItems[s + 15] = light.g; - clippedVerticesItems[s + 16] = light.b; - clippedVerticesItems[s + 17] = light.a; - clippedVerticesItems[s + 18] = u2; - clippedVerticesItems[s + 19] = v2; - clippedVerticesItems[s + 20] = dark.r; - clippedVerticesItems[s + 21] = dark.g; - clippedVerticesItems[s + 22] = dark.b; - clippedVerticesItems[s + 23] = dark.a; - clippedVerticesItems[s + 24] = x3; - clippedVerticesItems[s + 25] = y3; - clippedVerticesItems[s + 26] = light.r; - clippedVerticesItems[s + 27] = light.g; - clippedVerticesItems[s + 28] = light.b; - clippedVerticesItems[s + 29] = light.a; - clippedVerticesItems[s + 30] = u3; - clippedVerticesItems[s + 31] = v3; - clippedVerticesItems[s + 32] = dark.r; - clippedVerticesItems[s + 33] = dark.g; - clippedVerticesItems[s + 34] = dark.b; - clippedVerticesItems[s + 35] = dark.a; - } - s = clippedTriangles.length; - var clippedTrianglesItems = spine.Utils.setArraySize(clippedTriangles, s + 3); - clippedTrianglesItems[s] = index; - clippedTrianglesItems[s + 1] = (index + 1); - clippedTrianglesItems[s + 2] = (index + 2); - index += 3; - continue outer; - } - } - } - }; - SkeletonClipping.prototype.clip = function (x1, y1, x2, y2, x3, y3, clippingArea, output) { - var originalOutput = output; - var clipped = false; - var input = null; - if (clippingArea.length % 4 >= 2) { - input = output; - output = this.scratch; - } - else - input = this.scratch; - input.length = 0; - input.push(x1); - input.push(y1); - input.push(x2); - input.push(y2); - input.push(x3); - input.push(y3); - input.push(x1); - input.push(y1); - output.length = 0; - var clippingVertices = clippingArea; - var clippingVerticesLast = clippingArea.length - 4; - for (var i = 0;; i += 2) { - var edgeX = clippingVertices[i], edgeY = clippingVertices[i + 1]; - var edgeX2 = clippingVertices[i + 2], edgeY2 = clippingVertices[i + 3]; - var deltaX = edgeX - edgeX2, deltaY = edgeY - edgeY2; - var inputVertices = input; - var inputVerticesLength = input.length - 2, outputStart = output.length; - for (var ii = 0; ii < inputVerticesLength; ii += 2) { - var inputX = inputVertices[ii], inputY = inputVertices[ii + 1]; - var inputX2 = inputVertices[ii + 2], inputY2 = inputVertices[ii + 3]; - var side2 = deltaX * (inputY2 - edgeY2) - deltaY * (inputX2 - edgeX2) > 0; - if (deltaX * (inputY - edgeY2) - deltaY * (inputX - edgeX2) > 0) { - if (side2) { - output.push(inputX2); - output.push(inputY2); - continue; - } - var c0 = inputY2 - inputY, c2 = inputX2 - inputX; - var s = c0 * (edgeX2 - edgeX) - c2 * (edgeY2 - edgeY); - if (Math.abs(s) > 0.000001) { - var ua = (c2 * (edgeY - inputY) - c0 * (edgeX - inputX)) / s; - output.push(edgeX + (edgeX2 - edgeX) * ua); - output.push(edgeY + (edgeY2 - edgeY) * ua); - } - else { - output.push(edgeX); - output.push(edgeY); - } - } - else if (side2) { - var c0 = inputY2 - inputY, c2 = inputX2 - inputX; - var s = c0 * (edgeX2 - edgeX) - c2 * (edgeY2 - edgeY); - if (Math.abs(s) > 0.000001) { - var ua = (c2 * (edgeY - inputY) - c0 * (edgeX - inputX)) / s; - output.push(edgeX + (edgeX2 - edgeX) * ua); - output.push(edgeY + (edgeY2 - edgeY) * ua); - } - else { - output.push(edgeX); - output.push(edgeY); - } - output.push(inputX2); - output.push(inputY2); - } - clipped = true; - } - if (outputStart == output.length) { - originalOutput.length = 0; - return true; - } - output.push(output[0]); - output.push(output[1]); - if (i == clippingVerticesLast) - break; - var temp = output; - output = input; - output.length = 0; - input = temp; - } - if (originalOutput != output) { - originalOutput.length = 0; - for (var i = 0, n = output.length - 2; i < n; i++) - originalOutput[i] = output[i]; - } - else - originalOutput.length = originalOutput.length - 2; - return clipped; - }; - SkeletonClipping.makeClockwise = function (polygon) { - var vertices = polygon; - var verticeslength = polygon.length; - var area = vertices[verticeslength - 2] * vertices[1] - vertices[0] * vertices[verticeslength - 1], p1x = 0, p1y = 0, p2x = 0, p2y = 0; - for (var i = 0, n = verticeslength - 3; i < n; i += 2) { - p1x = vertices[i]; - p1y = vertices[i + 1]; - p2x = vertices[i + 2]; - p2y = vertices[i + 3]; - area += p1x * p2y - p2x * p1y; - } - if (area < 0) - return; - for (var i = 0, lastX = verticeslength - 2, n = verticeslength >> 1; i < n; i += 2) { - var x = vertices[i], y = vertices[i + 1]; - var other = lastX - i; - vertices[i] = vertices[other]; - vertices[i + 1] = vertices[other + 1]; - vertices[other] = x; - vertices[other + 1] = y; - } - }; - return SkeletonClipping; - }()); - spine.SkeletonClipping = SkeletonClipping; -})(spine || (spine = {})); -var spine; -(function (spine) { - var SkeletonData = (function () { - function SkeletonData() { - this.bones = new Array(); - this.slots = new Array(); - this.skins = new Array(); - this.events = new Array(); - this.animations = new Array(); - this.ikConstraints = new Array(); - this.transformConstraints = new Array(); - this.pathConstraints = new Array(); - this.fps = 0; - } - SkeletonData.prototype.findBone = function (boneName) { - if (boneName == null) - throw new Error("boneName cannot be null."); - var bones = this.bones; - for (var i = 0, n = bones.length; i < n; i++) { - var bone = bones[i]; - if (bone.name == boneName) - return bone; - } - return null; - }; - SkeletonData.prototype.findBoneIndex = function (boneName) { - if (boneName == null) - throw new Error("boneName cannot be null."); - var bones = this.bones; - for (var i = 0, n = bones.length; i < n; i++) - if (bones[i].name == boneName) - return i; - return -1; - }; - SkeletonData.prototype.findSlot = function (slotName) { - if (slotName == null) - throw new Error("slotName cannot be null."); - var slots = this.slots; - for (var i = 0, n = slots.length; i < n; i++) { - var slot = slots[i]; - if (slot.name == slotName) - return slot; - } - return null; - }; - SkeletonData.prototype.findSlotIndex = function (slotName) { - if (slotName == null) - throw new Error("slotName cannot be null."); - var slots = this.slots; - for (var i = 0, n = slots.length; i < n; i++) - if (slots[i].name == slotName) - return i; - return -1; - }; - SkeletonData.prototype.findSkin = function (skinName) { - if (skinName == null) - throw new Error("skinName cannot be null."); - var skins = this.skins; - for (var i = 0, n = skins.length; i < n; i++) { - var skin = skins[i]; - if (skin.name == skinName) - return skin; - } - return null; - }; - SkeletonData.prototype.findEvent = function (eventDataName) { - if (eventDataName == null) - throw new Error("eventDataName cannot be null."); - var events = this.events; - for (var i = 0, n = events.length; i < n; i++) { - var event_5 = events[i]; - if (event_5.name == eventDataName) - return event_5; - } - return null; - }; - SkeletonData.prototype.findAnimation = function (animationName) { - if (animationName == null) - throw new Error("animationName cannot be null."); - var animations = this.animations; - for (var i = 0, n = animations.length; i < n; i++) { - var animation = animations[i]; - if (animation.name == animationName) - return animation; - } - return null; - }; - SkeletonData.prototype.findIkConstraint = function (constraintName) { - if (constraintName == null) - throw new Error("constraintName cannot be null."); - var ikConstraints = this.ikConstraints; - for (var i = 0, n = ikConstraints.length; i < n; i++) { - var constraint = ikConstraints[i]; - if (constraint.name == constraintName) - return constraint; - } - return null; - }; - SkeletonData.prototype.findTransformConstraint = function (constraintName) { - if (constraintName == null) - throw new Error("constraintName cannot be null."); - var transformConstraints = this.transformConstraints; - for (var i = 0, n = transformConstraints.length; i < n; i++) { - var constraint = transformConstraints[i]; - if (constraint.name == constraintName) - return constraint; - } - return null; - }; - SkeletonData.prototype.findPathConstraint = function (constraintName) { - if (constraintName == null) - throw new Error("constraintName cannot be null."); - var pathConstraints = this.pathConstraints; - for (var i = 0, n = pathConstraints.length; i < n; i++) { - var constraint = pathConstraints[i]; - if (constraint.name == constraintName) - return constraint; - } - return null; - }; - SkeletonData.prototype.findPathConstraintIndex = function (pathConstraintName) { - if (pathConstraintName == null) - throw new Error("pathConstraintName cannot be null."); - var pathConstraints = this.pathConstraints; - for (var i = 0, n = pathConstraints.length; i < n; i++) - if (pathConstraints[i].name == pathConstraintName) - return i; - return -1; - }; - return SkeletonData; - }()); - spine.SkeletonData = SkeletonData; -})(spine || (spine = {})); -var spine; -(function (spine) { - var SkeletonJson = (function () { - function SkeletonJson(attachmentLoader) { - this.scale = 1; - this.linkedMeshes = new Array(); - this.attachmentLoader = attachmentLoader; - } - SkeletonJson.prototype.readSkeletonData = function (json) { - var scale = this.scale; - var skeletonData = new spine.SkeletonData(); - var root = typeof (json) === "string" ? JSON.parse(json) : json; - var skeletonMap = root.skeleton; - if (skeletonMap != null) { - skeletonData.hash = skeletonMap.hash; - skeletonData.version = skeletonMap.spine; - if ("3.8.75" == skeletonData.version) - throw new Error("Unsupported skeleton data, please export with a newer version of Spine."); - skeletonData.x = skeletonMap.x; - skeletonData.y = skeletonMap.y; - skeletonData.width = skeletonMap.width; - skeletonData.height = skeletonMap.height; - skeletonData.fps = skeletonMap.fps; - skeletonData.imagesPath = skeletonMap.images; - } - if (root.bones) { - for (var i = 0; i < root.bones.length; i++) { - var boneMap = root.bones[i]; - var parent_5 = null; - var parentName = this.getValue(boneMap, "parent", null); - if (parentName != null) { - parent_5 = skeletonData.findBone(parentName); - if (parent_5 == null) - throw new Error("Parent bone not found: " + parentName); - } - var data = new spine.BoneData(skeletonData.bones.length, boneMap.name, parent_5); - 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); - } - } - if (root.slots) { - for (var i = 0; i < root.slots.length; i++) { - var slotMap = root.slots[i]; - var slotName = slotMap.name; - var boneName = slotMap.bone; - var boneData = skeletonData.findBone(boneName); - if (boneData == null) - throw new Error("Slot bone not found: " + boneName); - var data = new spine.SlotData(skeletonData.slots.length, slotName, boneData); - var color = this.getValue(slotMap, "color", null); - if (color != null) - data.color.setFromString(color); - var dark = this.getValue(slotMap, "dark", null); - if (dark != null) { - data.darkColor = new spine.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); - } - } - if (root.ik) { - for (var i = 0; i < root.ik.length; i++) { - var constraintMap = root.ik[i]; - var data = new spine.IkConstraintData(constraintMap.name); - data.order = this.getValue(constraintMap, "order", 0); - data.skinRequired = this.getValue(constraintMap, "skin", false); - for (var j = 0; j < constraintMap.bones.length; j++) { - var boneName = constraintMap.bones[j]; - var bone = skeletonData.findBone(boneName); - if (bone == null) - throw new Error("IK bone not found: " + boneName); - data.bones.push(bone); - } - var 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); - } - } - if (root.transform) { - for (var i = 0; i < root.transform.length; i++) { - var constraintMap = root.transform[i]; - var data = new spine.TransformConstraintData(constraintMap.name); - data.order = this.getValue(constraintMap, "order", 0); - data.skinRequired = this.getValue(constraintMap, "skin", false); - for (var j = 0; j < constraintMap.bones.length; j++) { - var boneName = constraintMap.bones[j]; - var bone = skeletonData.findBone(boneName); - if (bone == null) - throw new Error("Transform constraint bone not found: " + boneName); - data.bones.push(bone); - } - var 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); - } - } - if (root.path) { - for (var i = 0; i < root.path.length; i++) { - var constraintMap = root.path[i]; - var data = new spine.PathConstraintData(constraintMap.name); - data.order = this.getValue(constraintMap, "order", 0); - data.skinRequired = this.getValue(constraintMap, "skin", false); - for (var j = 0; j < constraintMap.bones.length; j++) { - var boneName = constraintMap.bones[j]; - var bone = skeletonData.findBone(boneName); - if (bone == null) - throw new Error("Transform constraint bone not found: " + boneName); - data.bones.push(bone); - } - var 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 == spine.PositionMode.Fixed) - data.position *= scale; - data.spacing = this.getValue(constraintMap, "spacing", 0); - if (data.spacingMode == spine.SpacingMode.Length || data.spacingMode == spine.SpacingMode.Fixed) - data.spacing *= scale; - data.rotateMix = this.getValue(constraintMap, "rotateMix", 1); - data.translateMix = this.getValue(constraintMap, "translateMix", 1); - skeletonData.pathConstraints.push(data); - } - } - if (root.skins) { - for (var i = 0; i < root.skins.length; i++) { - var skinMap = root.skins[i]; - var skin = new spine.Skin(skinMap.name); - if (skinMap.bones) { - for (var ii = 0; ii < skinMap.bones.length; ii++) { - var 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 (var ii = 0; ii < skinMap.ik.length; ii++) { - var 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 (var ii = 0; ii < skinMap.transform.length; ii++) { - var 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 (var ii = 0; ii < skinMap.path.length; ii++) { - var 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 (var slotName in skinMap.attachments) { - var slot = skeletonData.findSlot(slotName); - if (slot == null) - throw new Error("Slot not found: " + slotName); - var slotMap = skinMap.attachments[slotName]; - for (var entryName in slotMap) { - var 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; - } - } - for (var i = 0, n = this.linkedMeshes.length; i < n; i++) { - var linkedMesh = this.linkedMeshes[i]; - var skin = linkedMesh.skin == null ? skeletonData.defaultSkin : skeletonData.findSkin(linkedMesh.skin); - if (skin == null) - throw new Error("Skin not found: " + linkedMesh.skin); - var parent_6 = skin.getAttachment(linkedMesh.slotIndex, linkedMesh.parent); - if (parent_6 == null) - throw new Error("Parent mesh not found: " + linkedMesh.parent); - linkedMesh.mesh.deformAttachment = linkedMesh.inheritDeform ? parent_6 : linkedMesh.mesh; - linkedMesh.mesh.setParentMesh(parent_6); - linkedMesh.mesh.updateUVs(); - } - this.linkedMeshes.length = 0; - if (root.events) { - for (var eventName in root.events) { - var eventMap = root.events[eventName]; - var data = new spine.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); - } - } - if (root.animations) { - for (var animationName in root.animations) { - var animationMap = root.animations[animationName]; - this.readAnimation(animationMap, animationName, skeletonData); - } - } - return skeletonData; - }; - SkeletonJson.prototype.readAttachment = function (map, skin, slotIndex, name, skeletonData) { - var scale = this.scale; - name = this.getValue(map, "name", name); - var type = this.getValue(map, "type", "region"); - switch (type) { - case "region": { - var path = this.getValue(map, "path", name); - var 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; - var color = this.getValue(map, "color", null); - if (color != null) - region.color.setFromString(color); - region.updateOffset(); - return region; - } - case "boundingbox": { - var box = this.attachmentLoader.newBoundingBoxAttachment(skin, name); - if (box == null) - return null; - this.readVertices(map, box, map.vertexCount << 1); - var color = this.getValue(map, "color", null); - if (color != null) - box.color.setFromString(color); - return box; - } - case "mesh": - case "linkedmesh": { - var path = this.getValue(map, "path", name); - var mesh = this.attachmentLoader.newMeshAttachment(skin, name, path); - if (mesh == null) - return null; - mesh.path = path; - var 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; - var parent_7 = this.getValue(map, "parent", null); - if (parent_7 != null) { - this.linkedMeshes.push(new LinkedMesh(mesh, this.getValue(map, "skin", null), slotIndex, parent_7, this.getValue(map, "deform", true))); - return mesh; - } - var uvs = map.uvs; - this.readVertices(map, mesh, uvs.length); - mesh.triangles = map.triangles; - mesh.regionUVs = uvs; - mesh.updateUVs(); - mesh.edges = this.getValue(map, "edges", null); - mesh.hullLength = this.getValue(map, "hull", 0) * 2; - return mesh; - } - case "path": { - var 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); - var vertexCount = map.vertexCount; - this.readVertices(map, path, vertexCount << 1); - var lengths = spine.Utils.newArray(vertexCount / 3, 0); - for (var i = 0; i < map.lengths.length; i++) - lengths[i] = map.lengths[i] * scale; - path.lengths = lengths; - var color = this.getValue(map, "color", null); - if (color != null) - path.color.setFromString(color); - return path; - } - case "point": { - var 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); - var color = this.getValue(map, "color", null); - if (color != null) - point.color.setFromString(color); - return point; - } - case "clipping": { - var clip = this.attachmentLoader.newClippingAttachment(skin, name); - if (clip == null) - return null; - var end = this.getValue(map, "end", null); - if (end != null) { - var slot = skeletonData.findSlot(end); - if (slot == null) - throw new Error("Clipping end slot not found: " + end); - clip.endSlot = slot; - } - var vertexCount = map.vertexCount; - this.readVertices(map, clip, vertexCount << 1); - var color = this.getValue(map, "color", null); - if (color != null) - clip.color.setFromString(color); - return clip; - } - } - return null; - }; - SkeletonJson.prototype.readVertices = function (map, attachment, verticesLength) { - var scale = this.scale; - attachment.worldVerticesLength = verticesLength; - var vertices = map.vertices; - if (verticesLength == vertices.length) { - var scaledVertices = spine.Utils.toFloatArray(vertices); - if (scale != 1) { - for (var i = 0, n = vertices.length; i < n; i++) - scaledVertices[i] *= scale; - } - attachment.vertices = scaledVertices; - return; - } - var weights = new Array(); - var bones = new Array(); - for (var i = 0, n = vertices.length; i < n;) { - var boneCount = vertices[i++]; - bones.push(boneCount); - for (var 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 = spine.Utils.toFloatArray(weights); - }; - SkeletonJson.prototype.readAnimation = function (map, name, skeletonData) { - var scale = this.scale; - var timelines = new Array(); - var duration = 0; - if (map.slots) { - for (var slotName in map.slots) { - var slotMap = map.slots[slotName]; - var slotIndex = skeletonData.findSlotIndex(slotName); - if (slotIndex == -1) - throw new Error("Slot not found: " + slotName); - for (var timelineName in slotMap) { - var timelineMap = slotMap[timelineName]; - if (timelineName == "attachment") { - var timeline = new spine.AttachmentTimeline(timelineMap.length); - timeline.slotIndex = slotIndex; - var frameIndex = 0; - for (var i = 0; i < timelineMap.length; i++) { - var 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") { - var timeline = new spine.ColorTimeline(timelineMap.length); - timeline.slotIndex = slotIndex; - var frameIndex = 0; - for (var i = 0; i < timelineMap.length; i++) { - var valueMap = timelineMap[i]; - var color = new spine.Color(); - color.setFromString(valueMap.color); - 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) * spine.ColorTimeline.ENTRIES]); - } - else if (timelineName == "twoColor") { - var timeline = new spine.TwoColorTimeline(timelineMap.length); - timeline.slotIndex = slotIndex; - var frameIndex = 0; - for (var i = 0; i < timelineMap.length; i++) { - var valueMap = timelineMap[i]; - var light = new spine.Color(); - var dark = new spine.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) * spine.TwoColorTimeline.ENTRIES]); - } - else - throw new Error("Invalid timeline type for a slot: " + timelineName + " (" + slotName + ")"); - } - } - } - if (map.bones) { - for (var boneName in map.bones) { - var boneMap = map.bones[boneName]; - var boneIndex = skeletonData.findBoneIndex(boneName); - if (boneIndex == -1) - throw new Error("Bone not found: " + boneName); - for (var timelineName in boneMap) { - var timelineMap = boneMap[timelineName]; - if (timelineName === "rotate") { - var timeline = new spine.RotateTimeline(timelineMap.length); - timeline.boneIndex = boneIndex; - var frameIndex = 0; - for (var i = 0; i < timelineMap.length; i++) { - var 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) * spine.RotateTimeline.ENTRIES]); - } - else if (timelineName === "translate" || timelineName === "scale" || timelineName === "shear") { - var timeline = null; - var timelineScale = 1, defaultValue = 0; - if (timelineName === "scale") { - timeline = new spine.ScaleTimeline(timelineMap.length); - defaultValue = 1; - } - else if (timelineName === "shear") - timeline = new spine.ShearTimeline(timelineMap.length); - else { - timeline = new spine.TranslateTimeline(timelineMap.length); - timelineScale = scale; - } - timeline.boneIndex = boneIndex; - var frameIndex = 0; - for (var i = 0; i < timelineMap.length; i++) { - var valueMap = timelineMap[i]; - var 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) * spine.TranslateTimeline.ENTRIES]); - } - else - throw new Error("Invalid timeline type for a bone: " + timelineName + " (" + boneName + ")"); - } - } - } - if (map.ik) { - for (var constraintName in map.ik) { - var constraintMap = map.ik[constraintName]; - var constraint = skeletonData.findIkConstraint(constraintName); - var timeline = new spine.IkConstraintTimeline(constraintMap.length); - timeline.ikConstraintIndex = skeletonData.ikConstraints.indexOf(constraint); - var frameIndex = 0; - for (var i = 0; i < constraintMap.length; i++) { - var 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) * spine.IkConstraintTimeline.ENTRIES]); - } - } - if (map.transform) { - for (var constraintName in map.transform) { - var constraintMap = map.transform[constraintName]; - var constraint = skeletonData.findTransformConstraint(constraintName); - var timeline = new spine.TransformConstraintTimeline(constraintMap.length); - timeline.transformConstraintIndex = skeletonData.transformConstraints.indexOf(constraint); - var frameIndex = 0; - for (var i = 0; i < constraintMap.length; i++) { - var 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) * spine.TransformConstraintTimeline.ENTRIES]); - } - } - if (map.path) { - for (var constraintName in map.path) { - var constraintMap = map.path[constraintName]; - var index = skeletonData.findPathConstraintIndex(constraintName); - if (index == -1) - throw new Error("Path constraint not found: " + constraintName); - var data = skeletonData.pathConstraints[index]; - for (var timelineName in constraintMap) { - var timelineMap = constraintMap[timelineName]; - if (timelineName === "position" || timelineName === "spacing") { - var timeline = null; - var timelineScale = 1; - if (timelineName === "spacing") { - timeline = new spine.PathConstraintSpacingTimeline(timelineMap.length); - if (data.spacingMode == spine.SpacingMode.Length || data.spacingMode == spine.SpacingMode.Fixed) - timelineScale = scale; - } - else { - timeline = new spine.PathConstraintPositionTimeline(timelineMap.length); - if (data.positionMode == spine.PositionMode.Fixed) - timelineScale = scale; - } - timeline.pathConstraintIndex = index; - var frameIndex = 0; - for (var i = 0; i < timelineMap.length; i++) { - var 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) * spine.PathConstraintPositionTimeline.ENTRIES]); - } - else if (timelineName === "mix") { - var timeline = new spine.PathConstraintMixTimeline(timelineMap.length); - timeline.pathConstraintIndex = index; - var frameIndex = 0; - for (var i = 0; i < timelineMap.length; i++) { - var 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) * spine.PathConstraintMixTimeline.ENTRIES]); - } - } - } - } - if (map.deform) { - for (var deformName in map.deform) { - var deformMap = map.deform[deformName]; - var skin = skeletonData.findSkin(deformName); - if (skin == null) - throw new Error("Skin not found: " + deformName); - for (var slotName in deformMap) { - var slotMap = deformMap[slotName]; - var slotIndex = skeletonData.findSlotIndex(slotName); - if (slotIndex == -1) - throw new Error("Slot not found: " + slotMap.name); - for (var timelineName in slotMap) { - var timelineMap = slotMap[timelineName]; - var attachment = skin.getAttachment(slotIndex, timelineName); - if (attachment == null) - throw new Error("Deform attachment not found: " + timelineMap.name); - var weighted = attachment.bones != null; - var vertices = attachment.vertices; - var deformLength = weighted ? vertices.length / 3 * 2 : vertices.length; - var timeline = new spine.DeformTimeline(timelineMap.length); - timeline.slotIndex = slotIndex; - timeline.attachment = attachment; - var frameIndex = 0; - for (var j = 0; j < timelineMap.length; j++) { - var valueMap = timelineMap[j]; - var deform = void 0; - var verticesValue = this.getValue(valueMap, "vertices", null); - if (verticesValue == null) - deform = weighted ? spine.Utils.newFloatArray(deformLength) : vertices; - else { - deform = spine.Utils.newFloatArray(deformLength); - var start = this.getValue(valueMap, "offset", 0); - spine.Utils.arrayCopy(verticesValue, 0, deform, start, verticesValue.length); - if (scale != 1) { - for (var i = start, n = i + verticesValue.length; i < n; i++) - deform[i] *= scale; - } - if (!weighted) { - for (var 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]); - } - } - } - } - var drawOrderNode = map.drawOrder; - if (drawOrderNode == null) - drawOrderNode = map.draworder; - if (drawOrderNode != null) { - var timeline = new spine.DrawOrderTimeline(drawOrderNode.length); - var slotCount = skeletonData.slots.length; - var frameIndex = 0; - for (var j = 0; j < drawOrderNode.length; j++) { - var drawOrderMap = drawOrderNode[j]; - var drawOrder = null; - var offsets = this.getValue(drawOrderMap, "offsets", null); - if (offsets != null) { - drawOrder = spine.Utils.newArray(slotCount, -1); - var unchanged = spine.Utils.newArray(slotCount - offsets.length, 0); - var originalIndex = 0, unchangedIndex = 0; - for (var i = 0; i < offsets.length; i++) { - var offsetMap = offsets[i]; - var slotIndex = skeletonData.findSlotIndex(offsetMap.slot); - if (slotIndex == -1) - throw new Error("Slot not found: " + offsetMap.slot); - while (originalIndex != slotIndex) - unchanged[unchangedIndex++] = originalIndex++; - drawOrder[originalIndex + offsetMap.offset] = originalIndex++; - } - while (originalIndex < slotCount) - unchanged[unchangedIndex++] = originalIndex++; - for (var 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]); - } - if (map.events) { - var timeline = new spine.EventTimeline(map.events.length); - var frameIndex = 0; - for (var i = 0; i < map.events.length; i++) { - var eventMap = map.events[i]; - var eventData = skeletonData.findEvent(eventMap.name); - if (eventData == null) - throw new Error("Event not found: " + eventMap.name); - var event_6 = new spine.Event(spine.Utils.toSinglePrecision(this.getValue(eventMap, "time", 0)), eventData); - event_6.intValue = this.getValue(eventMap, "int", eventData.intValue); - event_6.floatValue = this.getValue(eventMap, "float", eventData.floatValue); - event_6.stringValue = this.getValue(eventMap, "string", eventData.stringValue); - if (event_6.data.audioPath != null) { - event_6.volume = this.getValue(eventMap, "volume", 1); - event_6.balance = this.getValue(eventMap, "balance", 0); - } - timeline.setFrame(frameIndex++, event_6); - } - 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 spine.Animation(name, timelines, duration)); - }; - SkeletonJson.prototype.readCurve = function (map, timeline, frameIndex) { - if (!map.hasOwnProperty("curve")) - return; - if (map.curve == "stepped") - timeline.setStepped(frameIndex); - else { - var curve = map.curve; - timeline.setCurve(frameIndex, curve, this.getValue(map, "c2", 0), this.getValue(map, "c3", 1), this.getValue(map, "c4", 1)); - } - }; - SkeletonJson.prototype.getValue = function (map, prop, defaultValue) { - return map[prop] !== undefined ? map[prop] : defaultValue; - }; - SkeletonJson.blendModeFromString = function (str) { - str = str.toLowerCase(); - if (str == "normal") - return spine.BlendMode.Normal; - if (str == "additive") - return spine.BlendMode.Additive; - if (str == "multiply") - return spine.BlendMode.Multiply; - if (str == "screen") - return spine.BlendMode.Screen; - throw new Error("Unknown blend mode: " + str); - }; - SkeletonJson.positionModeFromString = function (str) { - str = str.toLowerCase(); - if (str == "fixed") - return spine.PositionMode.Fixed; - if (str == "percent") - return spine.PositionMode.Percent; - throw new Error("Unknown position mode: " + str); - }; - SkeletonJson.spacingModeFromString = function (str) { - str = str.toLowerCase(); - if (str == "length") - return spine.SpacingMode.Length; - if (str == "fixed") - return spine.SpacingMode.Fixed; - if (str == "percent") - return spine.SpacingMode.Percent; - throw new Error("Unknown position mode: " + str); - }; - SkeletonJson.rotateModeFromString = function (str) { - str = str.toLowerCase(); - if (str == "tangent") - return spine.RotateMode.Tangent; - if (str == "chain") - return spine.RotateMode.Chain; - if (str == "chainscale") - return spine.RotateMode.ChainScale; - throw new Error("Unknown rotate mode: " + str); - }; - SkeletonJson.transformModeFromString = function (str) { - str = str.toLowerCase(); - if (str == "normal") - return spine.TransformMode.Normal; - if (str == "onlytranslation") - return spine.TransformMode.OnlyTranslation; - if (str == "norotationorreflection") - return spine.TransformMode.NoRotationOrReflection; - if (str == "noscale") - return spine.TransformMode.NoScale; - if (str == "noscaleorreflection") - return spine.TransformMode.NoScaleOrReflection; - throw new Error("Unknown transform mode: " + str); - }; - return SkeletonJson; - }()); - spine.SkeletonJson = SkeletonJson; - var LinkedMesh = (function () { - function LinkedMesh(mesh, skin, slotIndex, parent, inheritDeform) { - this.mesh = mesh; - this.skin = skin; - this.slotIndex = slotIndex; - this.parent = parent; - this.inheritDeform = inheritDeform; - } - return LinkedMesh; - }()); -})(spine || (spine = {})); -var spine; -(function (spine) { - var SkinEntry = (function () { - function SkinEntry(slotIndex, name, attachment) { - this.slotIndex = slotIndex; - this.name = name; - this.attachment = attachment; - } - return SkinEntry; - }()); - spine.SkinEntry = SkinEntry; - var Skin = (function () { - function Skin(name) { - this.attachments = new Array(); - this.bones = Array(); - this.constraints = new Array(); - if (name == null) - throw new Error("name cannot be null."); - this.name = name; - } - Skin.prototype.setAttachment = function (slotIndex, name, attachment) { - if (attachment == null) - throw new Error("attachment cannot be null."); - var attachments = this.attachments; - if (slotIndex >= attachments.length) - attachments.length = slotIndex + 1; - if (!attachments[slotIndex]) - attachments[slotIndex] = {}; - attachments[slotIndex][name] = attachment; - }; - Skin.prototype.addSkin = function (skin) { - for (var i = 0; i < skin.bones.length; i++) { - var bone = skin.bones[i]; - var contained = false; - for (var j = 0; j < this.bones.length; j++) { - if (this.bones[j] == bone) { - contained = true; - break; - } - } - if (!contained) - this.bones.push(bone); - } - for (var i = 0; i < skin.constraints.length; i++) { - var constraint = skin.constraints[i]; - var contained = false; - for (var j = 0; j < this.constraints.length; j++) { - if (this.constraints[j] == constraint) { - contained = true; - break; - } - } - if (!contained) - this.constraints.push(constraint); - } - var attachments = skin.getAttachments(); - for (var i = 0; i < attachments.length; i++) { - var attachment = attachments[i]; - this.setAttachment(attachment.slotIndex, attachment.name, attachment.attachment); - } - }; - Skin.prototype.copySkin = function (skin) { - for (var i = 0; i < skin.bones.length; i++) { - var bone = skin.bones[i]; - var contained = false; - for (var j = 0; j < this.bones.length; j++) { - if (this.bones[j] == bone) { - contained = true; - break; - } - } - if (!contained) - this.bones.push(bone); - } - for (var i = 0; i < skin.constraints.length; i++) { - var constraint = skin.constraints[i]; - var contained = false; - for (var j = 0; j < this.constraints.length; j++) { - if (this.constraints[j] == constraint) { - contained = true; - break; - } - } - if (!contained) - this.constraints.push(constraint); - } - var attachments = skin.getAttachments(); - for (var i = 0; i < attachments.length; i++) { - var attachment = attachments[i]; - if (attachment.attachment == null) - continue; - if (attachment.attachment instanceof spine.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); - } - } - }; - Skin.prototype.getAttachment = function (slotIndex, name) { - var dictionary = this.attachments[slotIndex]; - return dictionary ? dictionary[name] : null; - }; - Skin.prototype.removeAttachment = function (slotIndex, name) { - var dictionary = this.attachments[slotIndex]; - if (dictionary) - dictionary[name] = null; - }; - Skin.prototype.getAttachments = function () { - var entries = new Array(); - for (var i = 0; i < this.attachments.length; i++) { - var slotAttachments = this.attachments[i]; - if (slotAttachments) { - for (var name_4 in slotAttachments) { - var attachment = slotAttachments[name_4]; - if (attachment) - entries.push(new SkinEntry(i, name_4, attachment)); - } - } - } - return entries; - }; - Skin.prototype.getAttachmentsForSlot = function (slotIndex, attachments) { - var slotAttachments = this.attachments[slotIndex]; - if (slotAttachments) { - for (var name_5 in slotAttachments) { - var attachment = slotAttachments[name_5]; - if (attachment) - attachments.push(new SkinEntry(slotIndex, name_5, attachment)); - } - } - }; - Skin.prototype.clear = function () { - this.attachments.length = 0; - this.bones.length = 0; - this.constraints.length = 0; - }; - Skin.prototype.attachAll = function (skeleton, oldSkin) { - var slotIndex = 0; - for (var i = 0; i < skeleton.slots.length; i++) { - var slot = skeleton.slots[i]; - var slotAttachment = slot.getAttachment(); - if (slotAttachment && slotIndex < oldSkin.attachments.length) { - var dictionary = oldSkin.attachments[slotIndex]; - for (var key in dictionary) { - var skinAttachment = dictionary[key]; - if (slotAttachment == skinAttachment) { - var attachment = this.getAttachment(slotIndex, key); - if (attachment != null) - slot.setAttachment(attachment); - break; - } - } - } - slotIndex++; - } - }; - return Skin; - }()); - spine.Skin = Skin; -})(spine || (spine = {})); -var spine; -(function (spine) { - var Slot = (function () { - function Slot(data, bone) { - this.deform = new Array(); - 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 spine.Color(); - this.darkColor = data.darkColor == null ? null : new spine.Color(); - this.setToSetupPose(); - } - Slot.prototype.getSkeleton = function () { - return this.bone.skeleton; - }; - Slot.prototype.getAttachment = function () { - return this.attachment; - }; - Slot.prototype.setAttachment = function (attachment) { - if (this.attachment == attachment) - return; - this.attachment = attachment; - this.attachmentTime = this.bone.skeleton.time; - this.deform.length = 0; - }; - Slot.prototype.setAttachmentTime = function (time) { - this.attachmentTime = this.bone.skeleton.time - time; - }; - Slot.prototype.getAttachmentTime = function () { - return this.bone.skeleton.time - this.attachmentTime; - }; - Slot.prototype.setToSetupPose = function () { - 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)); - } - }; - return Slot; - }()); - spine.Slot = Slot; -})(spine || (spine = {})); -var spine; -(function (spine) { - var SlotData = (function () { - function SlotData(index, name, boneData) { - this.color = new spine.Color(1, 1, 1, 1); - 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; - } - return SlotData; - }()); - spine.SlotData = SlotData; -})(spine || (spine = {})); -var spine; -(function (spine) { - var Texture = (function () { - function Texture(image) { - this._image = image; - } - Texture.prototype.getImage = function () { - return this._image; - }; - Texture.filterFromString = function (text) { - switch (text.toLowerCase()) { - case "nearest": return TextureFilter.Nearest; - case "linear": return TextureFilter.Linear; - case "mipmap": return TextureFilter.MipMap; - case "mipmapnearestnearest": return TextureFilter.MipMapNearestNearest; - case "mipmaplinearnearest": return TextureFilter.MipMapLinearNearest; - case "mipmapnearestlinear": return TextureFilter.MipMapNearestLinear; - case "mipmaplinearlinear": return TextureFilter.MipMapLinearLinear; - default: throw new Error("Unknown texture filter " + text); - } - }; - Texture.wrapFromString = function (text) { - switch (text.toLowerCase()) { - case "mirroredtepeat": return TextureWrap.MirroredRepeat; - case "clamptoedge": return TextureWrap.ClampToEdge; - case "repeat": return TextureWrap.Repeat; - default: throw new Error("Unknown texture wrap " + text); - } - }; - return Texture; - }()); - spine.Texture = Texture; - var TextureFilter; - (function (TextureFilter) { - TextureFilter[TextureFilter["Nearest"] = 9728] = "Nearest"; - TextureFilter[TextureFilter["Linear"] = 9729] = "Linear"; - TextureFilter[TextureFilter["MipMap"] = 9987] = "MipMap"; - TextureFilter[TextureFilter["MipMapNearestNearest"] = 9984] = "MipMapNearestNearest"; - TextureFilter[TextureFilter["MipMapLinearNearest"] = 9985] = "MipMapLinearNearest"; - TextureFilter[TextureFilter["MipMapNearestLinear"] = 9986] = "MipMapNearestLinear"; - TextureFilter[TextureFilter["MipMapLinearLinear"] = 9987] = "MipMapLinearLinear"; - })(TextureFilter = spine.TextureFilter || (spine.TextureFilter = {})); - var TextureWrap; - (function (TextureWrap) { - TextureWrap[TextureWrap["MirroredRepeat"] = 33648] = "MirroredRepeat"; - TextureWrap[TextureWrap["ClampToEdge"] = 33071] = "ClampToEdge"; - TextureWrap[TextureWrap["Repeat"] = 10497] = "Repeat"; - })(TextureWrap = spine.TextureWrap || (spine.TextureWrap = {})); - var TextureRegion = (function () { - function TextureRegion() { - this.u = 0; - this.v = 0; - this.u2 = 0; - this.v2 = 0; - this.width = 0; - this.height = 0; - this.rotate = false; - this.offsetX = 0; - this.offsetY = 0; - this.originalWidth = 0; - this.originalHeight = 0; - } - return TextureRegion; - }()); - spine.TextureRegion = TextureRegion; - var FakeTexture = (function (_super) { - __extends(FakeTexture, _super); - function FakeTexture() { - return _super !== null && _super.apply(this, arguments) || this; - } - FakeTexture.prototype.setFilters = function (minFilter, magFilter) { }; - FakeTexture.prototype.setWraps = function (uWrap, vWrap) { }; - FakeTexture.prototype.dispose = function () { }; - return FakeTexture; - }(Texture)); - spine.FakeTexture = FakeTexture; -})(spine || (spine = {})); -var spine; -(function (spine) { - var TextureAtlas = (function () { - function TextureAtlas(atlasText, textureLoader) { - this.pages = new Array(); - this.regions = new Array(); - this.load(atlasText, textureLoader); - } - TextureAtlas.prototype.load = function (atlasText, textureLoader) { - if (textureLoader == null) - throw new Error("textureLoader cannot be null."); - var reader = new TextureAtlasReader(atlasText); - var tuple = new Array(4); - var page = null; - while (true) { - var line = reader.readLine(); - if (line == null) - break; - line = line.trim(); - if (line.length == 0) - page = null; - else if (!page) { - page = new TextureAtlasPage(); - page.name = line; - if (reader.readTuple(tuple) == 2) { - page.width = parseInt(tuple[0]); - page.height = parseInt(tuple[1]); - reader.readTuple(tuple); - } - reader.readTuple(tuple); - page.minFilter = spine.Texture.filterFromString(tuple[0]); - page.magFilter = spine.Texture.filterFromString(tuple[1]); - var direction = reader.readValue(); - page.uWrap = spine.TextureWrap.ClampToEdge; - page.vWrap = spine.TextureWrap.ClampToEdge; - if (direction == "x") - page.uWrap = spine.TextureWrap.Repeat; - else if (direction == "y") - page.vWrap = spine.TextureWrap.Repeat; - else if (direction == "xy") - page.uWrap = page.vWrap = spine.TextureWrap.Repeat; - page.texture = textureLoader(line); - page.texture.setFilters(page.minFilter, page.magFilter); - page.texture.setWraps(page.uWrap, page.vWrap); - page.width = page.texture.getImage().width; - page.height = page.texture.getImage().height; - this.pages.push(page); - } - else { - var region = new TextureAtlasRegion(); - region.name = line; - region.page = page; - var rotateValue = reader.readValue(); - if (rotateValue.toLocaleLowerCase() == "true") { - region.degrees = 90; - } - else if (rotateValue.toLocaleLowerCase() == "false") { - region.degrees = 0; - } - else { - region.degrees = parseFloat(rotateValue); - } - region.rotate = region.degrees == 90; - reader.readTuple(tuple); - var x = parseInt(tuple[0]); - var y = parseInt(tuple[1]); - reader.readTuple(tuple); - var width = parseInt(tuple[0]); - var height = parseInt(tuple[1]); - region.u = x / page.width; - region.v = y / page.height; - if (region.rotate) { - region.u2 = (x + height) / page.width; - region.v2 = (y + width) / page.height; - } - else { - region.u2 = (x + width) / page.width; - region.v2 = (y + height) / page.height; - } - region.x = x; - region.y = y; - region.width = Math.abs(width); - region.height = Math.abs(height); - if (reader.readTuple(tuple) == 4) { - if (reader.readTuple(tuple) == 4) { - reader.readTuple(tuple); - } - } - region.originalWidth = parseInt(tuple[0]); - region.originalHeight = parseInt(tuple[1]); - reader.readTuple(tuple); - region.offsetX = parseInt(tuple[0]); - region.offsetY = parseInt(tuple[1]); - region.index = parseInt(reader.readValue()); - region.texture = page.texture; - this.regions.push(region); - } - } - }; - TextureAtlas.prototype.findRegion = function (name) { - for (var i = 0; i < this.regions.length; i++) { - if (this.regions[i].name == name) { - return this.regions[i]; - } - } - return null; - }; - TextureAtlas.prototype.dispose = function () { - for (var i = 0; i < this.pages.length; i++) { - this.pages[i].texture.dispose(); - } - }; - return TextureAtlas; - }()); - spine.TextureAtlas = TextureAtlas; - var TextureAtlasReader = (function () { - function TextureAtlasReader(text) { - this.index = 0; - this.lines = text.split(/\r\n|\r|\n/); - } - TextureAtlasReader.prototype.readLine = function () { - if (this.index >= this.lines.length) - return null; - return this.lines[this.index++]; - }; - TextureAtlasReader.prototype.readValue = function () { - var line = this.readLine(); - var colon = line.indexOf(":"); - if (colon == -1) - throw new Error("Invalid line: " + line); - return line.substring(colon + 1).trim(); - }; - TextureAtlasReader.prototype.readTuple = function (tuple) { - var line = this.readLine(); - var colon = line.indexOf(":"); - if (colon == -1) - throw new Error("Invalid line: " + line); - var i = 0, lastMatch = colon + 1; - for (; i < 3; i++) { - var comma = line.indexOf(",", lastMatch); - if (comma == -1) - break; - tuple[i] = line.substr(lastMatch, comma - lastMatch).trim(); - lastMatch = comma + 1; + return this.mean; + } + return 0; + } + }; + + // spine-core/src/attachments/Attachment.ts + var Attachment = class { + constructor(name) { + if (!name) + throw new Error("name cannot be null."); + this.name = name; + } + }; + var _VertexAttachment = class extends Attachment { + constructor(name) { + super(name); + this.id = _VertexAttachment.nextID++; + this.bones = null; + this.vertices = null; + this.worldVerticesLength = 0; + this.deformAttachment = this; + } + 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) { + if (deformArray.length > 0) + vertices = deformArray; + let bone = slot.bone; + let x = bone.worldX; + let y = bone.worldY; + let a = bone.a, b = bone.b, c = bone.c, d = bone.d; + for (let v2 = start, w = offset; w < count; v2 += 2, w += stride) { + let vx = vertices[v2], vy = vertices[v2 + 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 bone = skeletonBones[bones[v]]; + let vx = vertices[b], vy = vertices[b + 1], weight = vertices[b + 2]; + wx += (vx * bone.a + vy * bone.b + bone.worldX) * weight; + wy += (vx * bone.c + vy * bone.d + bone.worldY) * 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 bone = skeletonBones[bones[v]]; + let vx = vertices[b] + deform[f], vy = vertices[b + 1] + deform[f + 1], weight = vertices[b + 2]; + wx += (vx * bone.a + vy * bone.b + bone.worldX) * weight; + wy += (vx * bone.c + vy * bone.d + bone.worldY) * weight; + } + worldVertices[w] = wx; + worldVertices[w + 1] = wy; + } + } + } + copyTo(attachment) { + if (this.bones) { + 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) { + 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; + } + }; + var VertexAttachment = _VertexAttachment; + VertexAttachment.nextID = 0; + + // spine-core/src/Animation.ts + var Animation = class { + constructor(name, timelines, duration) { + this.timelines = null; + this.timelineIds = null; + if (!name) + throw new Error("name cannot be null."); + this.name = name; + this.setTimelines(timelines); + this.duration = duration; + } + setTimelines(timelines) { + if (!timelines) + throw new Error("timelines cannot be null."); + this.timelines = timelines; + this.timelineIds = new StringSet(); + for (var i = 0; i < timelines.length; i++) + this.timelineIds.addAll(timelines[i].getPropertyIds()); + } + hasTimeline(ids) { + for (let i = 0; i < ids.length; i++) + if (this.timelineIds.contains(ids[i])) + return true; + return false; + } + apply(skeleton, lastTime, time, loop, events, alpha, blend, direction) { + if (!skeleton) + 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); + } + }; + var MixBlend; + (function(MixBlend2) { + MixBlend2[MixBlend2["setup"] = 0] = "setup"; + MixBlend2[MixBlend2["first"] = 1] = "first"; + MixBlend2[MixBlend2["replace"] = 2] = "replace"; + MixBlend2[MixBlend2["add"] = 3] = "add"; + })(MixBlend || (MixBlend = {})); + var MixDirection; + (function(MixDirection2) { + MixDirection2[MixDirection2["mixIn"] = 0] = "mixIn"; + MixDirection2[MixDirection2["mixOut"] = 1] = "mixOut"; + })(MixDirection || (MixDirection = {})); + var Property = { + rotate: 0, + x: 1, + y: 2, + scaleX: 3, + scaleY: 4, + shearX: 5, + shearY: 6, + rgb: 7, + alpha: 8, + rgb2: 9, + attachment: 10, + deform: 11, + event: 12, + drawOrder: 13, + ikConstraint: 14, + transformConstraint: 15, + pathConstraintPosition: 16, + pathConstraintSpacing: 17, + pathConstraintMix: 18 + }; + var Timeline = class { + constructor(frameCount, propertyIds) { + this.propertyIds = null; + this.frames = null; + this.propertyIds = propertyIds; + this.frames = Utils.newFloatArray(frameCount * this.getFrameEntries()); + } + getPropertyIds() { + return this.propertyIds; + } + getFrameEntries() { + return 1; + } + getFrameCount() { + return this.frames.length / this.getFrameEntries(); + } + getDuration() { + return this.frames[this.frames.length - this.getFrameEntries()]; + } + static search1(frames, time) { + let n = frames.length; + for (let i = 1; i < n; i++) + if (frames[i] > time) + return i - 1; + return n - 1; + } + static search(frames, time, step) { + let n = frames.length; + for (let i = step; i < n; i += step) + if (frames[i] > time) + return i - step; + return n - step; + } + }; + var CurveTimeline = class extends Timeline { + constructor(frameCount, bezierCount, propertyIds) { + super(frameCount, propertyIds); + this.curves = null; + this.curves = Utils.newFloatArray(frameCount + bezierCount * 18); + this.curves[frameCount - 1] = 1; + } + setLinear(frame) { + this.curves[frame] = 0; + } + setStepped(frame) { + this.curves[frame] = 1; + } + shrink(bezierCount) { + let size = this.getFrameCount() + bezierCount * 18; + if (this.curves.length > size) { + let newCurves = Utils.newFloatArray(size); + Utils.arrayCopy(this.curves, 0, newCurves, 0, size); + this.curves = newCurves; + } + } + setBezier(bezier, frame, value, time1, value1, cx1, cy1, cx2, cy2, time2, value2) { + let curves = this.curves; + let i = this.getFrameCount() + bezier * 18; + if (value == 0) + curves[frame] = 2 + i; + let tmpx = (time1 - cx1 * 2 + cx2) * 0.03, tmpy = (value1 - cy1 * 2 + cy2) * 0.03; + let dddx = ((cx1 - cx2) * 3 - time1 + time2) * 6e-3, dddy = ((cy1 - cy2) * 3 - value1 + value2) * 6e-3; + 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 + 18; i < n; i += 2) { + curves[i] = x; + curves[i + 1] = y; + dx += ddx; + dy += ddy; + ddx += dddx; + ddy += dddy; + x += dx; + y += dy; + } + } + getBezierValue(time, frameIndex, valueOffset, i) { + let curves = this.curves; + if (curves[i] > time) { + let x2 = this.frames[frameIndex], y2 = this.frames[frameIndex + valueOffset]; + return y2 + (time - x2) / (curves[i] - x2) * (curves[i + 1] - y2); + } + let n = i + 18; + for (i += 2; i < n; i += 2) { + if (curves[i] >= time) { + let x2 = curves[i - 2], y2 = curves[i - 1]; + return y2 + (time - x2) / (curves[i] - x2) * (curves[i + 1] - y2); + } + } + frameIndex += this.getFrameEntries(); + let x = curves[n - 2], y = curves[n - 1]; + return y + (time - x) / (this.frames[frameIndex] - x) * (this.frames[frameIndex + valueOffset] - y); + } + }; + var CurveTimeline1 = class extends CurveTimeline { + constructor(frameCount, bezierCount, propertyId) { + super(frameCount, bezierCount, [propertyId]); + } + getFrameEntries() { + return 2; + } + setFrame(frame, time, value) { + frame <<= 1; + this.frames[frame] = time; + this.frames[frame + 1] = value; + } + 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 0: + let before = frames[i], value = frames[i + 1]; + return value + (time - before) / (frames[i + 2] - before) * (frames[i + 2 + 1] - value); + case 1: + return frames[i + 1]; + } + return this.getBezierValue(time, i, 1, curveType - 2); + } + }; + var CurveTimeline2 = class extends CurveTimeline { + constructor(frameCount, bezierCount, propertyId1, propertyId2) { + super(frameCount, bezierCount, [propertyId1, propertyId2]); + } + getFrameEntries() { + return 3; + } + setFrame(frame, time, value1, value2) { + frame *= 3; + this.frames[frame] = time; + this.frames[frame + 1] = value1; + this.frames[frame + 2] = value2; + } + }; + var RotateTimeline = class extends CurveTimeline1 { + constructor(frameCount, bezierCount, boneIndex) { + super(frameCount, bezierCount, Property.rotate + "|" + boneIndex); + this.boneIndex = 0; + this.boneIndex = boneIndex; + } + apply(skeleton, lastTime, time, events, alpha, blend, direction) { + let bone = skeleton.bones[this.boneIndex]; + if (!bone.active) + return; + let frames = this.frames; + if (time < frames[0]) { + switch (blend) { + case 0: + bone.rotation = bone.data.rotation; + return; + case 1: + bone.rotation += (bone.data.rotation - bone.rotation) * alpha; + } + return; + } + let r = this.getCurveValue(time); + switch (blend) { + case 0: + bone.rotation = bone.data.rotation + r * alpha; + break; + case 1: + case 2: + r += bone.data.rotation - bone.rotation; + case 3: + bone.rotation += r * alpha; + } + } + }; + var TranslateTimeline = class extends CurveTimeline2 { + constructor(frameCount, bezierCount, boneIndex) { + super(frameCount, bezierCount, Property.x + "|" + boneIndex, Property.y + "|" + boneIndex); + this.boneIndex = 0; + this.boneIndex = boneIndex; + } + apply(skeleton, lastTime, time, events, alpha, blend, direction) { + let bone = skeleton.bones[this.boneIndex]; + if (!bone.active) + return; + let frames = this.frames; + if (time < frames[0]) { + switch (blend) { + case 0: + bone.x = bone.data.x; + bone.y = bone.data.y; + return; + case 1: + bone.x += (bone.data.x - bone.x) * alpha; + bone.y += (bone.data.y - bone.y) * alpha; + } + return; + } + let x = 0, y = 0; + let i = Timeline.search(frames, time, 3); + let curveType = this.curves[i / 3]; + switch (curveType) { + case 0: + let before = frames[i]; + x = frames[i + 1]; + y = frames[i + 2]; + let t = (time - before) / (frames[i + 3] - before); + x += (frames[i + 3 + 1] - x) * t; + y += (frames[i + 3 + 2] - y) * t; + break; + case 1: + x = frames[i + 1]; + y = frames[i + 2]; + break; + default: + x = this.getBezierValue(time, i, 1, curveType - 2); + y = this.getBezierValue(time, i, 2, curveType + 18 - 2); + } + switch (blend) { + case 0: + bone.x = bone.data.x + x * alpha; + bone.y = bone.data.y + y * alpha; + break; + case 1: + case 2: + bone.x += (bone.data.x + x - bone.x) * alpha; + bone.y += (bone.data.y + y - bone.y) * alpha; + break; + case 3: + bone.x += x * alpha; + bone.y += y * alpha; + } + } + }; + var TranslateXTimeline = class extends CurveTimeline1 { + constructor(frameCount, bezierCount, boneIndex) { + super(frameCount, bezierCount, Property.x + "|" + boneIndex); + this.boneIndex = 0; + this.boneIndex = boneIndex; + } + apply(skeleton, lastTime, time, events, alpha, blend, direction) { + let bone = skeleton.bones[this.boneIndex]; + if (!bone.active) + return; + let frames = this.frames; + if (time < frames[0]) { + switch (blend) { + case 0: + bone.x = bone.data.x; + return; + case 1: + bone.x += (bone.data.x - bone.x) * alpha; + } + return; + } + let x = this.getCurveValue(time); + switch (blend) { + case 0: + bone.x = bone.data.x + x * alpha; + break; + case 1: + case 2: + bone.x += (bone.data.x + x - bone.x) * alpha; + break; + case 3: + bone.x += x * alpha; + } + } + }; + var TranslateYTimeline = class extends CurveTimeline1 { + constructor(frameCount, bezierCount, boneIndex) { + super(frameCount, bezierCount, Property.y + "|" + boneIndex); + this.boneIndex = 0; + this.boneIndex = boneIndex; + } + apply(skeleton, lastTime, time, events, alpha, blend, direction) { + let bone = skeleton.bones[this.boneIndex]; + if (!bone.active) + return; + let frames = this.frames; + if (time < frames[0]) { + switch (blend) { + case 0: + bone.y = bone.data.y; + return; + case 1: + bone.y += (bone.data.y - bone.y) * alpha; + } + return; + } + let y = this.getCurveValue(time); + switch (blend) { + case 0: + bone.y = bone.data.y + y * alpha; + break; + case 1: + case 2: + bone.y += (bone.data.y + y - bone.y) * alpha; + break; + case 3: + bone.y += y * alpha; + } + } + }; + var ScaleTimeline = class extends CurveTimeline2 { + constructor(frameCount, bezierCount, boneIndex) { + super(frameCount, bezierCount, Property.scaleX + "|" + boneIndex, Property.scaleY + "|" + boneIndex); + this.boneIndex = 0; + this.boneIndex = boneIndex; + } + apply(skeleton, lastTime, time, events, alpha, blend, direction) { + let bone = skeleton.bones[this.boneIndex]; + if (!bone.active) + return; + let frames = this.frames; + if (time < frames[0]) { + switch (blend) { + case 0: + bone.scaleX = bone.data.scaleX; + bone.scaleY = bone.data.scaleY; + return; + case 1: + bone.scaleX += (bone.data.scaleX - bone.scaleX) * alpha; + bone.scaleY += (bone.data.scaleY - bone.scaleY) * alpha; + } + return; + } + let x, y; + let i = Timeline.search(frames, time, 3); + let curveType = this.curves[i / 3]; + switch (curveType) { + case 0: + let before = frames[i]; + x = frames[i + 1]; + y = frames[i + 2]; + let t = (time - before) / (frames[i + 3] - before); + x += (frames[i + 3 + 1] - x) * t; + y += (frames[i + 3 + 2] - y) * t; + break; + case 1: + x = frames[i + 1]; + y = frames[i + 2]; + break; + default: + x = this.getBezierValue(time, i, 1, curveType - 2); + y = this.getBezierValue(time, i, 2, curveType + 18 - 2); + } + x *= bone.data.scaleX; + y *= bone.data.scaleY; + if (alpha == 1) { + if (blend == 3) { + 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 == 1) { + switch (blend) { + case 0: + 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 1: + case 2: + 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 3: + bone.scaleX = (x - bone.data.scaleX) * alpha; + bone.scaleY = (y - bone.data.scaleY) * alpha; + } + } else { + switch (blend) { + case 0: + 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 1: + case 2: + 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 3: + bone.scaleX += (x - bone.data.scaleX) * alpha; + bone.scaleY += (y - bone.data.scaleY) * alpha; + } + } + } + } + }; + var ScaleXTimeline = class extends CurveTimeline1 { + constructor(frameCount, bezierCount, boneIndex) { + super(frameCount, bezierCount, Property.scaleX + "|" + boneIndex); + this.boneIndex = 0; + this.boneIndex = boneIndex; + } + apply(skeleton, lastTime, time, events, alpha, blend, direction) { + let bone = skeleton.bones[this.boneIndex]; + if (!bone.active) + return; + let frames = this.frames; + if (time < frames[0]) { + switch (blend) { + case 0: + bone.scaleX = bone.data.scaleX; + return; + case 1: + bone.scaleX += (bone.data.scaleX - bone.scaleX) * alpha; + } + return; + } + let x = this.getCurveValue(time) * bone.data.scaleX; + if (alpha == 1) { + if (blend == 3) + bone.scaleX += x - bone.data.scaleX; + else + bone.scaleX = x; + } else { + let bx = 0; + if (direction == 1) { + switch (blend) { + case 0: + bx = bone.data.scaleX; + bone.scaleX = bx + (Math.abs(x) * MathUtils.signum(bx) - bx) * alpha; + break; + case 1: + case 2: + bx = bone.scaleX; + bone.scaleX = bx + (Math.abs(x) * MathUtils.signum(bx) - bx) * alpha; + break; + case 3: + bone.scaleX = (x - bone.data.scaleX) * alpha; + } + } else { + switch (blend) { + case 0: + bx = Math.abs(bone.data.scaleX) * MathUtils.signum(x); + bone.scaleX = bx + (x - bx) * alpha; + break; + case 1: + case 2: + bx = Math.abs(bone.scaleX) * MathUtils.signum(x); + bone.scaleX = bx + (x - bx) * alpha; + break; + case 3: + bone.scaleX += (x - bone.data.scaleX) * alpha; + } + } + } + } + }; + var ScaleYTimeline = class extends CurveTimeline1 { + constructor(frameCount, bezierCount, boneIndex) { + super(frameCount, bezierCount, Property.scaleY + "|" + boneIndex); + this.boneIndex = 0; + this.boneIndex = boneIndex; + } + apply(skeleton, lastTime, time, events, alpha, blend, direction) { + let bone = skeleton.bones[this.boneIndex]; + if (!bone.active) + return; + let frames = this.frames; + if (time < frames[0]) { + switch (blend) { + case 0: + bone.scaleY = bone.data.scaleY; + return; + case 1: + bone.scaleY += (bone.data.scaleY - bone.scaleY) * alpha; + } + return; + } + let y = this.getCurveValue(time) * bone.data.scaleY; + if (alpha == 1) { + if (blend == 3) + bone.scaleY += y - bone.data.scaleY; + else + bone.scaleY = y; + } else { + let by = 0; + if (direction == 1) { + switch (blend) { + case 0: + by = bone.data.scaleY; + bone.scaleY = by + (Math.abs(y) * MathUtils.signum(by) - by) * alpha; + break; + case 1: + case 2: + by = bone.scaleY; + bone.scaleY = by + (Math.abs(y) * MathUtils.signum(by) - by) * alpha; + break; + case 3: + bone.scaleY = (y - bone.data.scaleY) * alpha; + } + } else { + switch (blend) { + case 0: + by = Math.abs(bone.data.scaleY) * MathUtils.signum(y); + bone.scaleY = by + (y - by) * alpha; + break; + case 1: + case 2: + by = Math.abs(bone.scaleY) * MathUtils.signum(y); + bone.scaleY = by + (y - by) * alpha; + break; + case 3: + bone.scaleY += (y - bone.data.scaleY) * alpha; + } + } + } + } + }; + var ShearTimeline = class extends CurveTimeline2 { + constructor(frameCount, bezierCount, boneIndex) { + super(frameCount, bezierCount, Property.shearX + "|" + boneIndex, Property.shearY + "|" + boneIndex); + this.boneIndex = 0; + this.boneIndex = boneIndex; + } + apply(skeleton, lastTime, time, events, alpha, blend, direction) { + let bone = skeleton.bones[this.boneIndex]; + if (!bone.active) + return; + let frames = this.frames; + if (time < frames[0]) { + switch (blend) { + case 0: + bone.shearX = bone.data.shearX; + bone.shearY = bone.data.shearY; + return; + case 1: + bone.shearX += (bone.data.shearX - bone.shearX) * alpha; + bone.shearY += (bone.data.shearY - bone.shearY) * alpha; + } + return; + } + let x = 0, y = 0; + let i = Timeline.search(frames, time, 3); + let curveType = this.curves[i / 3]; + switch (curveType) { + case 0: + let before = frames[i]; + x = frames[i + 1]; + y = frames[i + 2]; + let t = (time - before) / (frames[i + 3] - before); + x += (frames[i + 3 + 1] - x) * t; + y += (frames[i + 3 + 2] - y) * t; + break; + case 1: + x = frames[i + 1]; + y = frames[i + 2]; + break; + default: + x = this.getBezierValue(time, i, 1, curveType - 2); + y = this.getBezierValue(time, i, 2, curveType + 18 - 2); + } + switch (blend) { + case 0: + bone.shearX = bone.data.shearX + x * alpha; + bone.shearY = bone.data.shearY + y * alpha; + break; + case 1: + case 2: + bone.shearX += (bone.data.shearX + x - bone.shearX) * alpha; + bone.shearY += (bone.data.shearY + y - bone.shearY) * alpha; + break; + case 3: + bone.shearX += x * alpha; + bone.shearY += y * alpha; + } + } + }; + var ShearXTimeline = class extends CurveTimeline1 { + constructor(frameCount, bezierCount, boneIndex) { + super(frameCount, bezierCount, Property.shearX + "|" + boneIndex); + this.boneIndex = 0; + this.boneIndex = boneIndex; + } + apply(skeleton, lastTime, time, events, alpha, blend, direction) { + let bone = skeleton.bones[this.boneIndex]; + if (!bone.active) + return; + let frames = this.frames; + if (time < frames[0]) { + switch (blend) { + case 0: + bone.shearX = bone.data.shearX; + return; + case 1: + bone.shearX += (bone.data.shearX - bone.shearX) * alpha; + } + return; + } + let x = this.getCurveValue(time); + switch (blend) { + case 0: + bone.shearX = bone.data.shearX + x * alpha; + break; + case 1: + case 2: + bone.shearX += (bone.data.shearX + x - bone.shearX) * alpha; + break; + case 3: + bone.shearX += x * alpha; + } + } + }; + var ShearYTimeline = class extends CurveTimeline1 { + constructor(frameCount, bezierCount, boneIndex) { + super(frameCount, bezierCount, Property.shearY + "|" + boneIndex); + this.boneIndex = 0; + this.boneIndex = boneIndex; + } + apply(skeleton, lastTime, time, events, alpha, blend, direction) { + let bone = skeleton.bones[this.boneIndex]; + if (!bone.active) + return; + let frames = this.frames; + if (time < frames[0]) { + switch (blend) { + case 0: + bone.shearY = bone.data.shearY; + return; + case 1: + bone.shearY += (bone.data.shearY - bone.shearY) * alpha; + } + return; + } + let y = this.getCurveValue(time); + switch (blend) { + case 0: + bone.shearY = bone.data.shearY + y * alpha; + break; + case 1: + case 2: + bone.shearY += (bone.data.shearY + y - bone.shearY) * alpha; + break; + case 3: + bone.shearY += y * alpha; + } + } + }; + var RGBATimeline = class extends CurveTimeline { + constructor(frameCount, bezierCount, slotIndex) { + super(frameCount, bezierCount, [ + Property.rgb + "|" + slotIndex, + Property.alpha + "|" + slotIndex + ]); + this.slotIndex = 0; + this.slotIndex = slotIndex; + } + getFrameEntries() { + return 5; + } + setFrame(frame, time, r, g, b, a) { + frame *= 5; + this.frames[frame] = time; + this.frames[frame + 1] = r; + this.frames[frame + 2] = g; + this.frames[frame + 3] = b; + this.frames[frame + 4] = a; + } + apply(skeleton, lastTime, time, events, alpha, blend, direction) { + let slot = skeleton.slots[this.slotIndex]; + if (!slot.bone.active) + return; + let frames = this.frames; + let color = slot.color; + if (time < frames[0]) { + let setup = slot.data.color; + switch (blend) { + case 0: + color.setFromColor(setup); + return; + case 1: + 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 = Timeline.search(frames, time, 5); + let curveType = this.curves[i / 5]; + switch (curveType) { + case 0: + let before = frames[i]; + r = frames[i + 1]; + g = frames[i + 2]; + b = frames[i + 3]; + a = frames[i + 4]; + let t = (time - before) / (frames[i + 5] - before); + r += (frames[i + 5 + 1] - r) * t; + g += (frames[i + 5 + 2] - g) * t; + b += (frames[i + 5 + 3] - b) * t; + a += (frames[i + 5 + 4] - a) * t; + break; + case 1: + r = frames[i + 1]; + g = frames[i + 2]; + b = frames[i + 3]; + a = frames[i + 4]; + break; + default: + r = this.getBezierValue(time, i, 1, curveType - 2); + g = this.getBezierValue(time, i, 2, curveType + 18 - 2); + b = this.getBezierValue(time, i, 3, curveType + 18 * 2 - 2); + a = this.getBezierValue(time, i, 4, curveType + 18 * 3 - 2); + } + if (alpha == 1) + color.set(r, g, b, a); + else { + if (blend == 0) + color.setFromColor(slot.data.color); + color.add((r - color.r) * alpha, (g - color.g) * alpha, (b - color.b) * alpha, (a - color.a) * alpha); + } + } + }; + var RGBTimeline = class extends CurveTimeline { + constructor(frameCount, bezierCount, slotIndex) { + super(frameCount, bezierCount, [ + Property.rgb + "|" + slotIndex + ]); + this.slotIndex = 0; + this.slotIndex = slotIndex; + } + getFrameEntries() { + return 4; + } + setFrame(frame, time, r, g, b) { + frame <<= 2; + this.frames[frame] = time; + this.frames[frame + 1] = r; + this.frames[frame + 2] = g; + this.frames[frame + 3] = b; + } + apply(skeleton, lastTime, time, events, alpha, blend, direction) { + let slot = skeleton.slots[this.slotIndex]; + if (!slot.bone.active) + return; + let frames = this.frames; + let color = slot.color; + if (time < frames[0]) { + let setup = slot.data.color; + switch (blend) { + case 0: + color.r = setup.r; + color.g = setup.g; + color.b = setup.b; + return; + case 1: + 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 = Timeline.search(frames, time, 4); + let curveType = this.curves[i >> 2]; + switch (curveType) { + case 0: + let before = frames[i]; + r = frames[i + 1]; + g = frames[i + 2]; + b = frames[i + 3]; + let t = (time - before) / (frames[i + 4] - before); + r += (frames[i + 4 + 1] - r) * t; + g += (frames[i + 4 + 2] - g) * t; + b += (frames[i + 4 + 3] - b) * t; + break; + case 1: + r = frames[i + 1]; + g = frames[i + 2]; + b = frames[i + 3]; + break; + default: + r = this.getBezierValue(time, i, 1, curveType - 2); + g = this.getBezierValue(time, i, 2, curveType + 18 - 2); + b = this.getBezierValue(time, i, 3, curveType + 18 * 2 - 2); + } + if (alpha == 1) { + color.r = r; + color.g = g; + color.b = b; + } else { + if (blend == 0) { + 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; + } + } + }; + var AlphaTimeline = class extends CurveTimeline1 { + constructor(frameCount, bezierCount, slotIndex) { + super(frameCount, bezierCount, Property.alpha + "|" + slotIndex); + this.slotIndex = 0; + this.slotIndex = slotIndex; + } + apply(skeleton, lastTime, time, events, alpha, blend, direction) { + let slot = skeleton.slots[this.slotIndex]; + if (!slot.bone.active) + return; + let color = slot.color; + if (time < this.frames[0]) { + let setup = slot.data.color; + switch (blend) { + case 0: + color.a = setup.a; + return; + case 1: + color.a += (setup.a - color.a) * alpha; + } + return; + } + let a = this.getCurveValue(time); + if (alpha == 1) + color.a = a; + else { + if (blend == 0) + color.a = slot.data.color.a; + color.a += (a - color.a) * alpha; + } + } + }; + var RGBA2Timeline = class extends CurveTimeline { + constructor(frameCount, bezierCount, slotIndex) { + super(frameCount, bezierCount, [ + Property.rgb + "|" + slotIndex, + Property.alpha + "|" + slotIndex, + Property.rgb2 + "|" + slotIndex + ]); + this.slotIndex = 0; + this.slotIndex = slotIndex; + } + getFrameEntries() { + return 8; + } + setFrame(frame, time, r, g, b, a, r2, g2, b2) { + frame <<= 3; + this.frames[frame] = time; + this.frames[frame + 1] = r; + this.frames[frame + 2] = g; + this.frames[frame + 3] = b; + this.frames[frame + 4] = a; + this.frames[frame + 5] = r2; + this.frames[frame + 6] = g2; + this.frames[frame + 7] = b2; + } + apply(skeleton, lastTime, time, events, alpha, blend, direction) { + let slot = skeleton.slots[this.slotIndex]; + if (!slot.bone.active) + return; + let frames = this.frames; + let light = slot.color, dark = slot.darkColor; + if (time < frames[0]) { + let setupLight = slot.data.color, setupDark = slot.data.darkColor; + switch (blend) { + case 0: + light.setFromColor(setupLight); + dark.r = setupDark.r; + dark.g = setupDark.g; + dark.b = setupDark.b; + return; + case 1: + 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 = Timeline.search(frames, time, 8); + let curveType = this.curves[i >> 3]; + switch (curveType) { + case 0: + let before = frames[i]; + r = frames[i + 1]; + g = frames[i + 2]; + b = frames[i + 3]; + a = frames[i + 4]; + r2 = frames[i + 5]; + g2 = frames[i + 6]; + b2 = frames[i + 7]; + let t = (time - before) / (frames[i + 8] - before); + r += (frames[i + 8 + 1] - r) * t; + g += (frames[i + 8 + 2] - g) * t; + b += (frames[i + 8 + 3] - b) * t; + a += (frames[i + 8 + 4] - a) * t; + r2 += (frames[i + 8 + 5] - r2) * t; + g2 += (frames[i + 8 + 6] - g2) * t; + b2 += (frames[i + 8 + 7] - b2) * t; + break; + case 1: + r = frames[i + 1]; + g = frames[i + 2]; + b = frames[i + 3]; + a = frames[i + 4]; + r2 = frames[i + 5]; + g2 = frames[i + 6]; + b2 = frames[i + 7]; + break; + default: + r = this.getBezierValue(time, i, 1, curveType - 2); + g = this.getBezierValue(time, i, 2, curveType + 18 - 2); + b = this.getBezierValue(time, i, 3, curveType + 18 * 2 - 2); + a = this.getBezierValue(time, i, 4, curveType + 18 * 3 - 2); + r2 = this.getBezierValue(time, i, 5, curveType + 18 * 4 - 2); + g2 = this.getBezierValue(time, i, 6, curveType + 18 * 5 - 2); + b2 = this.getBezierValue(time, i, 7, curveType + 18 * 6 - 2); + } + if (alpha == 1) { + light.set(r, g, b, a); + dark.r = r2; + dark.g = g2; + dark.b = b2; + } else { + if (blend == 0) { + light.setFromColor(slot.data.color); + let setupDark = slot.data.darkColor; + dark.r = setupDark.r; + dark.g = setupDark.g; + dark.b = setupDark.b; + } + 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; + } + } + }; + var RGB2Timeline = class extends CurveTimeline { + constructor(frameCount, bezierCount, slotIndex) { + super(frameCount, bezierCount, [ + Property.rgb + "|" + slotIndex, + Property.rgb2 + "|" + slotIndex + ]); + this.slotIndex = 0; + this.slotIndex = slotIndex; + } + getFrameEntries() { + return 7; + } + setFrame(frame, time, r, g, b, r2, g2, b2) { + frame *= 7; + this.frames[frame] = time; + this.frames[frame + 1] = r; + this.frames[frame + 2] = g; + this.frames[frame + 3] = b; + this.frames[frame + 4] = r2; + this.frames[frame + 5] = g2; + this.frames[frame + 6] = b2; + } + apply(skeleton, lastTime, time, events, alpha, blend, direction) { + let slot = skeleton.slots[this.slotIndex]; + if (!slot.bone.active) + return; + let frames = this.frames; + let light = slot.color, dark = slot.darkColor; + if (time < frames[0]) { + let setupLight = slot.data.color, setupDark = slot.data.darkColor; + switch (blend) { + case 0: + 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 1: + 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; + } + let r = 0, g = 0, b = 0, a = 0, r2 = 0, g2 = 0, b2 = 0; + let i = Timeline.search(frames, time, 7); + let curveType = this.curves[i / 7]; + switch (curveType) { + case 0: + let before = frames[i]; + r = frames[i + 1]; + g = frames[i + 2]; + b = frames[i + 3]; + r2 = frames[i + 4]; + g2 = frames[i + 5]; + b2 = frames[i + 6]; + let t = (time - before) / (frames[i + 7] - before); + r += (frames[i + 7 + 1] - r) * t; + g += (frames[i + 7 + 2] - g) * t; + b += (frames[i + 7 + 3] - b) * t; + r2 += (frames[i + 7 + 4] - r2) * t; + g2 += (frames[i + 7 + 5] - g2) * t; + b2 += (frames[i + 7 + 6] - b2) * t; + break; + case 1: + r = frames[i + 1]; + g = frames[i + 2]; + b = frames[i + 3]; + r2 = frames[i + 4]; + g2 = frames[i + 5]; + b2 = frames[i + 6]; + break; + default: + r = this.getBezierValue(time, i, 1, curveType - 2); + g = this.getBezierValue(time, i, 2, curveType + 18 - 2); + b = this.getBezierValue(time, i, 3, curveType + 18 * 2 - 2); + r2 = this.getBezierValue(time, i, 4, curveType + 18 * 3 - 2); + g2 = this.getBezierValue(time, i, 5, curveType + 18 * 4 - 2); + b2 = this.getBezierValue(time, i, 6, curveType + 18 * 5 - 2); + } + if (alpha == 1) { + light.r = r; + light.g = g; + light.b = b; + dark.r = r2; + dark.g = g2; + dark.b = b2; + } else { + if (blend == 0) { + 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; + } + } + }; + var AttachmentTimeline = class extends Timeline { + constructor(frameCount, slotIndex) { + super(frameCount, [ + Property.attachment + "|" + slotIndex + ]); + this.slotIndex = 0; + this.slotIndex = slotIndex; + this.attachmentNames = new Array(frameCount); + } + getFrameCount() { + return this.frames.length; + } + 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 == 1) { + if (blend == 0) + this.setAttachment(skeleton, slot, slot.data.attachmentName); + return; + } + if (time < this.frames[0]) { + if (blend == 0 || blend == 1) + this.setAttachment(skeleton, slot, slot.data.attachmentName); + return; + } + this.setAttachment(skeleton, slot, this.attachmentNames[Timeline.search1(this.frames, time)]); + } + setAttachment(skeleton, slot, attachmentName) { + slot.setAttachment(!attachmentName ? null : skeleton.getAttachment(this.slotIndex, attachmentName)); + } + }; + var DeformTimeline = class extends CurveTimeline { + constructor(frameCount, bezierCount, slotIndex, attachment) { + super(frameCount, bezierCount, [ + Property.deform + "|" + slotIndex + "|" + attachment.id + ]); + this.slotIndex = 0; + this.attachment = null; + this.vertices = null; + this.slotIndex = slotIndex; + this.attachment = attachment; + this.vertices = new Array(frameCount); + } + getFrameCount() { + return this.frames.length; + } + setFrame(frame, time, vertices) { + this.frames[frame] = time; + this.vertices[frame] = vertices; + } + setBezier(bezier, frame, value, time1, value1, cx1, cy1, cx2, cy2, time2, value2) { + let curves = this.curves; + let i = this.getFrameCount() + bezier * 18; + if (value == 0) + curves[frame] = 2 + i; + let tmpx = (time1 - cx1 * 2 + cx2) * 0.03, tmpy = cy2 * 0.03 - cy1 * 0.06; + let dddx = ((cx1 - cx2) * 3 - time1 + time2) * 6e-3, 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 + 18; 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 i = curves[frame]; + switch (i) { + case 0: + let x2 = this.frames[frame]; + return (time - x2) / (this.frames[frame + this.getFrameEntries()] - x2); + case 1: + return 0; + } + i -= 2; + if (curves[i] > time) { + let x2 = this.frames[frame]; + return curves[i + 1] * (time - x2) / (curves[i] - x2); + } + let n = i + 18; + for (i += 2; i < n; i += 2) { + if (curves[i] >= time) { + let x2 = curves[i - 2], y2 = curves[i - 1]; + return y2 + (time - x2) / (curves[i] - x2) * (curves[i + 1] - y2); + } + } + let x = curves[n - 2], y = curves[n - 1]; + return y + (1 - y) * (time - x) / (this.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) || slotAttachment.deformAttachment != this.attachment) + return; + let deform = slot.deform; + if (deform.length == 0) + blend = 0; + let vertices = this.vertices; + let vertexCount = vertices[0].length; + let frames = this.frames; + if (time < frames[0]) { + let vertexAttachment = slotAttachment; + switch (blend) { + case 0: + deform.length = 0; + return; + case 1: + if (alpha == 1) { + deform.length = 0; + return; + } + deform.length = vertexCount; + if (!vertexAttachment.bones) { + let setupVertices = vertexAttachment.vertices; + for (var i = 0; i < vertexCount; i++) + deform[i] += (setupVertices[i] - deform[i]) * alpha; + } else { + alpha = 1 - alpha; + for (var i = 0; i < vertexCount; i++) + deform[i] *= alpha; } - tuple[i] = line.substring(lastMatch).trim(); - return i + 1; - }; - return TextureAtlasReader; - }()); - var TextureAtlasPage = (function () { - function TextureAtlasPage() { - } - return TextureAtlasPage; - }()); - spine.TextureAtlasPage = TextureAtlasPage; - var TextureAtlasRegion = (function (_super) { - __extends(TextureAtlasRegion, _super); - function TextureAtlasRegion() { - return _super !== null && _super.apply(this, arguments) || this; - } - return TextureAtlasRegion; - }(spine.TextureRegion)); - spine.TextureAtlasRegion = TextureAtlasRegion; -})(spine || (spine = {})); -var spine; -(function (spine) { - var TransformConstraint = (function () { - function TransformConstraint(data, skeleton) { - this.rotateMix = 0; - this.translateMix = 0; - this.scaleMix = 0; - this.shearMix = 0; - this.temp = new spine.Vector2(); - this.active = false; - 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 (var i = 0; i < data.bones.length; i++) - this.bones.push(skeleton.findBone(data.bones[i].name)); - this.target = skeleton.findBone(data.target.name); - } - TransformConstraint.prototype.isActive = function () { - return this.active; - }; - TransformConstraint.prototype.apply = function () { - this.update(); - }; - TransformConstraint.prototype.update = function () { - if (this.data.local) { - if (this.data.relative) - this.applyRelativeLocal(); - else - this.applyAbsoluteLocal(); + } + return; + } + deform.length = vertexCount; + if (time >= frames[frames.length - 1]) { + let lastVertices = vertices[frames.length - 1]; + if (alpha == 1) { + if (blend == 3) { + let vertexAttachment = slotAttachment; + if (!vertexAttachment.bones) { + let setupVertices = vertexAttachment.vertices; + for (let i2 = 0; i2 < vertexCount; i2++) + deform[i2] += lastVertices[i2] - setupVertices[i2]; + } else { + for (let i2 = 0; i2 < vertexCount; i2++) + deform[i2] += lastVertices[i2]; + } + } else + Utils.arrayCopy(lastVertices, 0, deform, 0, vertexCount); + } else { + switch (blend) { + case 0: { + let vertexAttachment2 = slotAttachment; + if (!vertexAttachment2.bones) { + let setupVertices = vertexAttachment2.vertices; + for (let i2 = 0; i2 < vertexCount; i2++) { + let setup = setupVertices[i2]; + deform[i2] = setup + (lastVertices[i2] - setup) * alpha; + } + } else { + for (let i2 = 0; i2 < vertexCount; i2++) + deform[i2] = lastVertices[i2] * alpha; + } + break; + } + case 1: + case 2: + for (let i2 = 0; i2 < vertexCount; i2++) + deform[i2] += (lastVertices[i2] - deform[i2]) * alpha; + break; + case 3: + let vertexAttachment = slotAttachment; + if (!vertexAttachment.bones) { + let setupVertices = vertexAttachment.vertices; + for (let i2 = 0; i2 < vertexCount; i2++) + deform[i2] += (lastVertices[i2] - setupVertices[i2]) * alpha; + } else { + for (let i2 = 0; i2 < vertexCount; i2++) + deform[i2] += lastVertices[i2] * alpha; + } + } + } + return; + } + let frame = Timeline.search1(frames, time); + let percent = this.getCurvePercent(time, frame); + let prevVertices = vertices[frame]; + let nextVertices = vertices[frame + 1]; + if (alpha == 1) { + if (blend == 3) { + let vertexAttachment = slotAttachment; + if (!vertexAttachment.bones) { + let setupVertices = vertexAttachment.vertices; + for (let i2 = 0; i2 < vertexCount; i2++) { + let prev = prevVertices[i2]; + deform[i2] += prev + (nextVertices[i2] - prev) * percent - setupVertices[i2]; + } + } else { + for (let i2 = 0; i2 < vertexCount; i2++) { + let prev = prevVertices[i2]; + deform[i2] += prev + (nextVertices[i2] - prev) * percent; + } + } + } else { + for (let i2 = 0; i2 < vertexCount; i2++) { + let prev = prevVertices[i2]; + deform[i2] = prev + (nextVertices[i2] - prev) * percent; + } + } + } else { + switch (blend) { + case 0: { + let vertexAttachment2 = slotAttachment; + if (!vertexAttachment2.bones) { + let setupVertices = vertexAttachment2.vertices; + for (let i2 = 0; i2 < vertexCount; i2++) { + let prev = prevVertices[i2], setup = setupVertices[i2]; + deform[i2] = setup + (prev + (nextVertices[i2] - prev) * percent - setup) * alpha; + } + } else { + for (let i2 = 0; i2 < vertexCount; i2++) { + let prev = prevVertices[i2]; + deform[i2] = (prev + (nextVertices[i2] - prev) * percent) * alpha; + } + } + break; + } + case 1: + case 2: + for (let i2 = 0; i2 < vertexCount; i2++) { + let prev = prevVertices[i2]; + deform[i2] += (prev + (nextVertices[i2] - prev) * percent - deform[i2]) * alpha; + } + break; + case 3: + let vertexAttachment = slotAttachment; + if (!vertexAttachment.bones) { + let setupVertices = vertexAttachment.vertices; + for (let i2 = 0; i2 < vertexCount; i2++) { + let prev = prevVertices[i2]; + deform[i2] += (prev + (nextVertices[i2] - prev) * percent - setupVertices[i2]) * alpha; + } + } else { + for (let i2 = 0; i2 < vertexCount; i2++) { + let prev = prevVertices[i2]; + deform[i2] += (prev + (nextVertices[i2] - prev) * percent) * alpha; + } } + } + } + } + }; + var _EventTimeline = class extends Timeline { + constructor(frameCount) { + super(frameCount, _EventTimeline.propertyIds); + this.events = null; + this.events = new Array(frameCount); + } + getFrameCount() { + return this.frames.length; + } + setFrame(frame, event) { + this.frames[frame] = event.time; + this.events[frame] = event; + } + apply(skeleton, lastTime, time, firedEvents, alpha, blend, direction) { + if (!firedEvents) + return; + let frames = this.frames; + let frameCount = this.frames.length; + if (lastTime > time) { + this.apply(skeleton, lastTime, Number.MAX_VALUE, firedEvents, alpha, blend, direction); + lastTime = -1; + } else if (lastTime >= frames[frameCount - 1]) + return; + if (time < frames[0]) + return; + let i = 0; + if (lastTime < frames[0]) + i = 0; + else { + i = Timeline.search1(frames, lastTime) + 1; + let frameTime = frames[i]; + while (i > 0) { + if (frames[i - 1] != frameTime) + break; + i--; + } + } + for (; i < frameCount && time >= frames[i]; i++) + firedEvents.push(this.events[i]); + } + }; + var EventTimeline = _EventTimeline; + EventTimeline.propertyIds = ["" + Property.event]; + var _DrawOrderTimeline = class extends Timeline { + constructor(frameCount) { + super(frameCount, _DrawOrderTimeline.propertyIds); + this.drawOrders = null; + this.drawOrders = new Array(frameCount); + } + getFrameCount() { + return this.frames.length; + } + setFrame(frame, time, drawOrder) { + this.frames[frame] = time; + this.drawOrders[frame] = drawOrder; + } + apply(skeleton, lastTime, time, firedEvents, alpha, blend, direction) { + if (direction == 1) { + if (blend == 0) + Utils.arrayCopy(skeleton.slots, 0, skeleton.drawOrder, 0, skeleton.slots.length); + return; + } + if (time < this.frames[0]) { + if (blend == 0 || blend == 1) + Utils.arrayCopy(skeleton.slots, 0, skeleton.drawOrder, 0, skeleton.slots.length); + return; + } + let drawOrderToSetupIndex = this.drawOrders[Timeline.search1(this.frames, time)]; + if (!drawOrderToSetupIndex) + Utils.arrayCopy(skeleton.slots, 0, skeleton.drawOrder, 0, skeleton.slots.length); + else { + let drawOrder = skeleton.drawOrder; + let slots = skeleton.slots; + for (let i = 0, n = drawOrderToSetupIndex.length; i < n; i++) + drawOrder[i] = slots[drawOrderToSetupIndex[i]]; + } + } + }; + var DrawOrderTimeline = _DrawOrderTimeline; + DrawOrderTimeline.propertyIds = ["" + Property.drawOrder]; + var IkConstraintTimeline = class extends CurveTimeline { + constructor(frameCount, bezierCount, ikConstraintIndex) { + super(frameCount, bezierCount, [ + Property.ikConstraint + "|" + ikConstraintIndex + ]); + this.ikConstraintIndex = 0; + this.ikConstraintIndex = ikConstraintIndex; + } + getFrameEntries() { + return 6; + } + setFrame(frame, time, mix, softness, bendDirection, compress, stretch) { + frame *= 6; + this.frames[frame] = time; + this.frames[frame + 1] = mix; + this.frames[frame + 2] = softness; + this.frames[frame + 3] = bendDirection; + this.frames[frame + 4] = compress ? 1 : 0; + this.frames[frame + 5] = stretch ? 1 : 0; + } + apply(skeleton, lastTime, time, firedEvents, alpha, blend, direction) { + let constraint = skeleton.ikConstraints[this.ikConstraintIndex]; + if (!constraint.active) + return; + let frames = this.frames; + if (time < frames[0]) { + switch (blend) { + case 0: + 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 1: + 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 = Timeline.search(frames, time, 6); + let curveType = this.curves[i / 6]; + switch (curveType) { + case 0: + let before = frames[i]; + mix = frames[i + 1]; + softness = frames[i + 2]; + let t = (time - before) / (frames[i + 6] - before); + mix += (frames[i + 6 + 1] - mix) * t; + softness += (frames[i + 6 + 2] - softness) * t; + break; + case 1: + mix = frames[i + 1]; + softness = frames[i + 2]; + break; + default: + mix = this.getBezierValue(time, i, 1, curveType - 2); + softness = this.getBezierValue(time, i, 2, curveType + 18 - 2); + } + if (blend == 0) { + constraint.mix = constraint.data.mix + (mix - constraint.data.mix) * alpha; + constraint.softness = constraint.data.softness + (softness - constraint.data.softness) * alpha; + if (direction == 1) { + constraint.bendDirection = constraint.data.bendDirection; + constraint.compress = constraint.data.compress; + constraint.stretch = constraint.data.stretch; + } else { + constraint.bendDirection = frames[i + 3]; + constraint.compress = frames[i + 4] != 0; + constraint.stretch = frames[i + 5] != 0; + } + } else { + constraint.mix += (mix - constraint.mix) * alpha; + constraint.softness += (softness - constraint.softness) * alpha; + if (direction == 0) { + constraint.bendDirection = frames[i + 3]; + constraint.compress = frames[i + 4] != 0; + constraint.stretch = frames[i + 5] != 0; + } + } + } + }; + var TransformConstraintTimeline = class extends CurveTimeline { + constructor(frameCount, bezierCount, transformConstraintIndex) { + super(frameCount, bezierCount, [ + Property.transformConstraint + "|" + transformConstraintIndex + ]); + this.transformConstraintIndex = 0; + this.transformConstraintIndex = transformConstraintIndex; + } + getFrameEntries() { + return 7; + } + setFrame(frame, time, mixRotate, mixX, mixY, mixScaleX, mixScaleY, mixShearY) { + let frames = this.frames; + frame *= 7; + frames[frame] = time; + frames[frame + 1] = mixRotate; + frames[frame + 2] = mixX; + frames[frame + 3] = mixY; + frames[frame + 4] = mixScaleX; + frames[frame + 5] = mixScaleY; + frames[frame + 6] = mixShearY; + } + apply(skeleton, lastTime, time, firedEvents, alpha, blend, direction) { + let constraint = skeleton.transformConstraints[this.transformConstraintIndex]; + if (!constraint.active) + return; + let frames = this.frames; + if (time < frames[0]) { + let data = constraint.data; + switch (blend) { + case 0: + 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 1: + 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 = Timeline.search(frames, time, 7); + let curveType = this.curves[i / 7]; + switch (curveType) { + case 0: + let before = frames[i]; + rotate = frames[i + 1]; + x = frames[i + 2]; + y = frames[i + 3]; + scaleX = frames[i + 4]; + scaleY = frames[i + 5]; + shearY = frames[i + 6]; + let t = (time - before) / (frames[i + 7] - before); + rotate += (frames[i + 7 + 1] - rotate) * t; + x += (frames[i + 7 + 2] - x) * t; + y += (frames[i + 7 + 3] - y) * t; + scaleX += (frames[i + 7 + 4] - scaleX) * t; + scaleY += (frames[i + 7 + 5] - scaleY) * t; + shearY += (frames[i + 7 + 6] - shearY) * t; + break; + case 1: + rotate = frames[i + 1]; + x = frames[i + 2]; + y = frames[i + 3]; + scaleX = frames[i + 4]; + scaleY = frames[i + 5]; + shearY = frames[i + 6]; + break; + default: + rotate = this.getBezierValue(time, i, 1, curveType - 2); + x = this.getBezierValue(time, i, 2, curveType + 18 - 2); + y = this.getBezierValue(time, i, 3, curveType + 18 * 2 - 2); + scaleX = this.getBezierValue(time, i, 4, curveType + 18 * 3 - 2); + scaleY = this.getBezierValue(time, i, 5, curveType + 18 * 4 - 2); + shearY = this.getBezierValue(time, i, 6, curveType + 18 * 5 - 2); + } + if (blend == 0) { + 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; + } + } + }; + var PathConstraintPositionTimeline = class extends CurveTimeline1 { + constructor(frameCount, bezierCount, pathConstraintIndex) { + super(frameCount, bezierCount, Property.pathConstraintPosition + "|" + pathConstraintIndex); + this.pathConstraintIndex = 0; + this.pathConstraintIndex = pathConstraintIndex; + } + apply(skeleton, lastTime, time, firedEvents, alpha, blend, direction) { + let constraint = skeleton.pathConstraints[this.pathConstraintIndex]; + if (!constraint.active) + return; + let frames = this.frames; + if (time < frames[0]) { + switch (blend) { + case 0: + constraint.position = constraint.data.position; + return; + case 1: + constraint.position += (constraint.data.position - constraint.position) * alpha; + } + return; + } + let position = this.getCurveValue(time); + if (blend == 0) + constraint.position = constraint.data.position + (position - constraint.data.position) * alpha; + else + constraint.position += (position - constraint.position) * alpha; + } + }; + var PathConstraintSpacingTimeline = class extends CurveTimeline1 { + constructor(frameCount, bezierCount, pathConstraintIndex) { + super(frameCount, bezierCount, Property.pathConstraintSpacing + "|" + pathConstraintIndex); + this.pathConstraintIndex = 0; + this.pathConstraintIndex = pathConstraintIndex; + } + apply(skeleton, lastTime, time, firedEvents, alpha, blend, direction) { + let constraint = skeleton.pathConstraints[this.pathConstraintIndex]; + if (!constraint.active) + return; + let frames = this.frames; + if (time < frames[0]) { + switch (blend) { + case 0: + constraint.spacing = constraint.data.spacing; + return; + case 1: + constraint.spacing += (constraint.data.spacing - constraint.spacing) * alpha; + } + return; + } + let spacing = this.getCurveValue(time); + if (blend == 0) + constraint.spacing = constraint.data.spacing + (spacing - constraint.data.spacing) * alpha; + else + constraint.spacing += (spacing - constraint.spacing) * alpha; + } + }; + var PathConstraintMixTimeline = class extends CurveTimeline { + constructor(frameCount, bezierCount, pathConstraintIndex) { + super(frameCount, bezierCount, [ + Property.pathConstraintMix + "|" + pathConstraintIndex + ]); + this.pathConstraintIndex = 0; + this.pathConstraintIndex = pathConstraintIndex; + } + getFrameEntries() { + return 4; + } + setFrame(frame, time, mixRotate, mixX, mixY) { + let frames = this.frames; + frame <<= 2; + frames[frame] = time; + frames[frame + 1] = mixRotate; + frames[frame + 2] = mixX; + frames[frame + 3] = mixY; + } + apply(skeleton, lastTime, time, firedEvents, alpha, blend, direction) { + let constraint = skeleton.pathConstraints[this.pathConstraintIndex]; + if (!constraint.active) + return; + let frames = this.frames; + if (time < frames[0]) { + switch (blend) { + case 0: + constraint.mixRotate = constraint.data.mixRotate; + constraint.mixX = constraint.data.mixX; + constraint.mixY = constraint.data.mixY; + return; + case 1: + 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 = Timeline.search(frames, time, 4); + let curveType = this.curves[i >> 2]; + switch (curveType) { + case 0: + let before = frames[i]; + rotate = frames[i + 1]; + x = frames[i + 2]; + y = frames[i + 3]; + let t = (time - before) / (frames[i + 4] - before); + rotate += (frames[i + 4 + 1] - rotate) * t; + x += (frames[i + 4 + 2] - x) * t; + y += (frames[i + 4 + 3] - y) * t; + break; + case 1: + rotate = frames[i + 1]; + x = frames[i + 2]; + y = frames[i + 3]; + break; + default: + rotate = this.getBezierValue(time, i, 1, curveType - 2); + x = this.getBezierValue(time, i, 2, curveType + 18 - 2); + y = this.getBezierValue(time, i, 3, curveType + 18 * 2 - 2); + } + if (blend == 0) { + 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; + } + } + }; + + // spine-core/src/AnimationState.ts + var AnimationState = class { + constructor(data) { + this.data = null; + this.tracks = new Array(); + this.timeScale = 1; + this.unkeyedState = 0; + this.events = new Array(); + this.listeners = new Array(); + this.queue = new EventQueue(this); + this.propertyIDs = new StringSet(); + this.animationsChanged = false; + this.trackEntryPool = new Pool(() => new TrackEntry()); + this.data = data; + } + static emptyAnimation() { + if (!_emptyAnimation) + _emptyAnimation = new Animation("", [], 0); + return _emptyAnimation; + } + 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) + 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) { + 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) { + next.mixTime += delta; + next = next.mixingFrom; + } + continue; + } + } else if (current.trackLast >= current.trackEnd && !current.mixingFrom) { + tracks[i] = null; + this.queue.end(current); + this.clearNext(current); + continue; + } + if (current.mixingFrom && this.updateMixingFrom(current, delta)) { + let from = current.mixingFrom; + current.mixingFrom = null; + if (from) + from.mixingTo = null; + while (from) { + this.queue.end(from); + from = from.mixingFrom; + } + } + current.trackTime += currentDelta; + } + this.queue.drain(); + } + updateMixingFrom(to, delta) { + let from = to.mixingFrom; + if (!from) + return true; + let finished = this.updateMixingFrom(from, delta); + from.animationLast = from.nextAnimationLast; + from.trackLast = from.nextTrackLast; + if (to.mixTime > 0 && to.mixTime >= to.mixDuration) { + if (from.totalAlpha == 0 || to.mixDuration == 0) { + to.mixingFrom = from.mixingFrom; + if (from.mixingFrom) + 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) + 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 i2 = 0, n2 = tracks.length; i2 < n2; i2++) { + let current = tracks[i2]; + if (!current || current.delay > 0) + continue; + applied = true; + let blend = i2 == 0 ? MixBlend.first : current.mixBlend; + let mix = current.alpha; + if (current.mixingFrom) + mix *= this.applyMixingFrom(current, skeleton, blend); + else if (current.trackTime >= current.trackEnd && !current.next) + mix = 0; + let animationLast = current.animationLast, animationTime = current.getAnimationTime(), applyTime = animationTime; + let applyEvents = events; + if (current.reverse) { + applyTime = current.animation.duration - applyTime; + applyEvents = null; + } + let timelines = current.animation.timelines; + let timelineCount = timelines.length; + if (i2 == 0 && mix == 1 || blend == MixBlend.add) { + for (let ii = 0; ii < timelineCount; ii++) { + Utils.webkit602BugfixHelper(mix, blend); + var timeline = timelines[ii]; + if (timeline instanceof AttachmentTimeline) + this.applyAttachmentTimeline(timeline, skeleton, applyTime, blend, true); + else + timeline.apply(skeleton, animationLast, applyTime, applyEvents, mix, blend, MixDirection.mixIn); + } + } else { + let timelineMode = current.timelineMode; + let firstFrame = current.timelinesRotation.length != timelineCount << 1; + if (firstFrame) + current.timelinesRotation.length = timelineCount << 1; + for (let ii = 0; ii < timelineCount; ii++) { + let timeline2 = timelines[ii]; + let timelineBlend = timelineMode[ii] == SUBSEQUENT ? blend : MixBlend.setup; + if (timeline2 instanceof RotateTimeline) { + this.applyRotateTimeline(timeline2, skeleton, applyTime, mix, timelineBlend, current.timelinesRotation, ii << 1, firstFrame); + } else if (timeline2 instanceof AttachmentTimeline) { + this.applyAttachmentTimeline(timeline2, skeleton, applyTime, blend, true); + } else { + Utils.webkit602BugfixHelper(mix, blend); + timeline2.apply(skeleton, animationLast, applyTime, applyEvents, mix, timelineBlend, MixDirection.mixIn); + } + } + } + this.queueEvents(current, animationTime); + events.length = 0; + current.nextAnimationLast = animationTime; + current.nextTrackLast = current.trackTime; + } + var setupState = this.unkeyedState + 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 : skeleton.getAttachment(slot.data.index, attachmentName)); + } + } + this.unkeyedState += 2; + this.queue.drain(); + return applied; + } + applyMixingFrom(to, skeleton, blend) { + let from = to.mixingFrom; + if (from.mixingFrom) + this.applyMixingFrom(from, skeleton, blend); + let mix = 0; + if (to.mixDuration == 0) { + 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 attachments = mix < from.attachmentThreshold, drawOrder = mix < from.drawOrderThreshold; + let timelines = from.animation.timelines; + let timelineCount = timelines.length; + let alphaHold = from.alpha * to.interruptAlpha, alphaMix = alphaHold * (1 - mix); + let animationLast = from.animationLast, animationTime = from.getAnimationTime(), applyTime = animationTime; + let events = null; + if (from.reverse) + applyTime = from.animation.duration - applyTime; + else if (mix < from.eventThreshold) + events = this.events; + if (blend == MixBlend.add) { + for (let i = 0; i < timelineCount; i++) + timelines[i].apply(skeleton, animationLast, applyTime, events, alphaMix, blend, MixDirection.mixOut); + } else { + let timelineMode = from.timelineMode; + let timelineHoldMix = from.timelineHoldMix; + let firstFrame = from.timelinesRotation.length != timelineCount << 1; + if (firstFrame) + from.timelinesRotation.length = timelineCount << 1; + 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 SUBSEQUENT: + if (!drawOrder && timeline instanceof DrawOrderTimeline) + continue; + timelineBlend = blend; + alpha = alphaMix; + break; + case FIRST: + timelineBlend = MixBlend.setup; + alpha = alphaMix; + break; + case HOLD_SUBSEQUENT: + timelineBlend = blend; + alpha = alphaHold; + break; + case 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, applyTime, alpha, timelineBlend, from.timelinesRotation, i << 1, firstFrame); + else if (timeline instanceof AttachmentTimeline) + this.applyAttachmentTimeline(timeline, skeleton, applyTime, timelineBlend, attachments); + else { + Utils.webkit602BugfixHelper(alpha, blend); + if (drawOrder && timeline instanceof DrawOrderTimeline && timelineBlend == MixBlend.setup) + direction = MixDirection.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; + if (time < timeline.frames[0]) { + if (blend == MixBlend.setup || blend == MixBlend.first) + this.setAttachment(skeleton, slot, slot.data.attachmentName, attachments); + } else + this.setAttachment(skeleton, slot, timeline.attachmentNames[Timeline.search1(timeline.frames, time)], attachments); + if (slot.attachmentState <= this.unkeyedState) + slot.attachmentState = this.unkeyedState + SETUP; + } + setAttachment(skeleton, slot, attachmentName, attachments) { + slot.setAttachment(!attachmentName ? null : skeleton.getAttachment(slot.data.index, attachmentName)); + if (attachments) + slot.attachmentState = this.unkeyedState + 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 bone = skeleton.bones[timeline.boneIndex]; + if (!bone.active) + return; + let frames = timeline.frames; + 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; + r2 = bone.data.rotation + timeline.getCurveValue(time); + } + 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]; + lastDiff = timelinesRotation[i + 1]; + } + let current = diff > 0, dir = lastTotal >= 0; + if (MathUtils.signum(lastDiff) != MathUtils.signum(diff) && Math.abs(lastDiff) <= 90) { + if (Math.abs(lastTotal) > 180) + lastTotal += 360 * MathUtils.signum(lastTotal); + dir = current; + } + total = diff + lastTotal - lastTotal % 360; + 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; + 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; + this.queue.event(entry, event); + } + 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); + for (; i < n; i++) { + let event = events[i]; + if (event.time < animationStart) + continue; + this.queue.event(entry, event); + } + } + 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) + return; + this.queue.end(current); + this.clearNext(current); + let entry = current; + while (true) { + let from = entry.mixingFrom; + if (!from) + 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; + current.previous = null; + if (from) { + if (interrupt) + this.queue.interrupt(from); + current.mixingFrom = from; + from.mixingTo = current; + current.mixTime = 0; + if (from.mixingFrom && from.mixDuration > 0) + current.interruptAlpha *= Math.min(1, from.mixTime / from.mixDuration); + from.timelinesRotation.length = 0; + } + this.queue.start(current); + } + setAnimation(trackIndex, animationName, loop = false) { + let animation = this.data.skeletonData.findAnimation(animationName); + if (!animation) + throw new Error("Animation not found: " + animationName); + return this.setAnimationWith(trackIndex, animation, loop); + } + setAnimationWith(trackIndex, animation, loop = false) { + if (!animation) + throw new Error("animation cannot be null."); + let interrupt = true; + let current = this.expandToIndex(trackIndex); + if (current) { + if (current.nextTrackLast == -1) { + this.tracks[trackIndex] = current.mixingFrom; + this.queue.interrupt(current); + this.queue.end(current); + this.clearNext(current); + current = current.mixingFrom; + interrupt = false; + } else + this.clearNext(current); + } + let entry = this.trackEntry(trackIndex, animation, loop, current); + this.setCurrent(trackIndex, entry, interrupt); + this.queue.drain(); + return entry; + } + addAnimation(trackIndex, animationName, loop = false, delay = 0) { + let animation = this.data.skeletonData.findAnimation(animationName); + if (!animation) + throw new Error("Animation not found: " + animationName); + return this.addAnimationWith(trackIndex, animation, loop, delay); + } + addAnimationWith(trackIndex, animation, loop = false, delay = 0) { + if (!animation) + throw new Error("animation cannot be null."); + let last = this.expandToIndex(trackIndex); + if (last) { + while (last.next) + last = last.next; + } + let entry = this.trackEntry(trackIndex, animation, loop, last); + if (!last) { + 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; + } + setEmptyAnimation(trackIndex, mixDuration = 0) { + let entry = this.setAnimationWith(trackIndex, AnimationState.emptyAnimation(), false); + entry.mixDuration = mixDuration; + entry.trackEnd = mixDuration; + return entry; + } + addEmptyAnimation(trackIndex, mixDuration = 0, delay = 0) { + let entry = this.addAnimationWith(trackIndex, AnimationState.emptyAnimation(), false, delay); + if (delay <= 0) + entry.delay += entry.mixDuration - mixDuration; + entry.mixDuration = mixDuration; + entry.trackEnd = mixDuration; + return entry; + } + setEmptyAnimations(mixDuration = 0) { + 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) + 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; + } + trackEntry(trackIndex, animation, loop, last) { + let entry = this.trackEntryPool.obtain(); + entry.reset(); + 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 ? 0 : this.data.getMix(last.animation, animation); + entry.mixBlend = MixBlend.replace; + return entry; + } + clearNext(entry) { + let next = entry.next; + while (next) { + this.queue.dispose(next); + next = next.next; + } + entry.next = null; + } + _animationsChanged() { + this.animationsChanged = false; + this.propertyIDs.clear(); + let tracks = this.tracks; + for (let i = 0, n = tracks.length; i < n; i++) { + let entry = tracks[i]; + if (!entry) + continue; + while (entry.mixingFrom) + entry = entry.mixingFrom; + do { + if (!entry.mixingTo || entry.mixBlend != MixBlend.add) + this.computeHold(entry); + entry = entry.mixingTo; + } while (entry); + } + } + computeHold(entry) { + let to = entry.mixingTo; + let timelines = entry.animation.timelines; + let timelinesCount = entry.animation.timelines.length; + let timelineMode = entry.timelineMode; + timelineMode.length = timelinesCount; + let timelineHoldMix = entry.timelineHoldMix; + timelineHoldMix.length = 0; + let propertyIDs = this.propertyIDs; + if (to && to.holdPrevious) { + for (let i = 0; i < timelinesCount; i++) + timelineMode[i] = propertyIDs.addAll(timelines[i].getPropertyIds()) ? HOLD_FIRST : 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] = SUBSEQUENT; + else if (!to || timeline instanceof AttachmentTimeline || timeline instanceof DrawOrderTimeline || timeline instanceof EventTimeline || !to.animation.hasTimeline(ids)) { + timelineMode[i] = FIRST; + } else { + for (let next = to.mixingTo; next; next = next.mixingTo) { + if (next.animation.hasTimeline(ids)) + continue; + if (entry.mixDuration > 0) { + timelineMode[i] = HOLD_MIX; + timelineHoldMix[i] = next; + continue outer; + } + break; + } + timelineMode[i] = HOLD_FIRST; + } + } + } + getCurrent(trackIndex) { + if (trackIndex >= this.tracks.length) + return null; + return this.tracks[trackIndex]; + } + addListener(listener) { + if (!listener) + throw new Error("listener cannot be null."); + this.listeners.push(listener); + } + 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(); + } + }; + var TrackEntry = class { + constructor() { + this.animation = null; + this.previous = null; + this.next = null; + this.mixingFrom = null; + this.mixingTo = null; + this.listener = null; + this.trackIndex = 0; + this.loop = false; + this.holdPrevious = false; + this.reverse = false; + this.eventThreshold = 0; + this.attachmentThreshold = 0; + this.drawOrderThreshold = 0; + this.animationStart = 0; + this.animationEnd = 0; + this.animationLast = 0; + this.nextAnimationLast = 0; + this.delay = 0; + this.trackTime = 0; + this.trackLast = 0; + this.nextTrackLast = 0; + this.trackEnd = 0; + this.timeScale = 0; + this.alpha = 0; + this.mixTime = 0; + this.mixDuration = 0; + this.interruptAlpha = 0; + this.totalAlpha = 0; + this.mixBlend = MixBlend.replace; + this.timelineMode = new Array(); + this.timelineHoldMix = new Array(); + this.timelinesRotation = new Array(); + } + reset() { + this.next = null; + this.previous = 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; + } + getTrackComplete() { + let duration = this.animationEnd - this.animationStart; + if (duration != 0) { + if (this.loop) + return duration * (1 + (this.trackTime / duration | 0)); + if (this.trackTime < duration) + return duration; + } + return this.trackTime; + } + }; + var EventQueue = class { + constructor(animState) { + this.objects = []; + this.drainDisabled = false; + this.animState = null; + 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); + } + 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 && 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.interrupt: + if (entry.listener && 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 && entry.listener.end) + entry.listener.end(entry); + for (let ii = 0; ii < listeners.length; ii++) + if (listeners[ii].end) + listeners[ii].end(entry); + case EventType.dispose: + if (entry.listener && 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 && 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.event: + let event = objects[i++ + 2]; + if (entry.listener && 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; + } + }; + var EventType; + (function(EventType2) { + EventType2[EventType2["start"] = 0] = "start"; + EventType2[EventType2["interrupt"] = 1] = "interrupt"; + EventType2[EventType2["end"] = 2] = "end"; + EventType2[EventType2["dispose"] = 3] = "dispose"; + EventType2[EventType2["complete"] = 4] = "complete"; + EventType2[EventType2["event"] = 5] = "event"; + })(EventType || (EventType = {})); + var AnimationStateAdapter = class { + start(entry) { + } + interrupt(entry) { + } + end(entry) { + } + dispose(entry) { + } + complete(entry) { + } + event(entry, event) { + } + }; + var SUBSEQUENT = 0; + var FIRST = 1; + var HOLD_SUBSEQUENT = 2; + var HOLD_FIRST = 3; + var HOLD_MIX = 4; + var SETUP = 1; + var CURRENT = 2; + var _emptyAnimation = null; + + // spine-core/src/AnimationStateData.ts + var AnimationStateData = class { + constructor(skeletonData) { + this.skeletonData = null; + this.animationToMixTime = {}; + this.defaultMix = 0; + if (!skeletonData) + throw new Error("skeletonData cannot be null."); + this.skeletonData = skeletonData; + } + setMix(fromName, toName, duration) { + let from = this.skeletonData.findAnimation(fromName); + if (!from) + throw new Error("Animation not found: " + fromName); + let to = this.skeletonData.findAnimation(toName); + if (!to) + throw new Error("Animation not found: " + toName); + this.setMixWith(from, to, duration); + } + setMixWith(from, to, duration) { + if (!from) + throw new Error("from cannot be null."); + if (!to) + 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 === void 0 ? this.defaultMix : value; + } + }; + + // spine-core/src/attachments/BoundingBoxAttachment.ts + var BoundingBoxAttachment = class extends VertexAttachment { + constructor(name) { + super(name); + this.color = new Color(1, 1, 1, 1); + } + copy() { + let copy = new BoundingBoxAttachment(this.name); + this.copyTo(copy); + copy.color.setFromColor(this.color); + return copy; + } + }; + + // spine-core/src/attachments/ClippingAttachment.ts + var ClippingAttachment = class extends VertexAttachment { + constructor(name) { + super(name); + this.endSlot = null; + this.color = new Color(0.2275, 0.2275, 0.8078, 1); + } + copy() { + let copy = new ClippingAttachment(this.name); + this.copyTo(copy); + copy.endSlot = this.endSlot; + copy.color.setFromColor(this.color); + return copy; + } + }; + + // spine-core/src/Texture.ts + var Texture = class { + constructor(image) { + this._image = image; + } + getImage() { + return this._image; + } + }; + var TextureFilter; + (function(TextureFilter2) { + TextureFilter2[TextureFilter2["Nearest"] = 9728] = "Nearest"; + TextureFilter2[TextureFilter2["Linear"] = 9729] = "Linear"; + TextureFilter2[TextureFilter2["MipMap"] = 9987] = "MipMap"; + TextureFilter2[TextureFilter2["MipMapNearestNearest"] = 9984] = "MipMapNearestNearest"; + TextureFilter2[TextureFilter2["MipMapLinearNearest"] = 9985] = "MipMapLinearNearest"; + TextureFilter2[TextureFilter2["MipMapNearestLinear"] = 9986] = "MipMapNearestLinear"; + TextureFilter2[TextureFilter2["MipMapLinearLinear"] = 9987] = "MipMapLinearLinear"; + })(TextureFilter || (TextureFilter = {})); + var TextureWrap; + (function(TextureWrap3) { + TextureWrap3[TextureWrap3["MirroredRepeat"] = 33648] = "MirroredRepeat"; + TextureWrap3[TextureWrap3["ClampToEdge"] = 33071] = "ClampToEdge"; + TextureWrap3[TextureWrap3["Repeat"] = 10497] = "Repeat"; + })(TextureWrap || (TextureWrap = {})); + var TextureRegion = class { + constructor() { + this.u = 0; + this.v = 0; + this.u2 = 0; + this.v2 = 0; + this.width = 0; + this.height = 0; + this.degrees = 0; + this.offsetX = 0; + this.offsetY = 0; + this.originalWidth = 0; + this.originalHeight = 0; + } + }; + var FakeTexture = class extends Texture { + setFilters(minFilter, magFilter) { + } + setWraps(uWrap, vWrap) { + } + dispose() { + } + }; + + // spine-core/src/TextureAtlas.ts + var TextureAtlas = class { + constructor(atlasText) { + this.pages = new Array(); + this.regions = new Array(); + let reader = new TextureAtlasReader(atlasText); + let entry = new Array(4); + let page = null; + let region = null; + let pageFields = {}; + pageFields["size"] = () => { + page.width = parseInt(entry[1]); + page.height = parseInt(entry[2]); + }; + pageFields["format"] = () => { + }; + pageFields["filter"] = () => { + page.minFilter = Utils.enumValue(TextureFilter, entry[1]); + page.magFilter = Utils.enumValue(TextureFilter, entry[2]); + }; + pageFields["repeat"] = () => { + if (entry[1].indexOf("x") != -1) + page.uWrap = TextureWrap.Repeat; + if (entry[1].indexOf("y") != -1) + page.vWrap = TextureWrap.Repeat; + }; + pageFields["pma"] = () => { + page.pma = entry[1] == "true"; + }; + var regionFields = {}; + regionFields["xy"] = () => { + region.x = parseInt(entry[1]); + region.y = parseInt(entry[2]); + }; + regionFields["size"] = () => { + 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"] = () => { + region.offsetX = parseInt(entry[1]); + region.offsetY = parseInt(entry[2]); + }; + regionFields["orig"] = () => { + 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 value = entry[1]; + if (value == "true") + region.degrees = 90; + else if (value != "false") + region.degrees = parseInt(value); + }; + regionFields["index"] = () => { + region.index = parseInt(entry[1]); + }; + let line = reader.readLine(); + while (line && line.trim().length == 0) + line = reader.readLine(); + while (true) { + if (!line || line.trim().length == 0) + break; + if (reader.readEntry(entry, line) == 0) + break; + line = reader.readLine(); + } + let names = null; + let values = null; + while (true) { + if (line === null) + break; + if (line.trim().length == 0) { + page = null; + line = reader.readLine(); + } else if (!page) { + 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); + } else { + region = new TextureAtlasRegion(); + region.page = page; + region.name = line; + while (true) { + let count = reader.readEntry(entry, line = reader.readLine()); + if (count == 0) + break; + let field = regionFields[entry[0]]; + if (field) + field(); else { - if (this.data.relative) - this.applyRelativeWorld(); - else - this.applyAbsoluteWorld(); - } - }; - TransformConstraint.prototype.applyAbsoluteWorld = function () { - var rotateMix = this.rotateMix, translateMix = this.translateMix, scaleMix = this.scaleMix, shearMix = this.shearMix; - var target = this.target; - var ta = target.a, tb = target.b, tc = target.c, td = target.d; - var degRadReflect = ta * td - tb * tc > 0 ? spine.MathUtils.degRad : -spine.MathUtils.degRad; - var offsetRotation = this.data.offsetRotation * degRadReflect; - var offsetShearY = this.data.offsetShearY * degRadReflect; - var bones = this.bones; - for (var i = 0, n = bones.length; i < n; i++) { - var bone = bones[i]; - var modified = false; - if (rotateMix != 0) { - var a = bone.a, b = bone.b, c = bone.c, d = bone.d; - var r = Math.atan2(tc, ta) - Math.atan2(c, a) + offsetRotation; - if (r > spine.MathUtils.PI) - r -= spine.MathUtils.PI2; - else if (r < -spine.MathUtils.PI) - r += spine.MathUtils.PI2; - r *= rotateMix; - var cos = Math.cos(r), sin = Math.sin(r); - bone.a = cos * a - sin * c; - bone.b = cos * b - sin * d; - bone.c = sin * a + cos * c; - bone.d = sin * b + cos * d; - modified = true; - } - if (translateMix != 0) { - var temp = this.temp; - target.localToWorld(temp.set(this.data.offsetX, this.data.offsetY)); - bone.worldX += (temp.x - bone.worldX) * translateMix; - bone.worldY += (temp.y - bone.worldY) * translateMix; - modified = true; - } - if (scaleMix > 0) { - var s = Math.sqrt(bone.a * bone.a + bone.c * bone.c); - var ts = Math.sqrt(ta * ta + tc * tc); - if (s > 0.00001) - s = (s + (ts - s + this.data.offsetScaleX) * scaleMix) / s; - bone.a *= s; - bone.c *= s; - s = Math.sqrt(bone.b * bone.b + bone.d * bone.d); - ts = Math.sqrt(tb * tb + td * td); - if (s > 0.00001) - s = (s + (ts - s + this.data.offsetScaleY) * scaleMix) / s; - bone.b *= s; - bone.d *= s; - modified = true; - } - if (shearMix > 0) { - var b = bone.b, d = bone.d; - var by = Math.atan2(d, b); - var r = Math.atan2(td, tb) - Math.atan2(tc, ta) - (by - Math.atan2(bone.c, bone.a)); - if (r > spine.MathUtils.PI) - r -= spine.MathUtils.PI2; - else if (r < -spine.MathUtils.PI) - r += spine.MathUtils.PI2; - r = by + (r + offsetShearY) * shearMix; - var s = Math.sqrt(b * b + d * d); - bone.b = Math.cos(r) * s; - bone.d = Math.sin(r) * s; - modified = true; - } - if (modified) - bone.appliedValid = false; - } - }; - TransformConstraint.prototype.applyRelativeWorld = function () { - var rotateMix = this.rotateMix, translateMix = this.translateMix, scaleMix = this.scaleMix, shearMix = this.shearMix; - var target = this.target; - var ta = target.a, tb = target.b, tc = target.c, td = target.d; - var degRadReflect = ta * td - tb * tc > 0 ? spine.MathUtils.degRad : -spine.MathUtils.degRad; - var offsetRotation = this.data.offsetRotation * degRadReflect, offsetShearY = this.data.offsetShearY * degRadReflect; - var bones = this.bones; - for (var i = 0, n = bones.length; i < n; i++) { - var bone = bones[i]; - var modified = false; - if (rotateMix != 0) { - var a = bone.a, b = bone.b, c = bone.c, d = bone.d; - var r = Math.atan2(tc, ta) + offsetRotation; - if (r > spine.MathUtils.PI) - r -= spine.MathUtils.PI2; - else if (r < -spine.MathUtils.PI) - r += spine.MathUtils.PI2; - r *= rotateMix; - var cos = Math.cos(r), sin = Math.sin(r); - bone.a = cos * a - sin * c; - bone.b = cos * b - sin * d; - bone.c = sin * a + cos * c; - bone.d = sin * b + cos * d; - modified = true; - } - if (translateMix != 0) { - var temp = this.temp; - target.localToWorld(temp.set(this.data.offsetX, this.data.offsetY)); - bone.worldX += temp.x * translateMix; - bone.worldY += temp.y * translateMix; - modified = true; - } - if (scaleMix > 0) { - var s = (Math.sqrt(ta * ta + tc * tc) - 1 + this.data.offsetScaleX) * scaleMix + 1; - bone.a *= s; - bone.c *= s; - s = (Math.sqrt(tb * tb + td * td) - 1 + this.data.offsetScaleY) * scaleMix + 1; - bone.b *= s; - bone.d *= s; - modified = true; - } - if (shearMix > 0) { - var r = Math.atan2(td, tb) - Math.atan2(tc, ta); - if (r > spine.MathUtils.PI) - r -= spine.MathUtils.PI2; - else if (r < -spine.MathUtils.PI) - r += spine.MathUtils.PI2; - var b = bone.b, d = bone.d; - r = Math.atan2(d, b) + (r - spine.MathUtils.PI / 2 + offsetShearY) * shearMix; - var s = Math.sqrt(b * b + d * d); - bone.b = Math.cos(r) * s; - bone.d = Math.sin(r) * s; - modified = true; - } - if (modified) - bone.appliedValid = false; - } - }; - TransformConstraint.prototype.applyAbsoluteLocal = function () { - var rotateMix = this.rotateMix, translateMix = this.translateMix, scaleMix = this.scaleMix, shearMix = this.shearMix; - var target = this.target; - if (!target.appliedValid) - target.updateAppliedTransform(); - var bones = this.bones; - for (var i = 0, n = bones.length; i < n; i++) { - var bone = bones[i]; - if (!bone.appliedValid) - bone.updateAppliedTransform(); - var rotation = bone.arotation; - if (rotateMix != 0) { - var r = target.arotation - rotation + this.data.offsetRotation; - r -= (16384 - ((16384.499999999996 - r / 360) | 0)) * 360; - rotation += r * rotateMix; - } - var 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; - } - var 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; - } - var shearY = bone.ashearY; - if (shearMix != 0) { - var 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); - } - }; - TransformConstraint.prototype.applyRelativeLocal = function () { - var rotateMix = this.rotateMix, translateMix = this.translateMix, scaleMix = this.scaleMix, shearMix = this.shearMix; - var target = this.target; - if (!target.appliedValid) - target.updateAppliedTransform(); - var bones = this.bones; - for (var i = 0, n = bones.length; i < n; i++) { - var bone = bones[i]; - if (!bone.appliedValid) - bone.updateAppliedTransform(); - var rotation = bone.arotation; - if (rotateMix != 0) - rotation += (target.arotation + this.data.offsetRotation) * rotateMix; - var x = bone.ax, y = bone.ay; - if (translateMix != 0) { - x += (target.ax + this.data.offsetX) * translateMix; - y += (target.ay + this.data.offsetY) * translateMix; - } - var 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; - } - var shearY = bone.ashearY; - if (shearMix != 0) - shearY += (target.ashearY + this.data.offsetShearY) * shearMix; - bone.updateWorldTransformWith(x, y, rotation, scaleX, scaleY, bone.ashearX, shearY); - } - }; - return TransformConstraint; - }()); - spine.TransformConstraint = TransformConstraint; -})(spine || (spine = {})); -var spine; -(function (spine) { - var TransformConstraintData = (function (_super) { - __extends(TransformConstraintData, _super); - function TransformConstraintData(name) { - var _this = _super.call(this, name, 0, false) || this; - _this.bones = new Array(); - _this.rotateMix = 0; - _this.translateMix = 0; - _this.scaleMix = 0; - _this.shearMix = 0; - _this.offsetRotation = 0; - _this.offsetX = 0; - _this.offsetY = 0; - _this.offsetScaleX = 0; - _this.offsetScaleY = 0; - _this.offsetShearY = 0; - _this.relative = false; - _this.local = false; - return _this; - } - return TransformConstraintData; - }(spine.ConstraintData)); - spine.TransformConstraintData = TransformConstraintData; -})(spine || (spine = {})); -var spine; -(function (spine) { - var Triangulator = (function () { - function Triangulator() { - this.convexPolygons = new Array(); - this.convexPolygonsIndices = new Array(); - this.indicesArray = new Array(); - this.isConcaveArray = new Array(); - this.triangles = new Array(); - this.polygonPool = new spine.Pool(function () { - return new Array(); - }); - this.polygonIndicesPool = new spine.Pool(function () { - return new Array(); + if (!names) { + 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; + } + if (names && names.length > 0) { + region.names = names; + region.values = values; + names = null; + values = null; + } + region.u = region.x / page.width; + region.v = region.y / page.height; + if (region.degrees == 90) { + region.u2 = (region.x + region.height) / page.width; + region.v2 = (region.y + region.width) / page.height; + } else { + region.u2 = (region.x + region.width) / page.width; + region.v2 = (region.y + region.height) / page.height; + } + this.regions.push(region); + } + } + } + findRegion(name) { + for (let i = 0; i < this.regions.length; i++) { + if (this.regions[i].name == name) { + return this.regions[i]; + } + } + return null; + } + setTextures(assetManager, pathPrefix = "") { + for (let page of this.pages) + page.setTexture(assetManager.get(pathPrefix + page.name)); + } + dispose() { + for (let i = 0; i < this.pages.length; i++) { + this.pages[i].texture.dispose(); + } + } + }; + var TextureAtlasReader = class { + constructor(text) { + this.lines = null; + this.index = 0; + 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) + 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; + } + } + }; + var TextureAtlasPage = class { + constructor() { + this.name = null; + this.minFilter = TextureFilter.Nearest; + this.magFilter = TextureFilter.Nearest; + this.uWrap = TextureWrap.ClampToEdge; + this.vWrap = TextureWrap.ClampToEdge; + this.texture = null; + this.width = 0; + this.height = 0; + this.pma = false; + } + setTexture(texture) { + this.texture = texture; + texture.setFilters(this.minFilter, this.magFilter); + texture.setWraps(this.uWrap, this.vWrap); + } + }; + var TextureAtlasRegion = class extends TextureRegion { + constructor() { + super(...arguments); + this.page = null; + this.name = null; + this.x = 0; + this.y = 0; + this.offsetX = 0; + this.offsetY = 0; + this.originalWidth = 0; + this.originalHeight = 0; + this.index = 0; + this.degrees = 0; + this.names = null; + this.values = null; + } + }; + + // spine-core/src/attachments/MeshAttachment.ts + var MeshAttachment = class extends VertexAttachment { + constructor(name) { + super(name); + this.region = null; + this.path = null; + this.regionUVs = null; + this.uvs = null; + this.triangles = null; + this.color = new Color(1, 1, 1, 1); + this.width = 0; + this.height = 0; + this.hullLength = 0; + this.edges = null; + this.parentMesh = null; + this.tempColor = new Color(0, 0, 0, 0); + } + updateUVs() { + let regionUVs = this.regionUVs; + if (!this.uvs || this.uvs.length != regionUVs.length) + this.uvs = Utils.newFloatArray(regionUVs.length); + let uvs = this.uvs; + let n = this.uvs.length; + let u = this.region.u, v = this.region.v, width = 0, height = 0; + if (this.region instanceof TextureAtlasRegion) { + let region = this.region, image = region.page.texture.getImage(); + let textureWidth = image.width, textureHeight = image.height; + switch (region.degrees) { + case 90: + u -= (region.originalHeight - region.offsetY - region.height) / textureWidth; + v -= (region.originalWidth - region.offsetX - region.width) / textureHeight; + width = region.originalHeight / textureWidth; + height = region.originalWidth / textureHeight; + for (let i = 0; i < n; i += 2) { + uvs[i] = u + regionUVs[i + 1] * width; + uvs[i + 1] = v + (1 - regionUVs[i]) * height; + } + return; + case 180: + u -= (region.originalWidth - region.offsetX - region.width) / textureWidth; + v -= region.offsetY / textureHeight; + width = region.originalWidth / textureWidth; + height = region.originalHeight / textureHeight; + for (let i = 0; i < n; i += 2) { + uvs[i] = u + (1 - regionUVs[i]) * width; + uvs[i + 1] = v + (1 - regionUVs[i + 1]) * height; + } + return; + case 270: + u -= region.offsetY / textureWidth; + v -= region.offsetX / textureHeight; + width = region.originalHeight / textureWidth; + height = region.originalWidth / textureHeight; + for (let i = 0; i < n; i += 2) { + uvs[i] = u + (1 - regionUVs[i + 1]) * width; + uvs[i + 1] = v + regionUVs[i] * height; + } + return; + } + u -= region.offsetX / textureWidth; + v -= (region.originalHeight - region.offsetY - region.height) / textureHeight; + width = region.originalWidth / textureWidth; + height = region.originalHeight / textureHeight; + } else if (!this.region) { + u = v = 0; + width = height = 1; + } else { + width = this.region.u2 - u; + height = this.region.v2 - v; + } + for (let i = 0; i < n; i += 2) { + uvs[i] = u + regionUVs[i] * width; + uvs[i + 1] = v + regionUVs[i + 1] * height; + } + } + getParentMesh() { + return this.parentMesh; + } + setParentMesh(parentMesh) { + this.parentMesh = parentMesh; + if (parentMesh) { + 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) + 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 Array(this.regionUVs.length); + Utils.arrayCopy(this.regionUVs, 0, copy.regionUVs, 0, this.regionUVs.length); + copy.uvs = new Array(this.uvs.length); + Utils.arrayCopy(this.uvs, 0, copy.uvs, 0, this.uvs.length); + copy.triangles = new Array(this.triangles.length); + Utils.arrayCopy(this.triangles, 0, copy.triangles, 0, this.triangles.length); + copy.hullLength = this.hullLength; + if (this.edges) { + 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 ? this.parentMesh : this); + copy.updateUVs(); + return copy; + } + }; + + // spine-core/src/attachments/PathAttachment.ts + var PathAttachment = class extends VertexAttachment { + constructor(name) { + super(name); + this.lengths = null; + this.closed = false; + this.constantSpeed = false; + this.color = new Color(1, 1, 1, 1); + } + 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; + } + }; + + // spine-core/src/attachments/PointAttachment.ts + var PointAttachment = class extends VertexAttachment { + constructor(name) { + super(name); + this.x = 0; + this.y = 0; + this.rotation = 0; + this.color = new Color(0.38, 0.94, 0, 1); + } + computeWorldPosition(bone, point) { + point.x = this.x * bone.a + this.y * bone.b + bone.worldX; + point.y = this.x * bone.c + this.y * bone.d + bone.worldY; + return point; + } + computeWorldRotation(bone) { + let cos = MathUtils.cosDeg(this.rotation), sin = MathUtils.sinDeg(this.rotation); + let x = cos * bone.a + sin * bone.b; + let y = cos * bone.c + sin * bone.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; + } + }; + + // spine-core/src/attachments/RegionAttachment.ts + var _RegionAttachment = class extends Attachment { + constructor(name) { + super(name); + this.x = 0; + this.y = 0; + this.scaleX = 1; + this.scaleY = 1; + this.rotation = 0; + this.width = 0; + this.height = 0; + this.color = new Color(1, 1, 1, 1); + this.path = null; + this.rendererObject = null; + this.region = null; + this.offset = Utils.newFloatArray(8); + this.uvs = Utils.newFloatArray(8); + this.tempColor = new Color(1, 1, 1, 1); + } + updateOffset() { + let region = this.region; + 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 x = this.x, y = this.y; + let localXCos = localX * cos + x; + let localXSin = localX * sin; + let localYCos = localY * cos + y; + let localYSin = localY * sin; + let localX2Cos = localX2 * cos + x; + let localX2Sin = localX2 * sin; + let localY2Cos = localY2 * cos + y; + let localY2Sin = localY2 * sin; + let offset = this.offset; + offset[0] = localXCos - localYSin; + offset[1] = localYCos + localXSin; + offset[2] = localXCos - localY2Sin; + offset[3] = localY2Cos + localXSin; + offset[4] = localX2Cos - localY2Sin; + offset[5] = localY2Cos + localX2Sin; + offset[6] = localX2Cos - localYSin; + offset[7] = 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; + } + } + computeWorldVertices(bone, worldVertices, offset, stride) { + let vertexOffset = this.offset; + let x = bone.worldX, y = bone.worldY; + let a = bone.a, b = bone.b, c = bone.c, d = bone.d; + let offsetX = 0, offsetY = 0; + offsetX = vertexOffset[0]; + offsetY = vertexOffset[1]; + worldVertices[offset] = offsetX * a + offsetY * b + x; + worldVertices[offset + 1] = offsetX * c + offsetY * d + y; + offset += stride; + offsetX = vertexOffset[2]; + offsetY = vertexOffset[3]; + worldVertices[offset] = offsetX * a + offsetY * b + x; + worldVertices[offset + 1] = offsetX * c + offsetY * d + y; + offset += stride; + offsetX = vertexOffset[4]; + offsetY = vertexOffset[5]; + worldVertices[offset] = offsetX * a + offsetY * b + x; + worldVertices[offset + 1] = offsetX * c + offsetY * d + y; + offset += stride; + offsetX = vertexOffset[6]; + offsetY = vertexOffset[7]; + worldVertices[offset] = offsetX * a + offsetY * b + x; + 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; + } + }; + var RegionAttachment = _RegionAttachment; + RegionAttachment.X1 = 0; + RegionAttachment.Y1 = 1; + RegionAttachment.C1R = 2; + RegionAttachment.C1G = 3; + RegionAttachment.C1B = 4; + RegionAttachment.C1A = 5; + RegionAttachment.U1 = 6; + RegionAttachment.V1 = 7; + RegionAttachment.X2 = 8; + RegionAttachment.Y2 = 9; + RegionAttachment.C2R = 10; + RegionAttachment.C2G = 11; + RegionAttachment.C2B = 12; + RegionAttachment.C2A = 13; + RegionAttachment.U2 = 14; + RegionAttachment.V2 = 15; + RegionAttachment.X3 = 16; + RegionAttachment.Y3 = 17; + RegionAttachment.C3R = 18; + RegionAttachment.C3G = 19; + RegionAttachment.C3B = 20; + RegionAttachment.C3A = 21; + RegionAttachment.U3 = 22; + RegionAttachment.V3 = 23; + RegionAttachment.X4 = 24; + RegionAttachment.Y4 = 25; + RegionAttachment.C4R = 26; + RegionAttachment.C4G = 27; + RegionAttachment.C4B = 28; + RegionAttachment.C4A = 29; + RegionAttachment.U4 = 30; + RegionAttachment.V4 = 31; + + // spine-core/src/AtlasAttachmentLoader.ts + var AtlasAttachmentLoader = class { + constructor(atlas) { + this.atlas = null; + this.atlas = atlas; + } + newRegionAttachment(skin, name, path) { + let region = this.atlas.findRegion(path); + if (!region) + throw new Error("Region not found in atlas: " + path + " (region attachment: " + name + ")"); + region.renderObject = region; + let attachment = new RegionAttachment(name); + attachment.setRegion(region); + return attachment; + } + newMeshAttachment(skin, name, path) { + let region = this.atlas.findRegion(path); + if (!region) + throw new Error("Region not found in atlas: " + path + " (mesh attachment: " + name + ")"); + region.renderObject = region; + let attachment = new MeshAttachment(name); + attachment.region = region; + return attachment; + } + newBoundingBoxAttachment(skin, name) { + return new BoundingBoxAttachment(name); + } + newPathAttachment(skin, name) { + return new PathAttachment(name); + } + newPointAttachment(skin, name) { + return new PointAttachment(name); + } + newClippingAttachment(skin, name) { + return new ClippingAttachment(name); + } + }; + + // spine-core/src/BoneData.ts + var BoneData = class { + constructor(index, name, parent) { + this.index = 0; + this.name = null; + this.parent = null; + this.length = 0; + this.x = 0; + this.y = 0; + this.rotation = 0; + this.scaleX = 1; + this.scaleY = 1; + this.shearX = 0; + this.shearY = 0; + this.transformMode = TransformMode.Normal; + this.skinRequired = false; + this.color = new Color(); + if (index < 0) + throw new Error("index must be >= 0."); + if (!name) + throw new Error("name cannot be null."); + this.index = index; + this.name = name; + this.parent = parent; + } + }; + var TransformMode; + (function(TransformMode2) { + TransformMode2[TransformMode2["Normal"] = 0] = "Normal"; + TransformMode2[TransformMode2["OnlyTranslation"] = 1] = "OnlyTranslation"; + TransformMode2[TransformMode2["NoRotationOrReflection"] = 2] = "NoRotationOrReflection"; + TransformMode2[TransformMode2["NoScale"] = 3] = "NoScale"; + TransformMode2[TransformMode2["NoScaleOrReflection"] = 4] = "NoScaleOrReflection"; + })(TransformMode || (TransformMode = {})); + + // spine-core/src/Bone.ts + var Bone = class { + constructor(data, skeleton, parent) { + this.data = null; + this.skeleton = null; + this.parent = null; + this.children = new Array(); + this.x = 0; + this.y = 0; + this.rotation = 0; + this.scaleX = 0; + this.scaleY = 0; + this.shearX = 0; + this.shearY = 0; + this.ax = 0; + this.ay = 0; + this.arotation = 0; + this.ascaleX = 0; + this.ascaleY = 0; + this.ashearX = 0; + this.ashearY = 0; + this.a = 0; + this.b = 0; + this.c = 0; + this.d = 0; + this.worldY = 0; + this.worldX = 0; + this.sorted = false; + this.active = false; + if (!data) + throw new Error("data cannot be null."); + if (!skeleton) + throw new Error("skeleton cannot be null."); + this.data = data; + this.skeleton = skeleton; + this.parent = parent; + this.setToSetupPose(); + } + isActive() { + return this.active; + } + update() { + this.updateWorldTransformWith(this.ax, this.ay, this.arotation, this.ascaleX, this.ascaleY, this.ashearX, this.ashearY); + } + updateWorldTransform() { + this.updateWorldTransformWith(this.x, this.y, this.rotation, this.scaleX, this.scaleY, this.shearX, this.shearY); + } + 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; + let parent = this.parent; + if (!parent) { + let skeleton = this.skeleton; + let rotationY = rotation + 90 + shearY; + let sx = skeleton.scaleX; + let sy = skeleton.scaleY; + this.a = MathUtils.cosDeg(rotation + shearX) * scaleX * sx; + this.b = MathUtils.cosDeg(rotationY) * scaleY * sx; + this.c = MathUtils.sinDeg(rotation + shearX) * scaleX * sy; + this.d = MathUtils.sinDeg(rotationY) * scaleY * sy; + this.worldX = x * sx + skeleton.x; + this.worldY = y * sy + skeleton.y; + return; + } + let pa = parent.a, pb = parent.b, pc = parent.c, pd = parent.d; + this.worldX = pa * x + pb * y + parent.worldX; + this.worldY = pc * x + pd * y + parent.worldY; + 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; + this.a = pa * la + pb * lc; + this.b = pa * lb + pb * ld; + this.c = pc * la + pd * lc; + this.d = pc * lb + pd * ld; + return; + } + case TransformMode.OnlyTranslation: { + let rotationY = rotation + 90 + shearY; + this.a = MathUtils.cosDeg(rotation + shearX) * scaleX; + this.b = MathUtils.cosDeg(rotationY) * scaleY; + this.c = MathUtils.sinDeg(rotation + shearX) * scaleX; + this.d = MathUtils.sinDeg(rotationY) * scaleY; + break; + } + case TransformMode.NoRotationOrReflection: { + let s = pa * pa + pc * pc; + let prx = 0; + if (s > 1e-4) { + 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; + this.a = pa * la - pb * lc; + this.b = pa * lb - pb * ld; + this.c = pc * la + pd * lc; + this.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) / this.skeleton.scaleX; + let zc = (pc * cos + pd * sin) / this.skeleton.scaleY; + let s = Math.sqrt(za * za + zc * zc); + if (s > 1e-5) + 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 != (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; + this.a = za * la + zb * lc; + this.b = za * lb + zb * ld; + this.c = zc * la + zd * lc; + this.d = zc * lb + zd * ld; + break; + } + } + this.a *= this.skeleton.scaleX; + this.b *= this.skeleton.scaleX; + this.c *= this.skeleton.scaleY; + this.d *= this.skeleton.scaleY; + } + 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.c, this.a) * MathUtils.radDeg; + } + getWorldRotationY() { + return Math.atan2(this.d, this.b) * MathUtils.radDeg; + } + getWorldScaleX() { + return Math.sqrt(this.a * this.a + this.c * this.c); + } + getWorldScaleY() { + return Math.sqrt(this.b * this.b + this.d * this.d); + } + updateAppliedTransform() { + let parent = this.parent; + if (!parent) { + this.ax = this.worldX - this.skeleton.x; + this.ay = this.worldY - this.skeleton.y; + this.arotation = Math.atan2(this.c, this.a) * MathUtils.radDeg; + this.ascaleX = Math.sqrt(this.a * this.a + this.c * this.c); + this.ascaleY = Math.sqrt(this.b * this.b + this.d * this.d); + this.ashearX = 0; + this.ashearY = Math.atan2(this.a * this.b + this.c * this.d, this.a * this.d - this.b * this.c) * MathUtils.radDeg; + return; + } + let pa = parent.a, pb = parent.b, pc = parent.c, pd = parent.d; + let pid = 1 / (pa * pd - pb * pc); + let dx = this.worldX - parent.worldX, dy = this.worldY - parent.worldY; + this.ax = dx * pd * pid - dy * pb * pid; + this.ay = dy * pa * pid - dx * pc * pid; + let ia = pid * pd; + let id = pid * pa; + let ib = pid * pb; + let ic = pid * pc; + let ra = ia * this.a - ib * this.c; + let rb = ia * this.b - ib * this.d; + let rc = id * this.c - ic * this.a; + let rd = id * this.d - ic * this.b; + this.ashearX = 0; + this.ascaleX = Math.sqrt(ra * ra + rc * rc); + if (this.ascaleX > 1e-4) { + 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 invDet = 1 / (this.a * this.d - this.b * this.c); + let x = world.x - this.worldX, y = world.y - this.worldY; + world.x = x * this.d * invDet - y * this.b * invDet; + world.y = y * this.a * invDet - x * this.c * invDet; + return world; + } + localToWorld(local) { + let x = local.x, y = local.y; + local.x = x * this.a + y * this.b + this.worldX; + local.y = x * this.c + y * this.d + this.worldY; + return local; + } + worldToLocalRotation(worldRotation) { + let sin = MathUtils.sinDeg(worldRotation), cos = MathUtils.cosDeg(worldRotation); + return Math.atan2(this.a * sin - this.c * cos, this.d * cos - this.b * sin) * MathUtils.radDeg + this.rotation - this.shearX; + } + localToWorldRotation(localRotation) { + localRotation -= this.rotation - this.shearX; + let sin = MathUtils.sinDeg(localRotation), cos = MathUtils.cosDeg(localRotation); + return Math.atan2(cos * this.c + sin * this.d, cos * this.a + sin * this.b) * MathUtils.radDeg; + } + rotateWorld(degrees) { + let a = this.a, b = this.b, c = this.c, d = this.d; + let cos = MathUtils.cosDeg(degrees), sin = MathUtils.sinDeg(degrees); + this.a = cos * a - sin * c; + this.b = cos * b - sin * d; + this.c = sin * a + cos * c; + this.d = sin * b + cos * d; + } + }; + + // spine-core/src/ConstraintData.ts + var ConstraintData = class { + constructor(name, order, skinRequired) { + this.name = name; + this.order = order; + this.skinRequired = skinRequired; + } + }; + + // spine-core/src/AssetManagerBase.ts + var AssetManagerBase = class { + constructor(textureLoader, pathPrefix = "", downloader = null) { + this.pathPrefix = null; + this.assets = {}; + this.errors = {}; + this.toLoad = 0; + this.loaded = 0; + this.textureLoader = textureLoader; + this.pathPrefix = pathPrefix; + this.downloader = downloader || new Downloader(); + } + start(path) { + this.toLoad++; + return this.pathPrefix + path; + } + success(callback, path, asset) { + this.toLoad--; + this.loaded++; + this.assets[path] = asset; + if (callback) + callback(path, asset); + } + error(callback, path, message) { + this.toLoad--; + this.loaded++; + this.errors[path] = message; + if (callback) + callback(path, message); + } + setRawDataURI(path, data) { + this.downloader.rawDataUris[this.pathPrefix + path] = data; + } + loadBinary(path, success = null, error = null) { + path = this.start(path); + this.downloader.downloadBinary(path, (data) => { + this.success(success, path, data); + }, (status, responseText) => { + this.error(error, path, `Couldn't load binary ${path}: status ${status}, ${responseText}`); + }); + } + loadText(path, success = null, error = null) { + path = this.start(path); + this.downloader.downloadText(path, (data) => { + this.success(success, path, data); + }, (status, responseText) => { + this.error(error, path, `Couldn't load text ${path}: status ${status}, ${responseText}`); + }); + } + loadJson(path, success = null, error = null) { + path = this.start(path); + this.downloader.downloadJson(path, (data) => { + this.success(success, path, data); + }, (status, responseText) => { + this.error(error, path, `Couldn't load JSON ${path}: status ${status}, ${responseText}`); + }); + } + loadTexture(path, success = null, error = null) { + path = this.start(path); + let isBrowser = !!(typeof window !== "undefined" && typeof navigator !== "undefined" && window.document); + let isWebWorker = !isBrowser; + if (isWebWorker) { + fetch(path, { mode: "cors" }).then((response) => { + if (response.ok) + return response.blob(); + this.error(error, path, `Couldn't load image: ${path}`); + return null; + }).then((blob) => { + return blob ? createImageBitmap(blob, { premultiplyAlpha: "none", colorSpaceConversion: "none" }) : null; + }).then((bitmap) => { + if (bitmap) + this.success(success, path, this.textureLoader(bitmap)); + }); + } else { + let image = new Image(); + image.crossOrigin = "anonymous"; + image.onload = () => { + this.success(success, path, this.textureLoader(image)); + }; + image.onerror = () => { + this.error(error, path, `Couldn't load image: ${path}`); + }; + if (this.downloader.rawDataUris[path]) + path = this.downloader.rawDataUris[path]; + image.src = path; + } + } + loadTextureAtlas(path, success = null, error = null, px = null) { + let index = path.lastIndexOf("/"); + let parent = index >= 0 ? path.substring(0, index + 1) : ""; + path = this.start(path); + this.downloader.downloadText(path, (atlasText) => { + try { + let atlas = new TextureAtlas(atlasText); + let toLoad = atlas.pages.length, abort = false; + for (let page of atlas.pages) { + this.loadTexture( px == null ? parent + page.name : px[page.name], (imagePath, texture) => { + if (!abort) { + page.setTexture(texture); + if (--toLoad == 0) + this.success(success, path, atlas); + } + }, (imagePath, message) => { + if (!abort) + this.error(error, path, `Couldn't load texture atlas ${path} page image: ${imagePath}`); + abort = true; }); + } + } catch (e) { + this.error(error, path, `Couldn't parse texture atlas ${path}: ${e.message}`); } - Triangulator.prototype.triangulate = function (verticesArray) { - var vertices = verticesArray; - var vertexCount = verticesArray.length >> 1; - var indices = this.indicesArray; - indices.length = 0; - for (var i = 0; i < vertexCount; i++) - indices[i] = i; - var isConcave = this.isConcaveArray; - isConcave.length = 0; - for (var i = 0, n = vertexCount; i < n; ++i) - isConcave[i] = Triangulator.isConcave(i, vertexCount, vertices, indices); - var triangles = this.triangles; - triangles.length = 0; - while (vertexCount > 3) { - var previous = vertexCount - 1, i = 0, next = 1; - while (true) { - outer: if (!isConcave[i]) { - var p1 = indices[previous] << 1, p2 = indices[i] << 1, p3 = indices[next] << 1; - var p1x = vertices[p1], p1y = vertices[p1 + 1]; - var p2x = vertices[p2], p2y = vertices[p2 + 1]; - var p3x = vertices[p3], p3y = vertices[p3 + 1]; - for (var ii = (next + 1) % vertexCount; ii != previous; ii = (ii + 1) % vertexCount) { - if (!isConcave[ii]) - continue; - var v = indices[ii] << 1; - var vx = vertices[v], vy = vertices[v + 1]; - if (Triangulator.positiveArea(p3x, p3y, p1x, p1y, vx, vy)) { - if (Triangulator.positiveArea(p1x, p1y, p2x, p2y, vx, vy)) { - if (Triangulator.positiveArea(p2x, p2y, p3x, p3y, vx, vy)) - break outer; - } - } - } - break; - } - if (next == 0) { - do { - if (!isConcave[i]) - break; - i--; - } while (i > 0); - break; - } - previous = i; - i = next; - next = (next + 1) % vertexCount; - } - triangles.push(indices[(vertexCount + i - 1) % vertexCount]); - triangles.push(indices[i]); - triangles.push(indices[(i + 1) % vertexCount]); - indices.splice(i, 1); - isConcave.splice(i, 1); - vertexCount--; - var previousIndex = (vertexCount + i - 1) % vertexCount; - var nextIndex = i == vertexCount ? 0 : i; - isConcave[previousIndex] = Triangulator.isConcave(previousIndex, vertexCount, vertices, indices); - isConcave[nextIndex] = Triangulator.isConcave(nextIndex, vertexCount, vertices, indices); - } - if (vertexCount == 3) { - triangles.push(indices[2]); - triangles.push(indices[0]); - triangles.push(indices[1]); - } - return triangles; - }; - Triangulator.prototype.decompose = function (verticesArray, triangles) { - var vertices = verticesArray; - var convexPolygons = this.convexPolygons; - this.polygonPool.freeAll(convexPolygons); - convexPolygons.length = 0; - var convexPolygonsIndices = this.convexPolygonsIndices; - this.polygonIndicesPool.freeAll(convexPolygonsIndices); - convexPolygonsIndices.length = 0; - var polygonIndices = this.polygonIndicesPool.obtain(); - polygonIndices.length = 0; - var polygon = this.polygonPool.obtain(); - polygon.length = 0; - var fanBaseIndex = -1, lastWinding = 0; - for (var i = 0, n = triangles.length; i < n; i += 3) { - var t1 = triangles[i] << 1, t2 = triangles[i + 1] << 1, t3 = triangles[i + 2] << 1; - var x1 = vertices[t1], y1 = vertices[t1 + 1]; - var x2 = vertices[t2], y2 = vertices[t2 + 1]; - var x3 = vertices[t3], y3 = vertices[t3 + 1]; - var merged = false; - if (fanBaseIndex == t1) { - var o = polygon.length - 4; - var winding1 = Triangulator.winding(polygon[o], polygon[o + 1], polygon[o + 2], polygon[o + 3], x3, y3); - var winding2 = Triangulator.winding(x3, y3, polygon[0], polygon[1], polygon[2], polygon[3]); - if (winding1 == lastWinding && winding2 == lastWinding) { - polygon.push(x3); - polygon.push(y3); - polygonIndices.push(t3); - merged = true; - } - } - if (!merged) { - if (polygon.length > 0) { - convexPolygons.push(polygon); - convexPolygonsIndices.push(polygonIndices); - } - else { - this.polygonPool.free(polygon); - this.polygonIndicesPool.free(polygonIndices); - } - polygon = this.polygonPool.obtain(); - polygon.length = 0; - polygon.push(x1); - polygon.push(y1); - polygon.push(x2); - polygon.push(y2); - polygon.push(x3); - polygon.push(y3); - polygonIndices = this.polygonIndicesPool.obtain(); - polygonIndices.length = 0; - polygonIndices.push(t1); - polygonIndices.push(t2); - polygonIndices.push(t3); - lastWinding = Triangulator.winding(x1, y1, x2, y2, x3, y3); - fanBaseIndex = t1; - } - } - if (polygon.length > 0) { - convexPolygons.push(polygon); - convexPolygonsIndices.push(polygonIndices); - } - for (var i = 0, n = convexPolygons.length; i < n; i++) { - polygonIndices = convexPolygonsIndices[i]; - if (polygonIndices.length == 0) - continue; - var firstIndex = polygonIndices[0]; - var lastIndex = polygonIndices[polygonIndices.length - 1]; - polygon = convexPolygons[i]; - var o = polygon.length - 4; - var prevPrevX = polygon[o], prevPrevY = polygon[o + 1]; - var prevX = polygon[o + 2], prevY = polygon[o + 3]; - var firstX = polygon[0], firstY = polygon[1]; - var secondX = polygon[2], secondY = polygon[3]; - var winding = Triangulator.winding(prevPrevX, prevPrevY, prevX, prevY, firstX, firstY); - for (var ii = 0; ii < n; ii++) { - if (ii == i) - continue; - var otherIndices = convexPolygonsIndices[ii]; - if (otherIndices.length != 3) - continue; - var otherFirstIndex = otherIndices[0]; - var otherSecondIndex = otherIndices[1]; - var otherLastIndex = otherIndices[2]; - var otherPoly = convexPolygons[ii]; - var x3 = otherPoly[otherPoly.length - 2], y3 = otherPoly[otherPoly.length - 1]; - if (otherFirstIndex != firstIndex || otherSecondIndex != lastIndex) - continue; - var winding1 = Triangulator.winding(prevPrevX, prevPrevY, prevX, prevY, x3, y3); - var winding2 = Triangulator.winding(x3, y3, firstX, firstY, secondX, secondY); - if (winding1 == winding && winding2 == winding) { - otherPoly.length = 0; - otherIndices.length = 0; - polygon.push(x3); - polygon.push(y3); - polygonIndices.push(otherLastIndex); - prevPrevX = prevX; - prevPrevY = prevY; - prevX = x3; - prevY = y3; - ii = 0; - } - } - } - for (var i = convexPolygons.length - 1; i >= 0; i--) { - polygon = convexPolygons[i]; - if (polygon.length == 0) { - convexPolygons.splice(i, 1); - this.polygonPool.free(polygon); - polygonIndices = convexPolygonsIndices[i]; - convexPolygonsIndices.splice(i, 1); - this.polygonIndicesPool.free(polygonIndices); - } - } - return convexPolygons; - }; - Triangulator.isConcave = function (index, vertexCount, vertices, indices) { - var previous = indices[(vertexCount + index - 1) % vertexCount] << 1; - var current = indices[index] << 1; - var next = indices[(index + 1) % vertexCount] << 1; - return !this.positiveArea(vertices[previous], vertices[previous + 1], vertices[current], vertices[current + 1], vertices[next], vertices[next + 1]); - }; - Triangulator.positiveArea = function (p1x, p1y, p2x, p2y, p3x, p3y) { - return p1x * (p3y - p2y) + p2x * (p1y - p3y) + p3x * (p2y - p1y) >= 0; - }; - Triangulator.winding = function (p1x, p1y, p2x, p2y, p3x, p3y) { - var px = p2x - p1x, py = p2y - p1y; - return p3x * py - p3y * px + px * p1y - p1x * py >= 0 ? 1 : -1; - }; - return Triangulator; - }()); - spine.Triangulator = Triangulator; -})(spine || (spine = {})); -var spine; -(function (spine) { - var IntSet = (function () { - function IntSet() { - this.array = new Array(); - } - IntSet.prototype.add = function (value) { - var contains = this.contains(value); - this.array[value | 0] = value | 0; - return !contains; - }; - IntSet.prototype.contains = function (value) { - return this.array[value | 0] != undefined; - }; - IntSet.prototype.remove = function (value) { - this.array[value | 0] = undefined; - }; - IntSet.prototype.clear = function () { - this.array.length = 0; - }; - return IntSet; - }()); - spine.IntSet = IntSet; - var Color = (function () { - function Color(r, g, b, a) { - if (r === void 0) { r = 0; } - if (g === void 0) { g = 0; } - if (b === void 0) { b = 0; } - if (a === void 0) { a = 0; } - this.r = r; - this.g = g; - this.b = b; - this.a = a; - } - Color.prototype.set = function (r, g, b, a) { - this.r = r; - this.g = g; - this.b = b; - this.a = a; - this.clamp(); - return this; - }; - Color.prototype.setFromColor = function (c) { - this.r = c.r; - this.g = c.g; - this.b = c.b; - this.a = c.a; - return this; - }; - Color.prototype.setFromString = function (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; - }; - Color.prototype.add = function (r, g, b, a) { - this.r += r; - this.g += g; - this.b += b; - this.a += a; - this.clamp(); - return this; - }; - Color.prototype.clamp = function () { - 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; - }; - Color.rgba8888ToColor = function (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; - }; - Color.rgb888ToColor = function (color, value) { - color.r = ((value & 0x00ff0000) >>> 16) / 255; - color.g = ((value & 0x0000ff00) >>> 8) / 255; - color.b = ((value & 0x000000ff)) / 255; - }; - Color.WHITE = new Color(1, 1, 1, 1); - Color.RED = new Color(1, 0, 0, 1); - Color.GREEN = new Color(0, 1, 0, 1); - Color.BLUE = new Color(0, 0, 1, 1); - Color.MAGENTA = new Color(1, 0, 1, 1); - return Color; - }()); - spine.Color = Color; - var MathUtils = (function () { - function MathUtils() { - } - MathUtils.clamp = function (value, min, max) { - if (value < min) - return min; - if (value > max) - return max; - return value; - }; - MathUtils.cosDeg = function (degrees) { - return Math.cos(degrees * MathUtils.degRad); - }; - MathUtils.sinDeg = function (degrees) { - return Math.sin(degrees * MathUtils.degRad); - }; - MathUtils.signum = function (value) { - return value > 0 ? 1 : value < 0 ? -1 : 0; - }; - MathUtils.toInt = function (x) { - return x > 0 ? Math.floor(x) : Math.ceil(x); - }; - MathUtils.cbrt = function (x) { - var y = Math.pow(Math.abs(x), 1 / 3); - return x < 0 ? -y : y; - }; - MathUtils.randomTriangular = function (min, max) { - return MathUtils.randomTriangularWith(min, max, (min + max) * 0.5); - }; - MathUtils.randomTriangularWith = function (min, max, mode) { - var u = Math.random(); - var 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.PI = 3.1415927; - MathUtils.PI2 = MathUtils.PI * 2; - MathUtils.radiansToDegrees = 180 / MathUtils.PI; - MathUtils.radDeg = MathUtils.radiansToDegrees; - MathUtils.degreesToRadians = MathUtils.PI / 180; - MathUtils.degRad = MathUtils.degreesToRadians; - return MathUtils; - }()); - spine.MathUtils = MathUtils; - var Interpolation = (function () { - function Interpolation() { - } - Interpolation.prototype.apply = function (start, end, a) { - return start + (end - start) * this.applyInternal(a); - }; - return Interpolation; - }()); - spine.Interpolation = Interpolation; - var Pow = (function (_super) { - __extends(Pow, _super); - function Pow(power) { - var _this = _super.call(this) || this; - _this.power = 2; - _this.power = power; - return _this; - } - Pow.prototype.applyInternal = function (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; - }; - return Pow; - }(Interpolation)); - spine.Pow = Pow; - var PowOut = (function (_super) { - __extends(PowOut, _super); - function PowOut(power) { - return _super.call(this, power) || this; - } - PowOut.prototype.applyInternal = function (a) { - return Math.pow(a - 1, this.power) * (this.power % 2 == 0 ? -1 : 1) + 1; - }; - return PowOut; - }(Pow)); - spine.PowOut = PowOut; - var Utils = (function () { - function Utils() { - } - Utils.arrayCopy = function (source, sourceStart, dest, destStart, numElements) { - for (var i = sourceStart, j = destStart; i < sourceStart + numElements; i++, j++) { - dest[j] = source[i]; - } - }; - Utils.setArraySize = function (array, size, value) { - if (value === void 0) { value = 0; } - var oldSize = array.length; - if (oldSize == size) - return array; - array.length = size; - if (oldSize < size) { - for (var i = oldSize; i < size; i++) - array[i] = value; - } - return array; - }; - Utils.ensureArrayCapacity = function (array, size, value) { - if (value === void 0) { value = 0; } - if (array.length >= size) - return array; - return Utils.setArraySize(array, size, value); - }; - Utils.newArray = function (size, defaultValue) { - var array = new Array(size); - for (var i = 0; i < size; i++) - array[i] = defaultValue; - return array; - }; - Utils.newFloatArray = function (size) { - if (Utils.SUPPORTS_TYPED_ARRAYS) { - return new Float32Array(size); - } - else { - var array = new Array(size); - for (var i = 0; i < array.length; i++) - array[i] = 0; - return array; - } - }; - Utils.newShortArray = function (size) { - if (Utils.SUPPORTS_TYPED_ARRAYS) { - return new Int16Array(size); - } - else { - var array = new Array(size); - for (var i = 0; i < array.length; i++) - array[i] = 0; - return array; - } - }; - Utils.toFloatArray = function (array) { - return Utils.SUPPORTS_TYPED_ARRAYS ? new Float32Array(array) : array; - }; - Utils.toSinglePrecision = function (value) { - return Utils.SUPPORTS_TYPED_ARRAYS ? Math.fround(value) : value; - }; - Utils.webkit602BugfixHelper = function (alpha, blend) { - }; - Utils.contains = function (array, element, identity) { - if (identity === void 0) { identity = true; } - for (var i = 0; i < array.length; i++) { - if (array[i] == element) - return true; - } - return false; - }; - Utils.SUPPORTS_TYPED_ARRAYS = typeof (Float32Array) !== "undefined"; - return Utils; - }()); - spine.Utils = Utils; - var DebugUtils = (function () { - function DebugUtils() { - } - DebugUtils.logBones = function (skeleton) { - for (var i = 0; i < skeleton.bones.length; i++) { - var bone = skeleton.bones[i]; - console.log(bone.data.name + ", " + bone.a + ", " + bone.b + ", " + bone.c + ", " + bone.d + ", " + bone.worldX + ", " + bone.worldY); - } - }; - return DebugUtils; - }()); - spine.DebugUtils = DebugUtils; - var Pool = (function () { - function Pool(instantiator) { - this.items = new Array(); - this.instantiator = instantiator; - } - Pool.prototype.obtain = function () { - return this.items.length > 0 ? this.items.pop() : this.instantiator(); - }; - Pool.prototype.free = function (item) { - if (item.reset) - item.reset(); - this.items.push(item); - }; - Pool.prototype.freeAll = function (items) { - for (var i = 0; i < items.length; i++) { - this.free(items[i]); - } - }; - Pool.prototype.clear = function () { - this.items.length = 0; - }; - return Pool; - }()); - spine.Pool = Pool; - var Vector2 = (function () { - function Vector2(x, y) { - if (x === void 0) { x = 0; } - if (y === void 0) { y = 0; } - this.x = x; - this.y = y; - } - Vector2.prototype.set = function (x, y) { - this.x = x; - this.y = y; - return this; - }; - Vector2.prototype.length = function () { - var x = this.x; - var y = this.y; - return Math.sqrt(x * x + y * y); - }; - Vector2.prototype.normalize = function () { - var len = this.length(); - if (len != 0) { - this.x /= len; - this.y /= len; - } - return this; - }; - return Vector2; - }()); - spine.Vector2 = Vector2; - var TimeKeeper = (function () { - function TimeKeeper() { - this.maxDelta = 0.064; - this.framesPerSecond = 0; - this.delta = 0; - this.totalTime = 0; - this.lastTime = Date.now() / 1000; - this.frameCount = 0; - this.frameTime = 0; - } - TimeKeeper.prototype.update = function () { - var 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; - } - }; - return TimeKeeper; - }()); - spine.TimeKeeper = TimeKeeper; - var WindowedMean = (function () { - function WindowedMean(windowSize) { - if (windowSize === void 0) { windowSize = 32; } - this.addedValues = 0; - this.lastValue = 0; - this.mean = 0; - this.dirty = true; - this.values = new Array(windowSize); - } - WindowedMean.prototype.hasEnoughData = function () { - return this.addedValues >= this.values.length; - }; - WindowedMean.prototype.addValue = function (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; - }; - WindowedMean.prototype.getMean = function () { - if (this.hasEnoughData()) { - if (this.dirty) { - var mean = 0; - for (var i = 0; i < this.values.length; i++) { - mean += this.values[i]; - } - this.mean = mean / this.values.length; - this.dirty = false; - } - return this.mean; - } + }, (status, responseText) => { + this.error(error, path, `Couldn't load texture atlas ${path}: status ${status}, ${responseText}`); + }); + } + get(path) { + return this.assets[this.pathPrefix + path]; + } + require(path) { + path = this.pathPrefix + path; + let asset = this.assets[path]; + if (asset) + return asset; + let error = this.errors[path]; + throw Error("Asset not found: " + path + (error ? "\n" + error : "")); + } + remove(path) { + path = this.pathPrefix + path; + let asset = this.assets[path]; + if (asset.dispose) + asset.dispose(); + delete this.assets[path]; + return asset; + } + removeAll() { + for (let key in this.assets) { + let asset = this.assets[key]; + if (asset.dispose) + asset.dispose(); + } + this.assets = {}; + } + isLoadingComplete() { + return this.toLoad == 0; + } + getToLoad() { + return this.toLoad; + } + getLoaded() { + return this.loaded; + } + dispose() { + this.removeAll(); + } + hasErrors() { + return Object.keys(this.errors).length > 0; + } + getErrors() { + return this.errors; + } + }; + var Downloader = class { + constructor() { + this.callbacks = {}; + this.rawDataUris = {}; + } + dataUriToString(dataUri) { + if (!dataUri.startsWith("data:")) { + throw new Error("Not a data URI."); + } + let base64Idx = dataUri.indexOf("base64,"); + if (base64Idx != -1) { + base64Idx += "base64,".length; + return atob(dataUri.substr(base64Idx)); + } else { + return dataUri.substr(dataUri.indexOf(",") + 1); + } + } + base64ToUint8Array(base64) { + var binary_string = window.atob(base64); + var len = binary_string.length; + var bytes = new Uint8Array(len); + for (var i = 0; i < len; i++) { + bytes[i] = binary_string.charCodeAt(i); + } + return bytes; + } + dataUriToUint8Array(dataUri) { + if (!dataUri.startsWith("data:")) { + throw new Error("Not a data URI."); + } + let base64Idx = dataUri.indexOf("base64,"); + if (base64Idx == -1) + throw new Error("Not a binary data URI."); + base64Idx += "base64,".length; + return this.base64ToUint8Array(dataUri.substr(base64Idx)); + } + downloadText(url, success, error) { + if (this.start(url, success, error)) + return; + if (this.rawDataUris[url]) { + try { + let dataUri = this.rawDataUris[url]; + this.finish(url, 200, this.dataUriToString(dataUri)); + } catch (e) { + this.finish(url, 400, JSON.stringify(e)); + } + return; + } + let request = new XMLHttpRequest(); + request.overrideMimeType("text/html"); + request.open("GET", url, true); + let done = () => { + this.finish(url, request.status, request.responseText); + }; + request.onload = done; + request.onerror = done; + request.send(); + } + downloadJson(url, success, error) { + this.downloadText(url, (data) => { + success(JSON.parse(data)); + }, error); + } + downloadBinary(url, success, error) { + if (this.start(url, success, error)) + return; + if (this.rawDataUris[url]) { + try { + let dataUri = this.rawDataUris[url]; + this.finish(url, 200, this.dataUriToUint8Array(dataUri)); + } catch (e) { + this.finish(url, 400, JSON.stringify(e)); + } + return; + } + let request = new XMLHttpRequest(); + request.open("GET", url, true); + request.responseType = "arraybuffer"; + let onerror = () => { + this.finish(url, request.status, request.response); + }; + request.onload = () => { + if (request.status == 200 || request.status == 0) + this.finish(url, 200, new Uint8Array(request.response)); + else + onerror(); + }; + request.onerror = onerror; + request.send(); + } + start(url, success, error) { + let callbacks = this.callbacks[url]; + try { + if (callbacks) + return true; + this.callbacks[url] = callbacks = []; + } finally { + callbacks.push(success, error); + } + } + finish(url, status, data) { + let callbacks = this.callbacks[url]; + delete this.callbacks[url]; + let args = status == 200 || status == 0 ? [data] : [status, data]; + for (let i = args.length - 1, n = callbacks.length; i < n; i += 2) + callbacks[i].apply(null, args); + } + }; + + // spine-core/src/Event.ts + var Event = class { + constructor(time, data) { + this.data = null; + this.intValue = 0; + this.floatValue = 0; + this.stringValue = null; + this.time = 0; + this.volume = 0; + this.balance = 0; + if (!data) + throw new Error("data cannot be null."); + this.time = time; + this.data = data; + } + }; + + // spine-core/src/EventData.ts + var EventData = class { + constructor(name) { + this.name = null; + this.intValue = 0; + this.floatValue = 0; + this.stringValue = null; + this.audioPath = null; + this.volume = 0; + this.balance = 0; + this.name = name; + } + }; + + // spine-core/src/IkConstraint.ts + var IkConstraint = class { + constructor(data, skeleton) { + this.data = null; + this.bones = null; + this.target = null; + this.bendDirection = 0; + this.compress = false; + this.stretch = false; + this.mix = 1; + this.softness = 0; + this.active = false; + if (!data) + throw new Error("data cannot be null."); + if (!skeleton) + 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.data.uniform, this.softness, this.mix); + break; + } + } + apply1(bone, targetX, targetY, compress, stretch, uniform, alpha) { + let p = bone.parent; + let pa = p.a, pb = p.b, pc = p.c, 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; + default: + let x = targetX - p.worldX, y = targetY - p.worldY; + 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 > 1e-4) { + 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); + } + apply2(parent, child, targetX, targetY, bendDir, stretch, uniform, softness, alpha) { + let px = parent.ax, py = parent.ay, psx = parent.ascaleX, psy = parent.ascaleY, sx = psx, sy = psy, csx = child.ascaleX; + 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 = parent.a, b = parent.b, c = parent.c, d = parent.d; + let u = Math.abs(psx - psy) <= 1e-4; + if (!u || stretch) { + cy = 0; + cwx = a * cx + parent.worldX; + cwy = c * cx + parent.worldY; + } else { + cy = child.ay; + cwx = a * cx + b * cy + parent.worldX; + cwy = c * cx + d * cy + parent.worldY; + } + let pp = parent.parent; + a = pp.a; + b = pp.b; + c = pp.c; + d = pp.d; + let id = 1 / (a * d - b * c), x = cwx - pp.worldX, y = cwy - pp.worldY; + 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 < 1e-4) { + 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.worldX; + y = targetY - pp.worldY; + 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) * 0.5; + 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; + a2 = Math.PI * bendDir; + } else if (cos > 1) { + cos = 1; + a2 = 0; + if (stretch) { + a = (Math.sqrt(dd) / (l1 + l2) - 1) * alpha + 1; + sx *= a; + if (uniform) + sy *= a; + } + } else + 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) * 0.5; + 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) * 0.5) { + 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, sy, 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); + } + }; + + // spine-core/src/IkConstraintData.ts + var IkConstraintData = class extends ConstraintData { + constructor(name) { + super(name, 0, false); + this.bones = new Array(); + this.target = null; + this.bendDirection = 1; + this.compress = false; + this.stretch = false; + this.uniform = false; + this.mix = 1; + this.softness = 0; + } + }; + + // spine-core/src/PathConstraintData.ts + var PathConstraintData = class extends ConstraintData { + constructor(name) { + super(name, 0, false); + this.bones = new Array(); + this.target = null; + this.positionMode = null; + this.spacingMode = null; + this.rotateMode = null; + this.offsetRotation = 0; + this.position = 0; + this.spacing = 0; + this.mixRotate = 0; + this.mixX = 0; + this.mixY = 0; + } + }; + var PositionMode; + (function(PositionMode2) { + PositionMode2[PositionMode2["Fixed"] = 0] = "Fixed"; + PositionMode2[PositionMode2["Percent"] = 1] = "Percent"; + })(PositionMode || (PositionMode = {})); + var SpacingMode; + (function(SpacingMode2) { + SpacingMode2[SpacingMode2["Length"] = 0] = "Length"; + SpacingMode2[SpacingMode2["Fixed"] = 1] = "Fixed"; + SpacingMode2[SpacingMode2["Percent"] = 2] = "Percent"; + SpacingMode2[SpacingMode2["Proportional"] = 3] = "Proportional"; + })(SpacingMode || (SpacingMode = {})); + var RotateMode; + (function(RotateMode2) { + RotateMode2[RotateMode2["Tangent"] = 0] = "Tangent"; + RotateMode2[RotateMode2["Chain"] = 1] = "Chain"; + RotateMode2[RotateMode2["ChainScale"] = 2] = "ChainScale"; + })(RotateMode || (RotateMode = {})); + + // spine-core/src/PathConstraint.ts + var _PathConstraint = class { + constructor(data, skeleton) { + this.data = null; + this.bones = null; + this.target = null; + this.position = 0; + this.spacing = 0; + this.mixRotate = 0; + this.mixX = 0; + this.mixY = 0; + this.spaces = new Array(); + this.positions = new Array(); + this.world = new Array(); + this.curves = new Array(); + this.lengths = new Array(); + this.segments = new Array(); + this.active = false; + if (!data) + throw new Error("data cannot be null."); + if (!skeleton) + 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)) + 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.Tangent, scale = data.rotateMode == RotateMode.ChainScale; + let bones = this.bones; + let boneCount = bones.length, spacesCount = tangents ? boneCount : boneCount + 1; + 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.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.epsilon) + lengths[i] = 0; + else { + let x = setupLength * bone.a, y = setupLength * bone.c; + lengths[i] = Math.sqrt(x * x + y * y); + } + } + } + Utils.arrayFill(spaces, 1, spacesCount, spacing); + break; + case SpacingMode.Proportional: + let sum = 0; + 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] = spacing; + } else { + let x = setupLength * bone.a, y = setupLength * bone.c; + 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.Length; + 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] = spacing; + } else { + let x = setupLength * bone.a, y = setupLength * bone.c; + 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.Chain; + else { + tip = false; + let p = this.target.bone; + 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]; + bone.worldX += (boneX - bone.worldX) * mixX; + bone.worldY += (boneY - bone.worldY) * 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; + bone.a *= s; + bone.c *= s; + } + } + boneX = x; + boneY = y; + if (mixRotate > 0) { + let a = bone.a, b = bone.b, c = bone.c, d = bone.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); + bone.a = cos * a - sin * c; + bone.b = cos * b - sin * d; + bone.c = sin * a + cos * c; + bone.d = sin * b + cos * d; + } + bone.updateAppliedTransform(); + } + } + 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 closed2 = path.closed; + let verticesLength = path.worldVerticesLength, curveCount = verticesLength / 6, prevCurve = _PathConstraint.NONE; + if (!path.constantSpeed) { + let lengths = path.lengths; + curveCount -= closed2 ? 1 : 2; + let pathLength2 = lengths[curveCount]; + if (this.data.positionMode == PositionMode.Percent) + position *= pathLength2; + let multiplier2; + switch (this.data.spacingMode) { + case SpacingMode.Percent: + multiplier2 = pathLength2; + break; + case SpacingMode.Proportional: + multiplier2 = pathLength2 / spacesCount; + break; + default: + multiplier2 = 1; + } + world = Utils.setArraySize(this.world, 8); + for (let i = 0, o = 0, curve = 0; i < spacesCount; i++, o += 3) { + let space = spaces[i] * multiplier2; + position += space; + let p = position; + if (closed2) { + p %= pathLength2; + if (p < 0) + p += pathLength2; + 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 > pathLength2) { + if (prevCurve != _PathConstraint.AFTER) { + prevCurve = _PathConstraint.AFTER; + path.computeWorldVertices(target, verticesLength - 6, 4, world, 0, 2); + } + this.addAfterPosition(p - pathLength2, world, 0, out, o); + continue; + } + for (; ; curve++) { + let length = lengths[curve]; + if (p > length) + continue; + if (curve == 0) + p /= length; else { - return 0; - } - }; - return WindowedMean; - }()); - spine.WindowedMean = WindowedMean; -})(spine || (spine = {})); -(function () { - if (!Math.fround) { - Math.fround = (function (array) { - return function (x) { - return array[0] = x, array[0]; - }; - })(new Float32Array(1)); + let prev = lengths[curve - 1]; + p = (p - prev) / (length - prev); + } + break; + } + if (curve != prevCurve) { + prevCurve = curve; + if (closed2 && 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; + } + if (closed2) { + 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); + } + 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.Percent) + position *= pathLength; + let multiplier; + switch (this.data.spacingMode) { + case SpacingMode.Percent: + multiplier = pathLength; + break; + case SpacingMode.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 (closed2) { + 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; + } + 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; + } + 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) * 6e-3; + dddfy = ((cy1 - cy2) * 3 - y1 + y2) * 6e-3; + 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; + } + 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 < 1e-3) + 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)); + } + } + }; + var PathConstraint = _PathConstraint; + PathConstraint.NONE = -1; + PathConstraint.BEFORE = -2; + PathConstraint.AFTER = -3; + PathConstraint.epsilon = 1e-5; + + // spine-core/src/Slot.ts + var Slot = class { + constructor(data, bone) { + this.data = null; + this.bone = null; + this.color = null; + this.darkColor = null; + this.attachment = null; + this.attachmentTime = 0; + this.attachmentState = 0; + this.deform = new Array(); + if (!data) + throw new Error("data cannot be null."); + if (!bone) + throw new Error("bone cannot be null."); + this.data = data; + this.bone = bone; + this.color = new Color(); + this.darkColor = !data.darkColor ? null : new Color(); + this.setToSetupPose(); + } + getSkeleton() { + return this.bone.skeleton; + } + getAttachment() { + return this.attachment; + } + setAttachment(attachment) { + if (this.attachment == attachment) + return; + if (!(attachment instanceof VertexAttachment) || !(this.attachment instanceof VertexAttachment) || attachment.deformAttachment != this.attachment.deformAttachment) { + this.deform.length = 0; + } + this.attachment = attachment; + this.attachmentTime = this.bone.skeleton.time; + } + setAttachmentTime(time) { + this.attachmentTime = this.bone.skeleton.time - time; + } + getAttachmentTime() { + return this.bone.skeleton.time - this.attachmentTime; + } + setToSetupPose() { + this.color.setFromColor(this.data.color); + if (this.darkColor) + this.darkColor.setFromColor(this.data.darkColor); + if (!this.data.attachmentName) + this.attachment = null; + else { + this.attachment = null; + this.setAttachment(this.bone.skeleton.getAttachment(this.data.index, this.data.attachmentName)); + } + } + }; + + // spine-core/src/TransformConstraint.ts + var TransformConstraint = class { + constructor(data, skeleton) { + this.data = null; + this.bones = null; + this.target = null; + this.mixRotate = 0; + this.mixX = 0; + this.mixY = 0; + this.mixScaleX = 0; + this.mixScaleY = 0; + this.mixShearY = 0; + this.temp = new Vector2(); + this.active = false; + if (!data) + throw new Error("data cannot be null."); + if (!skeleton) + 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; + let ta = target.a, tb = target.b, tc = target.c, td = target.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]; + if (mixRotate != 0) { + let a = bone.a, b = bone.b, c = bone.c, d = bone.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); + bone.a = cos * a - sin * c; + bone.b = cos * b - sin * d; + bone.c = sin * a + cos * c; + bone.d = sin * b + cos * d; + } + if (translate) { + let temp = this.temp; + target.localToWorld(temp.set(this.data.offsetX, this.data.offsetY)); + bone.worldX += (temp.x - bone.worldX) * mixX; + bone.worldY += (temp.y - bone.worldY) * mixY; + } + if (mixScaleX != 0) { + let s = Math.sqrt(bone.a * bone.a + bone.c * bone.c); + if (s != 0) + s = (s + (Math.sqrt(ta * ta + tc * tc) - s + this.data.offsetScaleX) * mixScaleX) / s; + bone.a *= s; + bone.c *= s; + } + if (mixScaleY != 0) { + let s = Math.sqrt(bone.b * bone.b + bone.d * bone.d); + if (s != 0) + s = (s + (Math.sqrt(tb * tb + td * td) - s + this.data.offsetScaleY) * mixScaleY) / s; + bone.b *= s; + bone.d *= s; + } + if (mixShearY > 0) { + let b = bone.b, d = bone.d; + let by = Math.atan2(d, b); + let r = Math.atan2(td, tb) - Math.atan2(tc, ta) - (by - Math.atan2(bone.c, bone.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); + bone.b = Math.cos(r) * s; + bone.d = Math.sin(r) * s; + } + bone.updateAppliedTransform(); + } + } + 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 ta = target.a, tb = target.b, tc = target.c, td = target.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]; + if (mixRotate != 0) { + let a = bone.a, b = bone.b, c = bone.c, d = bone.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); + bone.a = cos * a - sin * c; + bone.b = cos * b - sin * d; + bone.c = sin * a + cos * c; + bone.d = sin * b + cos * d; + } + if (translate) { + let temp = this.temp; + target.localToWorld(temp.set(this.data.offsetX, this.data.offsetY)); + bone.worldX += temp.x * mixX; + bone.worldY += temp.y * mixY; + } + if (mixScaleX != 0) { + let s = (Math.sqrt(ta * ta + tc * tc) - 1 + this.data.offsetScaleX) * mixScaleX + 1; + bone.a *= s; + bone.c *= s; + } + if (mixScaleY != 0) { + let s = (Math.sqrt(tb * tb + td * td) - 1 + this.data.offsetScaleY) * mixScaleY + 1; + bone.b *= s; + bone.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 = bone.b, d = bone.d; + r = Math.atan2(d, b) + (r - MathUtils.PI / 2 + offsetShearY) * mixShearY; + let s = Math.sqrt(b * b + d * d); + bone.b = Math.cos(r) * s; + bone.d = Math.sin(r) * s; + } + bone.updateAppliedTransform(); + } + } + applyAbsoluteLocal() { + let mixRotate = this.mixRotate, mixX = this.mixX, mixY = this.mixY, mixScaleX = this.mixScaleX, mixScaleY = this.mixScaleY, mixShearY = this.mixShearY; + let target = this.target; + let bones = this.bones; + for (let i = 0, n = bones.length; i < n; i++) { + let bone = bones[i]; + 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; + 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; + let bones = this.bones; + for (let i = 0, n = bones.length; i < n; i++) { + let bone = bones[i]; + 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); + } + } + }; + + // spine-core/src/Skeleton.ts + var Skeleton = class { + constructor(data) { + this.data = null; + this.bones = null; + this.slots = null; + this.drawOrder = null; + this.ikConstraints = null; + this.transformConstraints = null; + this.pathConstraints = null; + this._updateCache = new Array(); + this.skin = null; + this.color = null; + this.time = 0; + this.scaleX = 1; + this.scaleY = 1; + this.x = 0; + this.y = 0; + if (!data) + 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) + 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; + 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) { + 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); + } + } + 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 && 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 && 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) + this.sortPathConstraintAttachment(this.skin, slotIndex, slotBone); + if (this.data.defaultSkin && 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 && 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)) + return; + let pathBones = attachment.bones; + if (!pathBones) + 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) + 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; + } + } + updateWorldTransform() { + let bones = this.bones; + for (let i = 0, n = bones.length; i < n; i++) { + let bone = bones[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; + } + let updateCache = this._updateCache; + for (let i = 0, n = updateCache.length; i < n; i++) + updateCache[i].update(); + } + updateWorldTransformWith(parent) { + let rootBone = this.getRootBone(); + let pa = parent.a, pb = parent.b, pc = parent.c, pd = parent.d; + rootBone.worldX = pa * this.x + pb * this.y + parent.worldX; + rootBone.worldY = 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; + rootBone.a = (pa * la + pb * lc) * this.scaleX; + rootBone.b = (pa * lb + pb * ld) * this.scaleX; + rootBone.c = (pc * la + pd * lc) * this.scaleY; + rootBone.d = (pc * lb + pd * ld) * this.scaleY; + let updateCache = this._updateCache; + for (let i = 0, n = updateCache.length; i < n; i++) { + let updatable = updateCache[i]; + if (updatable != rootBone) + updatable.update(); + } + } + setToSetupPose() { + this.setBonesToSetupPose(); + this.setSlotsToSetupPose(); + } + 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; + } + } + 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(); + } + getRootBone() { + if (this.bones.length == 0) + return null; + return this.bones[0]; + } + findBone(boneName) { + if (!boneName) + 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; + } + findSlot(slotName) { + if (!slotName) + 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; + } + setSkinByName(skinName) { + let skin = this.data.findSkin(skinName); + if (!skin) + throw new Error("Skin not found: " + skinName); + this.setSkin(skin); + } + setSkin(newSkin) { + if (newSkin == this.skin) + return; + if (newSkin) { + if (this.skin) + 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) { + let attachment = newSkin.getAttachment(i, name); + if (attachment) + slot.setAttachment(attachment); + } + } + } + } + this.skin = newSkin; + this.updateCache(); + } + getAttachmentByName(slotName, attachmentName) { + return this.getAttachment(this.data.findSlot(slotName).index, attachmentName); + } + getAttachment(slotIndex, attachmentName) { + if (!attachmentName) + throw new Error("attachmentName cannot be null."); + if (this.skin) { + let attachment = this.skin.getAttachment(slotIndex, attachmentName); + if (attachment) + return attachment; + } + if (this.data.defaultSkin) + return this.data.defaultSkin.getAttachment(slotIndex, attachmentName); + return null; + } + setAttachment(slotName, attachmentName) { + if (!slotName) + 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) { + attachment = this.getAttachment(i, attachmentName); + if (!attachment) + throw new Error("Attachment not found: " + attachmentName + ", for slot: " + slotName); + } + slot.setAttachment(attachment); + return; + } + } + throw new Error("Slot not found: " + slotName); + } + findIkConstraint(constraintName) { + if (!constraintName) + 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; + } + findTransformConstraint(constraintName) { + if (!constraintName) + 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; + } + findPathConstraint(constraintName) { + if (!constraintName) + 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; + } + getBounds(offset, size, temp = new Array(2)) { + if (!offset) + throw new Error("offset cannot be null."); + if (!size) + 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) { + 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; + } + }; + + // spine-core/src/SkeletonData.ts + var SkeletonData = class { + constructor() { + this.name = null; + this.bones = new Array(); + this.slots = new Array(); + this.skins = new Array(); + this.defaultSkin = null; + this.events = new Array(); + this.animations = new Array(); + this.ikConstraints = new Array(); + this.transformConstraints = new Array(); + this.pathConstraints = new Array(); + this.x = 0; + this.y = 0; + this.width = 0; + this.height = 0; + this.version = null; + this.hash = null; + this.fps = 0; + this.imagesPath = null; + this.audioPath = null; + } + findBone(boneName) { + if (!boneName) + 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; + } + findSlot(slotName) { + if (!slotName) + 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; + } + findSkin(skinName) { + if (!skinName) + 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) + 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) + 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) + 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) + 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) + 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; + } + }; + + // spine-core/src/Skin.ts + var SkinEntry = class { + constructor(slotIndex = 0, name = null, attachment = null) { + this.slotIndex = slotIndex; + this.name = name; + this.attachment = attachment; + } + }; + var Skin = class { + constructor(name) { + this.name = null; + this.attachments = new Array(); + this.bones = Array(); + this.constraints = new Array(); + if (!name) + throw new Error("name cannot be null."); + this.name = name; + } + setAttachment(slotIndex, name, attachment) { + if (!attachment) + 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 ii = 0; ii < this.bones.length; ii++) { + if (this.bones[ii] == 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 ii = 0; ii < this.constraints.length; ii++) { + if (this.constraints[ii] == 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); + } } -})(); -var spine; -(function (spine) { - var Attachment = (function () { - function Attachment(name) { - if (name == null) - throw new Error("name cannot be null."); - this.name = name; - } - return Attachment; - }()); - spine.Attachment = Attachment; - var VertexAttachment = (function (_super) { - __extends(VertexAttachment, _super); - function VertexAttachment(name) { - var _this = _super.call(this, name) || this; - _this.id = (VertexAttachment.nextID++ & 65535) << 11; - _this.worldVerticesLength = 0; - _this.deformAttachment = _this; - return _this; - } - VertexAttachment.prototype.computeWorldVertices = function (slot, start, count, worldVertices, offset, stride) { - count = offset + (count >> 1) * stride; - var skeleton = slot.bone.skeleton; - var deformArray = slot.deform; - var vertices = this.vertices; - var bones = this.bones; - if (bones == null) { - if (deformArray.length > 0) - vertices = deformArray; - var bone = slot.bone; - var x = bone.worldX; - var y = bone.worldY; - var a = bone.a, b = bone.b, c = bone.c, d = bone.d; - for (var v_1 = start, w = offset; w < count; v_1 += 2, w += stride) { - var vx = vertices[v_1], vy = vertices[v_1 + 1]; - worldVertices[w] = vx * a + vy * b + x; - worldVertices[w + 1] = vx * c + vy * d + y; - } - return; - } - var v = 0, skip = 0; - for (var i = 0; i < start; i += 2) { - var n = bones[v]; - v += n + 1; - skip += n; - } - var skeletonBones = skeleton.bones; - if (deformArray.length == 0) { - for (var w = offset, b = skip * 3; w < count; w += stride) { - var wx = 0, wy = 0; - var n = bones[v++]; - n += v; - for (; v < n; v++, b += 3) { - var bone = skeletonBones[bones[v]]; - var vx = vertices[b], vy = vertices[b + 1], weight = vertices[b + 2]; - wx += (vx * bone.a + vy * bone.b + bone.worldX) * weight; - wy += (vx * bone.c + vy * bone.d + bone.worldY) * weight; - } - worldVertices[w] = wx; - worldVertices[w + 1] = wy; - } - } - else { - var deform = deformArray; - for (var w = offset, b = skip * 3, f = skip << 1; w < count; w += stride) { - var wx = 0, wy = 0; - var n = bones[v++]; - n += v; - for (; v < n; v++, b += 3, f += 2) { - var bone = skeletonBones[bones[v]]; - var vx = vertices[b] + deform[f], vy = vertices[b + 1] + deform[f + 1], weight = vertices[b + 2]; - wx += (vx * bone.a + vy * bone.b + bone.worldX) * weight; - wy += (vx * bone.c + vy * bone.d + bone.worldY) * weight; - } - worldVertices[w] = wx; - worldVertices[w + 1] = wy; - } - } - }; - VertexAttachment.prototype.copyTo = function (attachment) { - if (this.bones != null) { - attachment.bones = new Array(this.bones.length); - spine.Utils.arrayCopy(this.bones, 0, attachment.bones, 0, this.bones.length); - } - else - attachment.bones = null; - if (this.vertices != null) { - attachment.vertices = spine.Utils.newFloatArray(this.vertices.length); - spine.Utils.arrayCopy(this.vertices, 0, attachment.vertices, 0, this.vertices.length); - } - else - attachment.vertices = null; - attachment.worldVerticesLength = this.worldVerticesLength; - attachment.deformAttachment = this.deformAttachment; - }; - VertexAttachment.nextID = 0; - return VertexAttachment; - }(Attachment)); - spine.VertexAttachment = VertexAttachment; -})(spine || (spine = {})); -var spine; -(function (spine) { - var AttachmentType; - (function (AttachmentType) { - AttachmentType[AttachmentType["Region"] = 0] = "Region"; - AttachmentType[AttachmentType["BoundingBox"] = 1] = "BoundingBox"; - AttachmentType[AttachmentType["Mesh"] = 2] = "Mesh"; - AttachmentType[AttachmentType["LinkedMesh"] = 3] = "LinkedMesh"; - AttachmentType[AttachmentType["Path"] = 4] = "Path"; - AttachmentType[AttachmentType["Point"] = 5] = "Point"; - AttachmentType[AttachmentType["Clipping"] = 6] = "Clipping"; - })(AttachmentType = spine.AttachmentType || (spine.AttachmentType = {})); -})(spine || (spine = {})); -var spine; -(function (spine) { - var BoundingBoxAttachment = (function (_super) { - __extends(BoundingBoxAttachment, _super); - function BoundingBoxAttachment(name) { - var _this = _super.call(this, name) || this; - _this.color = new spine.Color(1, 1, 1, 1); - return _this; - } - BoundingBoxAttachment.prototype.copy = function () { - var copy = new BoundingBoxAttachment(this.name); - this.copyTo(copy); - copy.color.setFromColor(this.color); - return copy; - }; - return BoundingBoxAttachment; - }(spine.VertexAttachment)); - spine.BoundingBoxAttachment = BoundingBoxAttachment; -})(spine || (spine = {})); -var spine; -(function (spine) { - var ClippingAttachment = (function (_super) { - __extends(ClippingAttachment, _super); - function ClippingAttachment(name) { - var _this = _super.call(this, name) || this; - _this.color = new spine.Color(0.2275, 0.2275, 0.8078, 1); - return _this; - } - ClippingAttachment.prototype.copy = function () { - var copy = new ClippingAttachment(this.name); - this.copyTo(copy); - copy.endSlot = this.endSlot; - copy.color.setFromColor(this.color); - return copy; - }; - return ClippingAttachment; - }(spine.VertexAttachment)); - spine.ClippingAttachment = ClippingAttachment; -})(spine || (spine = {})); -var spine; -(function (spine) { - var MeshAttachment = (function (_super) { - __extends(MeshAttachment, _super); - function MeshAttachment(name) { - var _this = _super.call(this, name) || this; - _this.color = new spine.Color(1, 1, 1, 1); - _this.tempColor = new spine.Color(0, 0, 0, 0); - return _this; - } - MeshAttachment.prototype.updateUVs = function () { - var regionUVs = this.regionUVs; - if (this.uvs == null || this.uvs.length != regionUVs.length) - this.uvs = spine.Utils.newFloatArray(regionUVs.length); - var uvs = this.uvs; - var n = this.uvs.length; - var u = this.region.u, v = this.region.v, width = 0, height = 0; - if (this.region instanceof spine.TextureAtlasRegion) { - var region = this.region; - var textureWidth = region.texture.getImage().width, textureHeight = region.texture.getImage().height; - switch (region.degrees) { - case 90: - u -= (region.originalHeight - region.offsetY - region.height) / textureWidth; - v -= (region.originalWidth - region.offsetX - region.width) / textureHeight; - width = region.originalHeight / textureWidth; - height = region.originalWidth / textureHeight; - for (var i = 0; i < n; i += 2) { - uvs[i] = u + regionUVs[i + 1] * width; - uvs[i + 1] = v + (1 - regionUVs[i]) * height; - } - return; - case 180: - u -= (region.originalWidth - region.offsetX - region.width) / textureWidth; - v -= region.offsetY / textureHeight; - width = region.originalWidth / textureWidth; - height = region.originalHeight / textureHeight; - for (var i = 0; i < n; i += 2) { - uvs[i] = u + (1 - regionUVs[i]) * width; - uvs[i + 1] = v + (1 - regionUVs[i + 1]) * height; - } - return; - case 270: - u -= region.offsetY / textureWidth; - v -= region.offsetX / textureHeight; - width = region.originalHeight / textureWidth; - height = region.originalWidth / textureHeight; - for (var i = 0; i < n; i += 2) { - uvs[i] = u + (1 - regionUVs[i + 1]) * width; - uvs[i + 1] = v + regionUVs[i] * height; - } - return; + copySkin(skin) { + for (let i = 0; i < skin.bones.length; i++) { + let bone = skin.bones[i]; + let contained = false; + for (let ii = 0; ii < this.bones.length; ii++) { + if (this.bones[ii] == 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 ii = 0; ii < this.constraints.length; ii++) { + if (this.constraints[ii] == 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) + 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); + } + } + } + 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; + } + 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) + slot.setAttachment(attachment); + break; + } + } + } + slotIndex++; + } + } + }; + + // spine-core/src/SlotData.ts + var SlotData = class { + constructor(index, name, boneData) { + this.index = 0; + this.name = null; + this.boneData = null; + this.color = new Color(1, 1, 1, 1); + this.darkColor = null; + this.attachmentName = null; + this.blendMode = null; + if (index < 0) + throw new Error("index must be >= 0."); + if (!name) + throw new Error("name cannot be null."); + if (!boneData) + throw new Error("boneData cannot be null."); + this.index = index; + this.name = name; + this.boneData = boneData; + } + }; + var BlendMode; + (function(BlendMode3) { + BlendMode3[BlendMode3["Normal"] = 0] = "Normal"; + BlendMode3[BlendMode3["Additive"] = 1] = "Additive"; + BlendMode3[BlendMode3["Multiply"] = 2] = "Multiply"; + BlendMode3[BlendMode3["Screen"] = 3] = "Screen"; + })(BlendMode || (BlendMode = {})); + + // spine-core/src/TransformConstraintData.ts + var TransformConstraintData = class extends ConstraintData { + constructor(name) { + super(name, 0, false); + this.bones = new Array(); + this.target = null; + this.mixRotate = 0; + this.mixX = 0; + this.mixY = 0; + this.mixScaleX = 0; + this.mixScaleY = 0; + this.mixShearY = 0; + this.offsetRotation = 0; + this.offsetX = 0; + this.offsetY = 0; + this.offsetScaleX = 0; + this.offsetScaleY = 0; + this.offsetShearY = 0; + this.relative = false; + this.local = false; + } + }; + + // spine-core/src/SkeletonBinary.ts + var SkeletonBinary = class { + constructor(attachmentLoader) { + this.scale = 1; + this.attachmentLoader = null; + this.linkedMeshes = new Array(); + this.attachmentLoader = attachmentLoader; + } + readSkeletonData(binary) { + let scale = this.scale; + let skeletonData = new SkeletonData(); + skeletonData.name = ""; + 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(); + 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; + n = input.readInt(true); + for (let i = 0; i < n; i++) + input.strings.push(input.readString()); + 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 = input.readInt(true); + data.skinRequired = input.readBoolean(); + if (nonessential) + Color.rgba8888ToColor(data.color, input.readInt32()); + skeletonData.bones.push(data); + } + 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 = input.readInt(true); + skeletonData.slots.push(data); + } + 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); + } + 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.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); + } + 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 = input.readInt(true); + data.spacingMode = input.readInt(true); + data.rotateMode = 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.mixRotate = input.readFloat(); + data.mixX = input.readFloat(); + data.mixY = input.readFloat(); + skeletonData.pathConstraints.push(data); + } + let defaultSkin = this.readSkin(input, skeletonData, true, nonessential); + if (defaultSkin) { + skeletonData.defaultSkin = defaultSkin; + skeletonData.skins.push(defaultSkin); + } + { + 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); + } + n = this.linkedMeshes.length; + for (let i = 0; i < n; i++) { + let linkedMesh = this.linkedMeshes[i]; + let skin = !linkedMesh.skin ? skeletonData.defaultSkin : skeletonData.findSkin(linkedMesh.skin); + let parent = skin.getAttachment(linkedMesh.slotIndex, linkedMesh.parent); + linkedMesh.mesh.deformAttachment = linkedMesh.inheritDeform ? parent : linkedMesh.mesh; + linkedMesh.mesh.setParentMesh(parent); + linkedMesh.mesh.updateUVs(); + } + this.linkedMeshes.length = 0; + 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) { + data.volume = input.readFloat(); + data.balance = input.readFloat(); + } + skeletonData.events.push(data); + } + 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) + skin.setAttachment(slotIndex, name, attachment); + } + } + return skin; + } + readAttachment(input, skeletonData, skin, slotIndex, attachmentName, nonessential) { + let scale = this.scale; + let name = input.readStringRef(); + if (!name) + name = attachmentName; + switch (input.readByte()) { + case 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) + path = name; + let region = this.attachmentLoader.newRegionAttachment(skin, name, path); + if (!region) + 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 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) + return null; + box.worldVerticesLength = vertexCount << 1; + box.vertices = vertices.vertices; + box.bones = vertices.bones; + if (nonessential) + Color.rgba8888ToColor(box.color, color); + return box; + } + case 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) + path = name; + let mesh = this.attachmentLoader.newMeshAttachment(skin, name, path); + if (!mesh) + 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 = uvs; + mesh.updateUVs(); + mesh.hullLength = hullLength << 1; + if (nonessential) { + mesh.edges = edges; + mesh.width = width * scale; + mesh.height = height * scale; + } + return mesh; + } + case 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) + path = name; + let mesh = this.attachmentLoader.newMeshAttachment(skin, name, path); + if (!mesh) + 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 AttachmentType.Path: { + let closed2 = 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) + return null; + path.closed = closed2; + 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 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) + return null; + point.x = x * scale; + point.y = y * scale; + point.rotation = rotation; + if (nonessential) + Color.rgba8888ToColor(point.color, color); + return point; + } + case 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) + 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(); + 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) { + input.readInt(true); + let timelines = new Array(); + let scale = this.scale; + let tempColor1 = new Color(); + let tempColor2 = new Color(); + 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 SLOT_ATTACHMENT: { + let timeline = new AttachmentTimeline(frameCount, slotIndex); + for (let frame = 0; frame < frameCount; frame++) + timeline.setFrame(frame, input.readFloat(), input.readStringRef()); + timelines.push(timeline); + break; + } + case SLOT_RGBA: { + let bezierCount = input.readInt(true); + let timeline = new RGBATimeline(frameCount, bezierCount, slotIndex); + let time = input.readFloat(); + let r = input.readUnsignedByte() / 255; + let g = input.readUnsignedByte() / 255; + let b = input.readUnsignedByte() / 255; + let a = input.readUnsignedByte() / 255; + 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; + let g2 = input.readUnsignedByte() / 255; + let b2 = input.readUnsignedByte() / 255; + let a2 = input.readUnsignedByte() / 255; + switch (input.readByte()) { + case CURVE_STEPPED: + timeline.setStepped(frame); + break; + case CURVE_BEZIER: + setBezier(input, timeline, bezier++, frame, 0, time, time2, r, r2, 1); + setBezier(input, timeline, bezier++, frame, 1, time, time2, g, g2, 1); + setBezier(input, timeline, bezier++, frame, 2, time, time2, b, b2, 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 SLOT_RGB: { + let bezierCount = input.readInt(true); + let timeline = new RGBTimeline(frameCount, bezierCount, slotIndex); + let time = input.readFloat(); + let r = input.readUnsignedByte() / 255; + let g = input.readUnsignedByte() / 255; + let b = input.readUnsignedByte() / 255; + 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; + let g2 = input.readUnsignedByte() / 255; + let b2 = input.readUnsignedByte() / 255; + switch (input.readByte()) { + case CURVE_STEPPED: + timeline.setStepped(frame); + break; + case CURVE_BEZIER: + setBezier(input, timeline, bezier++, frame, 0, time, time2, r, r2, 1); + setBezier(input, timeline, bezier++, frame, 1, time, time2, g, g2, 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 SLOT_RGBA2: { + let bezierCount = input.readInt(true); + let timeline = new RGBA2Timeline(frameCount, bezierCount, slotIndex); + let time = input.readFloat(); + let r = input.readUnsignedByte() / 255; + let g = input.readUnsignedByte() / 255; + let b = input.readUnsignedByte() / 255; + let a = input.readUnsignedByte() / 255; + let r2 = input.readUnsignedByte() / 255; + let g2 = input.readUnsignedByte() / 255; + let b2 = input.readUnsignedByte() / 255; + 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; + let ng = input.readUnsignedByte() / 255; + let nb = input.readUnsignedByte() / 255; + let na = input.readUnsignedByte() / 255; + let nr2 = input.readUnsignedByte() / 255; + let ng2 = input.readUnsignedByte() / 255; + let nb2 = input.readUnsignedByte() / 255; + switch (input.readByte()) { + case CURVE_STEPPED: + timeline.setStepped(frame); + break; + case CURVE_BEZIER: + setBezier(input, timeline, bezier++, frame, 0, time, time2, r, nr, 1); + setBezier(input, timeline, bezier++, frame, 1, time, time2, g, ng, 1); + setBezier(input, timeline, bezier++, frame, 2, time, time2, b, nb, 1); + setBezier(input, timeline, bezier++, frame, 3, time, time2, a, na, 1); + setBezier(input, timeline, bezier++, frame, 4, time, time2, r2, nr2, 1); + setBezier(input, timeline, bezier++, frame, 5, time, time2, g2, ng2, 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 SLOT_RGB2: { + let bezierCount = input.readInt(true); + let timeline = new RGB2Timeline(frameCount, bezierCount, slotIndex); + let time = input.readFloat(); + let r = input.readUnsignedByte() / 255; + let g = input.readUnsignedByte() / 255; + let b = input.readUnsignedByte() / 255; + let r2 = input.readUnsignedByte() / 255; + let g2 = input.readUnsignedByte() / 255; + let b2 = input.readUnsignedByte() / 255; + 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; + let ng = input.readUnsignedByte() / 255; + let nb = input.readUnsignedByte() / 255; + let nr2 = input.readUnsignedByte() / 255; + let ng2 = input.readUnsignedByte() / 255; + let nb2 = input.readUnsignedByte() / 255; + switch (input.readByte()) { + case CURVE_STEPPED: + timeline.setStepped(frame); + break; + case CURVE_BEZIER: + setBezier(input, timeline, bezier++, frame, 0, time, time2, r, nr, 1); + setBezier(input, timeline, bezier++, frame, 1, time, time2, g, ng, 1); + setBezier(input, timeline, bezier++, frame, 2, time, time2, b, nb, 1); + setBezier(input, timeline, bezier++, frame, 3, time, time2, r2, nr2, 1); + setBezier(input, timeline, bezier++, frame, 4, time, time2, g2, ng2, 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 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 CURVE_STEPPED: + timeline.setStepped(frame); + break; + case CURVE_BEZIER: + setBezier(input, timeline, bezier++, frame, 0, time, time2, a, a2, 1); } - u -= region.offsetX / textureWidth; - v -= (region.originalHeight - region.offsetY - region.height) / textureHeight; - width = region.originalWidth / textureWidth; - height = region.originalHeight / textureHeight; - } - else if (this.region == null) { - u = v = 0; - width = height = 1; - } - else { - width = this.region.u2 - u; - height = this.region.v2 - v; + time = time2; + a = a2; + } + timelines.push(timeline); + break; } - for (var i = 0; i < n; i += 2) { - uvs[i] = u + regionUVs[i] * width; - uvs[i + 1] = v + regionUVs[i + 1] * height; - } - }; - MeshAttachment.prototype.getParentMesh = function () { - return this.parentMesh; - }; - MeshAttachment.prototype.setParentMesh = function (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; - } - }; - MeshAttachment.prototype.copy = function () { - if (this.parentMesh != null) - return this.newLinkedMesh(); - var copy = new MeshAttachment(this.name); - copy.region = this.region; - copy.path = this.path; - copy.color.setFromColor(this.color); - this.copyTo(copy); - copy.regionUVs = new Array(this.regionUVs.length); - spine.Utils.arrayCopy(this.regionUVs, 0, copy.regionUVs, 0, this.regionUVs.length); - copy.uvs = new Array(this.uvs.length); - spine.Utils.arrayCopy(this.uvs, 0, copy.uvs, 0, this.uvs.length); - copy.triangles = new Array(this.triangles.length); - spine.Utils.arrayCopy(this.triangles, 0, copy.triangles, 0, this.triangles.length); - copy.hullLength = this.hullLength; - if (this.edges != null) { - copy.edges = new Array(this.edges.length); - spine.Utils.arrayCopy(this.edges, 0, copy.edges, 0, this.edges.length); - } - copy.width = this.width; - copy.height = this.height; - return copy; - }; - MeshAttachment.prototype.newLinkedMesh = function () { - var 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; - }; - return MeshAttachment; - }(spine.VertexAttachment)); - spine.MeshAttachment = MeshAttachment; -})(spine || (spine = {})); -var spine; -(function (spine) { - var PathAttachment = (function (_super) { - __extends(PathAttachment, _super); - function PathAttachment(name) { - var _this = _super.call(this, name) || this; - _this.closed = false; - _this.constantSpeed = false; - _this.color = new spine.Color(1, 1, 1, 1); - return _this; - } - PathAttachment.prototype.copy = function () { - var copy = new PathAttachment(this.name); - this.copyTo(copy); - copy.lengths = new Array(this.lengths.length); - spine.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; - }; - return PathAttachment; - }(spine.VertexAttachment)); - spine.PathAttachment = PathAttachment; -})(spine || (spine = {})); -var spine; -(function (spine) { - var PointAttachment = (function (_super) { - __extends(PointAttachment, _super); - function PointAttachment(name) { - var _this = _super.call(this, name) || this; - _this.color = new spine.Color(0.38, 0.94, 0, 1); - return _this; - } - PointAttachment.prototype.computeWorldPosition = function (bone, point) { - point.x = this.x * bone.a + this.y * bone.b + bone.worldX; - point.y = this.x * bone.c + this.y * bone.d + bone.worldY; - return point; - }; - PointAttachment.prototype.computeWorldRotation = function (bone) { - var cos = spine.MathUtils.cosDeg(this.rotation), sin = spine.MathUtils.sinDeg(this.rotation); - var x = cos * bone.a + sin * bone.b; - var y = cos * bone.c + sin * bone.d; - return Math.atan2(y, x) * spine.MathUtils.radDeg; - }; - PointAttachment.prototype.copy = function () { - var copy = new PointAttachment(this.name); - copy.x = this.x; - copy.y = this.y; - copy.rotation = this.rotation; - copy.color.setFromColor(this.color); - return copy; - }; - return PointAttachment; - }(spine.VertexAttachment)); - spine.PointAttachment = PointAttachment; -})(spine || (spine = {})); -var spine; -(function (spine) { - var RegionAttachment = (function (_super) { - __extends(RegionAttachment, _super); - function RegionAttachment(name) { - var _this = _super.call(this, name) || this; - _this.x = 0; - _this.y = 0; - _this.scaleX = 1; - _this.scaleY = 1; - _this.rotation = 0; - _this.width = 0; - _this.height = 0; - _this.color = new spine.Color(1, 1, 1, 1); - _this.offset = spine.Utils.newFloatArray(8); - _this.uvs = spine.Utils.newFloatArray(8); - _this.tempColor = new spine.Color(1, 1, 1, 1); - return _this; - } - RegionAttachment.prototype.updateOffset = function () { - var regionScaleX = this.width / this.region.originalWidth * this.scaleX; - var regionScaleY = this.height / this.region.originalHeight * this.scaleY; - var localX = -this.width / 2 * this.scaleX + this.region.offsetX * regionScaleX; - var localY = -this.height / 2 * this.scaleY + this.region.offsetY * regionScaleY; - var localX2 = localX + this.region.width * regionScaleX; - var localY2 = localY + this.region.height * regionScaleY; - var radians = this.rotation * Math.PI / 180; - var cos = Math.cos(radians); - var sin = Math.sin(radians); - var localXCos = localX * cos + this.x; - var localXSin = localX * sin; - var localYCos = localY * cos + this.y; - var localYSin = localY * sin; - var localX2Cos = localX2 * cos + this.x; - var localX2Sin = localX2 * sin; - var localY2Cos = localY2 * cos + this.y; - var localY2Sin = localY2 * sin; - var 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; - }; - RegionAttachment.prototype.setRegion = function (region) { - this.region = region; - var 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; - } - }; - RegionAttachment.prototype.computeWorldVertices = function (bone, worldVertices, offset, stride) { - var vertexOffset = this.offset; - var x = bone.worldX, y = bone.worldY; - var a = bone.a, b = bone.b, c = bone.c, d = bone.d; - var offsetX = 0, offsetY = 0; - offsetX = vertexOffset[RegionAttachment.OX1]; - offsetY = vertexOffset[RegionAttachment.OY1]; - worldVertices[offset] = offsetX * a + offsetY * b + x; - 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; - 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; - 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; - worldVertices[offset + 1] = offsetX * c + offsetY * d + y; - }; - RegionAttachment.prototype.copy = function () { - var 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; - spine.Utils.arrayCopy(this.uvs, 0, copy.uvs, 0, 8); - spine.Utils.arrayCopy(this.offset, 0, copy.offset, 0, 8); - copy.color.setFromColor(this.color); - return copy; - }; - RegionAttachment.OX1 = 0; - RegionAttachment.OY1 = 1; - RegionAttachment.OX2 = 2; - RegionAttachment.OY2 = 3; - RegionAttachment.OX3 = 4; - RegionAttachment.OY3 = 5; - RegionAttachment.OX4 = 6; - RegionAttachment.OY4 = 7; - RegionAttachment.X1 = 0; - RegionAttachment.Y1 = 1; - RegionAttachment.C1R = 2; - RegionAttachment.C1G = 3; - RegionAttachment.C1B = 4; - RegionAttachment.C1A = 5; - RegionAttachment.U1 = 6; - RegionAttachment.V1 = 7; - RegionAttachment.X2 = 8; - RegionAttachment.Y2 = 9; - RegionAttachment.C2R = 10; - RegionAttachment.C2G = 11; - RegionAttachment.C2B = 12; - RegionAttachment.C2A = 13; - RegionAttachment.U2 = 14; - RegionAttachment.V2 = 15; - RegionAttachment.X3 = 16; - RegionAttachment.Y3 = 17; - RegionAttachment.C3R = 18; - RegionAttachment.C3G = 19; - RegionAttachment.C3B = 20; - RegionAttachment.C3A = 21; - RegionAttachment.U3 = 22; - RegionAttachment.V3 = 23; - RegionAttachment.X4 = 24; - RegionAttachment.Y4 = 25; - RegionAttachment.C4R = 26; - RegionAttachment.C4G = 27; - RegionAttachment.C4B = 28; - RegionAttachment.C4A = 29; - RegionAttachment.U4 = 30; - RegionAttachment.V4 = 31; - return RegionAttachment; - }(spine.Attachment)); - spine.RegionAttachment = RegionAttachment; -})(spine || (spine = {})); -var spine; -(function (spine) { - var JitterEffect = (function () { - function JitterEffect(jitterX, jitterY) { - this.jitterX = 0; - this.jitterY = 0; - this.jitterX = jitterX; - this.jitterY = jitterY; - } - JitterEffect.prototype.begin = function (skeleton) { - }; - JitterEffect.prototype.transform = function (position, uv, light, dark) { - position.x += spine.MathUtils.randomTriangular(-this.jitterX, this.jitterY); - position.y += spine.MathUtils.randomTriangular(-this.jitterX, this.jitterY); - }; - JitterEffect.prototype.end = function () { - }; - return JitterEffect; - }()); - spine.JitterEffect = JitterEffect; -})(spine || (spine = {})); -var spine; -(function (spine) { - var SwirlEffect = (function () { - function SwirlEffect(radius) { - this.centerX = 0; - this.centerY = 0; - this.radius = 0; - this.angle = 0; - this.worldX = 0; - this.worldY = 0; - this.radius = radius; - } - SwirlEffect.prototype.begin = function (skeleton) { - this.worldX = skeleton.x + this.centerX; - this.worldY = skeleton.y + this.centerY; - }; - SwirlEffect.prototype.transform = function (position, uv, light, dark) { - var radAngle = this.angle * spine.MathUtils.degreesToRadians; - var x = position.x - this.worldX; - var y = position.y - this.worldY; - var dist = Math.sqrt(x * x + y * y); - if (dist < this.radius) { - var theta = SwirlEffect.interpolation.apply(0, radAngle, (this.radius - dist) / this.radius); - var cos = Math.cos(theta); - var sin = Math.sin(theta); - position.x = cos * x - sin * y + this.worldX; - position.y = sin * x + cos * y + this.worldY; - } - }; - SwirlEffect.prototype.end = function () { - }; - SwirlEffect.interpolation = new spine.PowOut(2); - return SwirlEffect; - }()); - spine.SwirlEffect = SwirlEffect; -})(spine || (spine = {})); -var spine; -(function (spine) { - var webgl; - (function (webgl) { - var AssetManager = (function (_super) { - __extends(AssetManager, _super); - function AssetManager(context, pathPrefix) { - if (pathPrefix === void 0) { pathPrefix = ""; } - return _super.call(this, function (image) { - return new spine.webgl.GLTexture(context, image); - }, pathPrefix) || this; - } - return AssetManager; - }(spine.AssetManager)); - webgl.AssetManager = AssetManager; - })(webgl = spine.webgl || (spine.webgl = {})); -})(spine || (spine = {})); -var spine; -(function (spine) { - var webgl; - (function (webgl) { - var OrthoCamera = (function () { - function OrthoCamera(viewportWidth, viewportHeight) { - this.position = new webgl.Vector3(0, 0, 0); - this.direction = new webgl.Vector3(0, 0, -1); - this.up = new webgl.Vector3(0, 1, 0); - this.near = 0; - this.far = 100; - this.zoom = 1; - this.viewportWidth = 0; - this.viewportHeight = 0; - this.projectionView = new webgl.Matrix4(); - this.inverseProjectionView = new webgl.Matrix4(); - this.projection = new webgl.Matrix4(); - this.view = new webgl.Matrix4(); - this.tmp = new webgl.Vector3(); - this.viewportWidth = viewportWidth; - this.viewportHeight = viewportHeight; - this.update(); - } - OrthoCamera.prototype.update = function () { - var projection = this.projection; - var view = this.view; - var projectionView = this.projectionView; - var inverseProjectionView = this.inverseProjectionView; - var zoom = this.zoom, viewportWidth = this.viewportWidth, viewportHeight = this.viewportHeight; - projection.ortho(zoom * (-viewportWidth / 2), zoom * (viewportWidth / 2), zoom * (-viewportHeight / 2), zoom * (viewportHeight / 2), this.near, this.far); - view.lookAt(this.position, this.direction, this.up); - projectionView.set(projection.values); - projectionView.multiply(view); - inverseProjectionView.set(projectionView.values).invert(); - }; - OrthoCamera.prototype.screenToWorld = function (screenCoords, screenWidth, screenHeight) { - var x = screenCoords.x, y = screenHeight - screenCoords.y - 1; - var tmp = this.tmp; - tmp.x = (2 * x) / screenWidth - 1; - tmp.y = (2 * y) / screenHeight - 1; - tmp.z = (2 * screenCoords.z) - 1; - tmp.project(this.inverseProjectionView); - screenCoords.set(tmp.x, tmp.y, tmp.z); - return screenCoords; - }; - OrthoCamera.prototype.setViewport = function (viewportWidth, viewportHeight) { - this.viewportWidth = viewportWidth; - this.viewportHeight = viewportHeight; - }; - return OrthoCamera; - }()); - webgl.OrthoCamera = OrthoCamera; - })(webgl = spine.webgl || (spine.webgl = {})); -})(spine || (spine = {})); -var spine; -(function (spine) { - var webgl; - (function (webgl) { - var GLTexture = (function (_super) { - __extends(GLTexture, _super); - function GLTexture(context, image, useMipMaps) { - if (useMipMaps === void 0) { useMipMaps = false; } - var _this = _super.call(this, image) || this; - _this.texture = null; - _this.boundUnit = 0; - _this.useMipMaps = false; - _this.context = context instanceof webgl.ManagedWebGLRenderingContext ? context : new webgl.ManagedWebGLRenderingContext(context); - _this.useMipMaps = useMipMaps; - _this.restore(); - _this.context.addRestorable(_this); - return _this; - } - GLTexture.prototype.setFilters = function (minFilter, magFilter) { - var gl = this.context.gl; - this.bind(); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, minFilter); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, GLTexture.validateMagFilter(magFilter)); - }; - GLTexture.validateMagFilter = function (magFilter) { - switch (magFilter) { - case spine.TextureFilter.MipMap: - case spine.TextureFilter.MipMapLinearLinear: - case spine.TextureFilter.MipMapLinearNearest: - case spine.TextureFilter.MipMapNearestLinear: - case spine.TextureFilter.MipMapNearestNearest: - return spine.TextureFilter.Linear; - default: - return magFilter; - } - }; - GLTexture.prototype.setWraps = function (uWrap, vWrap) { - var gl = this.context.gl; - this.bind(); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, uWrap); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, vWrap); - }; - GLTexture.prototype.update = function (useMipMaps) { - var gl = this.context.gl; - if (!this.texture) { - this.texture = this.context.gl.createTexture(); - } - this.bind(); - if (GLTexture.DISABLE_UNPACK_PREMULTIPLIED_ALPHA_WEBGL) - gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, this._image); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, useMipMaps ? gl.LINEAR_MIPMAP_LINEAR : gl.LINEAR); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - if (useMipMaps) - gl.generateMipmap(gl.TEXTURE_2D); - }; - GLTexture.prototype.restore = function () { - this.texture = null; - this.update(this.useMipMaps); - }; - GLTexture.prototype.bind = function (unit) { - if (unit === void 0) { unit = 0; } - var gl = this.context.gl; - this.boundUnit = unit; - gl.activeTexture(gl.TEXTURE0 + unit); - gl.bindTexture(gl.TEXTURE_2D, this.texture); - }; - GLTexture.prototype.unbind = function () { - var gl = this.context.gl; - gl.activeTexture(gl.TEXTURE0 + this.boundUnit); - gl.bindTexture(gl.TEXTURE_2D, null); - }; - GLTexture.prototype.dispose = function () { - this.context.removeRestorable(this); - var gl = this.context.gl; - gl.deleteTexture(this.texture); - }; - GLTexture.DISABLE_UNPACK_PREMULTIPLIED_ALPHA_WEBGL = false; - return GLTexture; - }(spine.Texture)); - webgl.GLTexture = GLTexture; - })(webgl = spine.webgl || (spine.webgl = {})); -})(spine || (spine = {})); -var spine; -(function (spine) { - var webgl; - (function (webgl) { - var Input = (function () { - function Input(element) { - this.lastX = 0; - this.lastY = 0; + } + } + } + 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 BONE_ROTATE: + timelines.push(readTimeline1(input, new RotateTimeline(frameCount, bezierCount, boneIndex), 1)); + break; + case BONE_TRANSLATE: + timelines.push(readTimeline2(input, new TranslateTimeline(frameCount, bezierCount, boneIndex), scale)); + break; + case BONE_TRANSLATEX: + timelines.push(readTimeline1(input, new TranslateXTimeline(frameCount, bezierCount, boneIndex), scale)); + break; + case BONE_TRANSLATEY: + timelines.push(readTimeline1(input, new TranslateYTimeline(frameCount, bezierCount, boneIndex), scale)); + break; + case BONE_SCALE: + timelines.push(readTimeline2(input, new ScaleTimeline(frameCount, bezierCount, boneIndex), 1)); + break; + case BONE_SCALEX: + timelines.push(readTimeline1(input, new ScaleXTimeline(frameCount, bezierCount, boneIndex), 1)); + break; + case BONE_SCALEY: + timelines.push(readTimeline1(input, new ScaleYTimeline(frameCount, bezierCount, boneIndex), 1)); + break; + case BONE_SHEAR: + timelines.push(readTimeline2(input, new ShearTimeline(frameCount, bezierCount, boneIndex), 1)); + break; + case BONE_SHEARX: + timelines.push(readTimeline1(input, new ShearXTimeline(frameCount, bezierCount, boneIndex), 1)); + break; + case BONE_SHEARY: + timelines.push(readTimeline1(input, new ShearYTimeline(frameCount, bezierCount, boneIndex), 1)); + } + } + } + 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(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 CURVE_STEPPED: + timeline.setStepped(frame); + break; + case CURVE_BEZIER: + setBezier(input, timeline, bezier++, frame, 0, time, time2, mix, mix2, 1); + setBezier(input, timeline, bezier++, frame, 1, time, time2, softness, softness2, scale); + } + time = time2; + mix = mix2; + softness = softness2; + } + timelines.push(timeline); + } + 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(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 CURVE_STEPPED: + timeline.setStepped(frame); + break; + case CURVE_BEZIER: + setBezier(input, timeline, bezier++, frame, 0, time, time2, mixRotate, mixRotate2, 1); + setBezier(input, timeline, bezier++, frame, 1, time, time2, mixX, mixX2, 1); + setBezier(input, timeline, bezier++, frame, 2, time, time2, mixY, mixY2, 1); + setBezier(input, timeline, bezier++, frame, 3, time, time2, mixScaleX, mixScaleX2, 1); + setBezier(input, timeline, bezier++, frame, 4, time, time2, mixScaleY, mixScaleY2, 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); + } + 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 PATH_POSITION: + timelines.push(readTimeline1(input, new PathConstraintPositionTimeline(input.readInt(true), input.readInt(true), index), data.positionMode == PositionMode.Fixed ? scale : 1)); + break; + case PATH_SPACING: + timelines.push(readTimeline1(input, new PathConstraintSpacingTimeline(input.readInt(true), input.readInt(true), index), data.spacingMode == SpacingMode.Length || data.spacingMode == SpacingMode.Fixed ? scale : 1)); + break; + case PATH_MIX: + let timeline = new PathConstraintMixTimeline(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 CURVE_STEPPED: + timeline.setStepped(frame); + break; + case CURVE_BEZIER: + setBezier(input, timeline, bezier++, frame, 0, time, time2, mixRotate, mixRotate2, 1); + setBezier(input, timeline, bezier++, frame, 1, time, time2, mixX, mixX2, 1); + setBezier(input, timeline, bezier++, frame, 2, time, time2, mixY, mixY2, 1); + } + time = time2; + mixRotate = mixRotate2; + mixX = mixX2; + mixY = mixY2; + } + timelines.push(timeline); + } + } + } + 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); + let weighted = attachment.bones; + 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(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 CURVE_STEPPED: + timeline.setStepped(frame); + break; + case CURVE_BEZIER: + setBezier(input, timeline, bezier++, frame, 0, time, time2, 0, 1, 1); + } + time = time2; + } + timelines.push(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); + while (originalIndex != slotIndex) + unchanged[unchangedIndex++] = originalIndex++; + drawOrder[originalIndex + input.readInt(true)] = originalIndex++; + } + while (originalIndex < slotCount) + unchanged[unchangedIndex++] = originalIndex++; + for (let ii = slotCount - 1; ii >= 0; ii--) + if (drawOrder[ii] == -1) + drawOrder[ii] = unchanged[--unchangedIndex]; + timeline.setFrame(i, time, drawOrder); + } + timelines.push(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) { + 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(name, timelines, duration); + } + }; + var BinaryInput = class { + 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 & 127; + if ((b & 128) != 0) { + b = this.readByte(); + result |= (b & 127) << 7; + if ((b & 128) != 0) { + b = this.readByte(); + result |= (b & 127) << 14; + if ((b & 128) != 0) { + b = this.readByte(); + result |= (b & 127) << 21; + if ((b & 128) != 0) { + b = this.readByte(); + result |= (b & 127) << 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 = ""; + let charCount = 0; + for (let i = 0; i < byteCount; ) { + let b = this.readByte(); + switch (b >> 4) { + case 12: + case 13: + chars += String.fromCharCode((b & 31) << 6 | this.readByte() & 63); + i += 2; + break; + case 14: + chars += String.fromCharCode((b & 15) << 12 | (this.readByte() & 63) << 6 | this.readByte() & 63); + 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; + } + }; + var LinkedMesh = class { + constructor(mesh, skin, slotIndex, parent, inheritDeform) { + this.mesh = mesh; + this.skin = skin; + this.slotIndex = slotIndex; + this.parent = parent; + this.inheritDeform = inheritDeform; + } + }; + var Vertices = class { + constructor(bones = null, vertices = null) { + this.bones = bones; + this.vertices = vertices; + } + }; + var AttachmentType; + (function(AttachmentType2) { + AttachmentType2[AttachmentType2["Region"] = 0] = "Region"; + AttachmentType2[AttachmentType2["BoundingBox"] = 1] = "BoundingBox"; + AttachmentType2[AttachmentType2["Mesh"] = 2] = "Mesh"; + AttachmentType2[AttachmentType2["LinkedMesh"] = 3] = "LinkedMesh"; + AttachmentType2[AttachmentType2["Path"] = 4] = "Path"; + AttachmentType2[AttachmentType2["Point"] = 5] = "Point"; + AttachmentType2[AttachmentType2["Clipping"] = 6] = "Clipping"; + })(AttachmentType || (AttachmentType = {})); + function readTimeline1(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 CURVE_STEPPED: + timeline.setStepped(frame); + break; + case CURVE_BEZIER: + setBezier(input, timeline, bezier++, frame, 0, time, time2, value, value2, scale); + } + time = time2; + value = value2; + } + return timeline; + } + function 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 CURVE_STEPPED: + timeline.setStepped(frame); + break; + case CURVE_BEZIER: + setBezier(input, timeline, bezier++, frame, 0, time, time2, value1, nvalue1, scale); + setBezier(input, timeline, bezier++, frame, 1, time, time2, value2, nvalue2, scale); + } + time = time2; + value1 = nvalue1; + value2 = nvalue2; + } + return timeline; + } + function 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); + } + var BONE_ROTATE = 0; + var BONE_TRANSLATE = 1; + var BONE_TRANSLATEX = 2; + var BONE_TRANSLATEY = 3; + var BONE_SCALE = 4; + var BONE_SCALEX = 5; + var BONE_SCALEY = 6; + var BONE_SHEAR = 7; + var BONE_SHEARX = 8; + var BONE_SHEARY = 9; + var SLOT_ATTACHMENT = 0; + var SLOT_RGBA = 1; + var SLOT_RGB = 2; + var SLOT_RGBA2 = 3; + var SLOT_RGB2 = 4; + var SLOT_ALPHA = 5; + var PATH_POSITION = 0; + var PATH_SPACING = 1; + var PATH_MIX = 2; + var CURVE_STEPPED = 1; + var CURVE_BEZIER = 2; + + // spine-core/src/SkeletonBounds.ts + var SkeletonBounds = class { + constructor() { + this.minX = 0; + this.minY = 0; + this.maxX = 0; + this.maxY = 0; + this.boundingBoxes = new Array(); + this.polygons = new Array(); + this.polygonPool = new Pool(() => { + return Utils.newFloatArray(16); + }); + } + update(skeleton, updateAabb) { + if (!skeleton) + 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; + } + aabbContainsPoint(x, y) { + return x >= this.minX && x <= this.maxX && y >= this.minY && y <= this.maxY; + } + 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; + } + aabbIntersectsSkeleton(bounds) { + return this.minX < bounds.maxX && this.maxX > bounds.minX && this.minY < bounds.maxY && this.maxY > bounds.minY; + } + 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; + } + 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; + } + 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; + } + 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; + } + getPolygon(boundingBox) { + if (!boundingBox) + 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; + } + }; + + // spine-core/src/Triangulator.ts + var Triangulator = class { + constructor() { + this.convexPolygons = new Array(); + this.convexPolygonsIndices = new Array(); + this.indicesArray = new Array(); + this.isConcaveArray = new Array(); + this.triangles = new Array(); + this.polygonPool = new Pool(() => { + return new Array(); + }); + this.polygonIndicesPool = new Pool(() => { + return new Array(); + }); + } + triangulate(verticesArray) { + let vertices = verticesArray; + let vertexCount = verticesArray.length >> 1; + let indices = this.indicesArray; + indices.length = 0; + for (let i = 0; i < vertexCount; i++) + indices[i] = i; + let isConcave = this.isConcaveArray; + isConcave.length = 0; + for (let i = 0, n = vertexCount; i < n; ++i) + isConcave[i] = Triangulator.isConcave(i, vertexCount, vertices, indices); + let triangles = this.triangles; + triangles.length = 0; + while (vertexCount > 3) { + let previous = vertexCount - 1, i = 0, next = 1; + while (true) { + outer: + if (!isConcave[i]) { + let p1 = indices[previous] << 1, p2 = indices[i] << 1, p3 = indices[next] << 1; + let p1x = vertices[p1], p1y = vertices[p1 + 1]; + let p2x = vertices[p2], p2y = vertices[p2 + 1]; + let p3x = vertices[p3], p3y = vertices[p3 + 1]; + for (let ii = (next + 1) % vertexCount; ii != previous; ii = (ii + 1) % vertexCount) { + if (!isConcave[ii]) + continue; + let v = indices[ii] << 1; + let vx = vertices[v], vy = vertices[v + 1]; + if (Triangulator.positiveArea(p3x, p3y, p1x, p1y, vx, vy)) { + if (Triangulator.positiveArea(p1x, p1y, p2x, p2y, vx, vy)) { + if (Triangulator.positiveArea(p2x, p2y, p3x, p3y, vx, vy)) + break outer; + } + } + } + break; + } + if (next == 0) { + do { + if (!isConcave[i]) + break; + i--; + } while (i > 0); + break; + } + previous = i; + i = next; + next = (next + 1) % vertexCount; + } + triangles.push(indices[(vertexCount + i - 1) % vertexCount]); + triangles.push(indices[i]); + triangles.push(indices[(i + 1) % vertexCount]); + indices.splice(i, 1); + isConcave.splice(i, 1); + vertexCount--; + let previousIndex = (vertexCount + i - 1) % vertexCount; + let nextIndex = i == vertexCount ? 0 : i; + isConcave[previousIndex] = Triangulator.isConcave(previousIndex, vertexCount, vertices, indices); + isConcave[nextIndex] = Triangulator.isConcave(nextIndex, vertexCount, vertices, indices); + } + if (vertexCount == 3) { + triangles.push(indices[2]); + triangles.push(indices[0]); + triangles.push(indices[1]); + } + return triangles; + } + decompose(verticesArray, triangles) { + let vertices = verticesArray; + let convexPolygons = this.convexPolygons; + this.polygonPool.freeAll(convexPolygons); + convexPolygons.length = 0; + let convexPolygonsIndices = this.convexPolygonsIndices; + this.polygonIndicesPool.freeAll(convexPolygonsIndices); + convexPolygonsIndices.length = 0; + let polygonIndices = this.polygonIndicesPool.obtain(); + polygonIndices.length = 0; + let polygon = this.polygonPool.obtain(); + polygon.length = 0; + let fanBaseIndex = -1, lastWinding = 0; + for (let i = 0, n = triangles.length; i < n; i += 3) { + let t1 = triangles[i] << 1, t2 = triangles[i + 1] << 1, t3 = triangles[i + 2] << 1; + let x1 = vertices[t1], y1 = vertices[t1 + 1]; + let x2 = vertices[t2], y2 = vertices[t2 + 1]; + let x3 = vertices[t3], y3 = vertices[t3 + 1]; + let merged = false; + if (fanBaseIndex == t1) { + let o = polygon.length - 4; + let winding1 = Triangulator.winding(polygon[o], polygon[o + 1], polygon[o + 2], polygon[o + 3], x3, y3); + let winding2 = Triangulator.winding(x3, y3, polygon[0], polygon[1], polygon[2], polygon[3]); + if (winding1 == lastWinding && winding2 == lastWinding) { + polygon.push(x3); + polygon.push(y3); + polygonIndices.push(t3); + merged = true; + } + } + if (!merged) { + if (polygon.length > 0) { + convexPolygons.push(polygon); + convexPolygonsIndices.push(polygonIndices); + } else { + this.polygonPool.free(polygon); + this.polygonIndicesPool.free(polygonIndices); + } + polygon = this.polygonPool.obtain(); + polygon.length = 0; + polygon.push(x1); + polygon.push(y1); + polygon.push(x2); + polygon.push(y2); + polygon.push(x3); + polygon.push(y3); + polygonIndices = this.polygonIndicesPool.obtain(); + polygonIndices.length = 0; + polygonIndices.push(t1); + polygonIndices.push(t2); + polygonIndices.push(t3); + lastWinding = Triangulator.winding(x1, y1, x2, y2, x3, y3); + fanBaseIndex = t1; + } + } + if (polygon.length > 0) { + convexPolygons.push(polygon); + convexPolygonsIndices.push(polygonIndices); + } + for (let i = 0, n = convexPolygons.length; i < n; i++) { + polygonIndices = convexPolygonsIndices[i]; + if (polygonIndices.length == 0) + continue; + let firstIndex = polygonIndices[0]; + let lastIndex = polygonIndices[polygonIndices.length - 1]; + polygon = convexPolygons[i]; + let o = polygon.length - 4; + let prevPrevX = polygon[o], prevPrevY = polygon[o + 1]; + let prevX = polygon[o + 2], prevY = polygon[o + 3]; + let firstX = polygon[0], firstY = polygon[1]; + let secondX = polygon[2], secondY = polygon[3]; + let winding = Triangulator.winding(prevPrevX, prevPrevY, prevX, prevY, firstX, firstY); + for (let ii = 0; ii < n; ii++) { + if (ii == i) + continue; + let otherIndices = convexPolygonsIndices[ii]; + if (otherIndices.length != 3) + continue; + let otherFirstIndex = otherIndices[0]; + let otherSecondIndex = otherIndices[1]; + let otherLastIndex = otherIndices[2]; + let otherPoly = convexPolygons[ii]; + let x3 = otherPoly[otherPoly.length - 2], y3 = otherPoly[otherPoly.length - 1]; + if (otherFirstIndex != firstIndex || otherSecondIndex != lastIndex) + continue; + let winding1 = Triangulator.winding(prevPrevX, prevPrevY, prevX, prevY, x3, y3); + let winding2 = Triangulator.winding(x3, y3, firstX, firstY, secondX, secondY); + if (winding1 == winding && winding2 == winding) { + otherPoly.length = 0; + otherIndices.length = 0; + polygon.push(x3); + polygon.push(y3); + polygonIndices.push(otherLastIndex); + prevPrevX = prevX; + prevPrevY = prevY; + prevX = x3; + prevY = y3; + ii = 0; + } + } + } + for (let i = convexPolygons.length - 1; i >= 0; i--) { + polygon = convexPolygons[i]; + if (polygon.length == 0) { + convexPolygons.splice(i, 1); + this.polygonPool.free(polygon); + polygonIndices = convexPolygonsIndices[i]; + convexPolygonsIndices.splice(i, 1); + this.polygonIndicesPool.free(polygonIndices); + } + } + return convexPolygons; + } + static isConcave(index, vertexCount, vertices, indices) { + let previous = indices[(vertexCount + index - 1) % vertexCount] << 1; + let current = indices[index] << 1; + let next = indices[(index + 1) % vertexCount] << 1; + return !this.positiveArea(vertices[previous], vertices[previous + 1], vertices[current], vertices[current + 1], vertices[next], vertices[next + 1]); + } + static positiveArea(p1x, p1y, p2x, p2y, p3x, p3y) { + return p1x * (p3y - p2y) + p2x * (p1y - p3y) + p3x * (p2y - p1y) >= 0; + } + static winding(p1x, p1y, p2x, p2y, p3x, p3y) { + let px = p2x - p1x, py = p2y - p1y; + return p3x * py - p3y * px + px * p1y - p1x * py >= 0 ? 1 : -1; + } + }; + + // spine-core/src/SkeletonClipping.ts + var SkeletonClipping = class { + constructor() { + this.triangulator = new Triangulator(); + this.clippingPolygon = new Array(); + this.clipOutput = new Array(); + this.clippedVertices = new Array(); + this.clippedTriangles = new Array(); + this.scratch = new Array(); + } + clipStart(slot, clip) { + if (this.clipAttachment) + return 0; + this.clipAttachment = clip; + let n = clip.worldVerticesLength; + let vertices = Utils.setArraySize(this.clippingPolygon, n); + clip.computeWorldVertices(slot, 0, n, vertices, 0, 2); + let clippingPolygon = this.clippingPolygon; + SkeletonClipping.makeClockwise(clippingPolygon); + let clippingPolygons = this.clippingPolygons = this.triangulator.decompose(clippingPolygon, this.triangulator.triangulate(clippingPolygon)); + for (let i = 0, n2 = clippingPolygons.length; i < n2; i++) { + let polygon = clippingPolygons[i]; + SkeletonClipping.makeClockwise(polygon); + polygon.push(polygon[0]); + polygon.push(polygon[1]); + } + return clippingPolygons.length; + } + clipEndWithSlot(slot) { + if (this.clipAttachment && this.clipAttachment.endSlot == slot.data) + this.clipEnd(); + } + clipEnd() { + if (!this.clipAttachment) + return; + this.clipAttachment = null; + this.clippingPolygons = null; + this.clippedVertices.length = 0; + this.clippedTriangles.length = 0; + this.clippingPolygon.length = 0; + } + isClipping() { + return this.clipAttachment != null; + } + clipTriangles(vertices, verticesLength, triangles, trianglesLength, uvs, light, dark, twoColor) { + let clipOutput = this.clipOutput, clippedVertices = this.clippedVertices; + let clippedTriangles = this.clippedTriangles; + let polygons = this.clippingPolygons; + let polygonsCount = this.clippingPolygons.length; + let vertexSize = twoColor ? 12 : 8; + let index = 0; + clippedVertices.length = 0; + clippedTriangles.length = 0; + outer: + for (let i = 0; i < trianglesLength; i += 3) { + let vertexOffset = triangles[i] << 1; + let x1 = vertices[vertexOffset], y1 = vertices[vertexOffset + 1]; + let u1 = uvs[vertexOffset], v1 = uvs[vertexOffset + 1]; + vertexOffset = triangles[i + 1] << 1; + let x2 = vertices[vertexOffset], y2 = vertices[vertexOffset + 1]; + let u2 = uvs[vertexOffset], v2 = uvs[vertexOffset + 1]; + vertexOffset = triangles[i + 2] << 1; + let x3 = vertices[vertexOffset], y3 = vertices[vertexOffset + 1]; + let u3 = uvs[vertexOffset], v3 = uvs[vertexOffset + 1]; + for (let p = 0; p < polygonsCount; p++) { + let s = clippedVertices.length; + if (this.clip(x1, y1, x2, y2, x3, y3, polygons[p], clipOutput)) { + let clipOutputLength = clipOutput.length; + if (clipOutputLength == 0) + continue; + let d0 = y2 - y3, d1 = x3 - x2, d2 = x1 - x3, d4 = y3 - y1; + let d = 1 / (d0 * d2 + d1 * (y1 - y3)); + let clipOutputCount = clipOutputLength >> 1; + let clipOutputItems = this.clipOutput; + let clippedVerticesItems = Utils.setArraySize(clippedVertices, s + clipOutputCount * vertexSize); + for (let ii = 0; ii < clipOutputLength; ii += 2) { + let x = clipOutputItems[ii], y = clipOutputItems[ii + 1]; + clippedVerticesItems[s] = x; + clippedVerticesItems[s + 1] = y; + clippedVerticesItems[s + 2] = light.r; + clippedVerticesItems[s + 3] = light.g; + clippedVerticesItems[s + 4] = light.b; + clippedVerticesItems[s + 5] = light.a; + let c0 = x - x3, c1 = y - y3; + let a = (d0 * c0 + d1 * c1) * d; + let b = (d4 * c0 + d2 * c1) * d; + let c = 1 - a - b; + clippedVerticesItems[s + 6] = u1 * a + u2 * b + u3 * c; + clippedVerticesItems[s + 7] = v1 * a + v2 * b + v3 * c; + if (twoColor) { + clippedVerticesItems[s + 8] = dark.r; + clippedVerticesItems[s + 9] = dark.g; + clippedVerticesItems[s + 10] = dark.b; + clippedVerticesItems[s + 11] = dark.a; + } + s += vertexSize; + } + s = clippedTriangles.length; + let clippedTrianglesItems = Utils.setArraySize(clippedTriangles, s + 3 * (clipOutputCount - 2)); + clipOutputCount--; + for (let ii = 1; ii < clipOutputCount; ii++) { + clippedTrianglesItems[s] = index; + clippedTrianglesItems[s + 1] = index + ii; + clippedTrianglesItems[s + 2] = index + ii + 1; + s += 3; + } + index += clipOutputCount + 1; + } else { + let clippedVerticesItems = Utils.setArraySize(clippedVertices, s + 3 * vertexSize); + clippedVerticesItems[s] = x1; + clippedVerticesItems[s + 1] = y1; + clippedVerticesItems[s + 2] = light.r; + clippedVerticesItems[s + 3] = light.g; + clippedVerticesItems[s + 4] = light.b; + clippedVerticesItems[s + 5] = light.a; + if (!twoColor) { + clippedVerticesItems[s + 6] = u1; + clippedVerticesItems[s + 7] = v1; + clippedVerticesItems[s + 8] = x2; + clippedVerticesItems[s + 9] = y2; + clippedVerticesItems[s + 10] = light.r; + clippedVerticesItems[s + 11] = light.g; + clippedVerticesItems[s + 12] = light.b; + clippedVerticesItems[s + 13] = light.a; + clippedVerticesItems[s + 14] = u2; + clippedVerticesItems[s + 15] = v2; + clippedVerticesItems[s + 16] = x3; + clippedVerticesItems[s + 17] = y3; + clippedVerticesItems[s + 18] = light.r; + clippedVerticesItems[s + 19] = light.g; + clippedVerticesItems[s + 20] = light.b; + clippedVerticesItems[s + 21] = light.a; + clippedVerticesItems[s + 22] = u3; + clippedVerticesItems[s + 23] = v3; + } else { + clippedVerticesItems[s + 6] = u1; + clippedVerticesItems[s + 7] = v1; + clippedVerticesItems[s + 8] = dark.r; + clippedVerticesItems[s + 9] = dark.g; + clippedVerticesItems[s + 10] = dark.b; + clippedVerticesItems[s + 11] = dark.a; + clippedVerticesItems[s + 12] = x2; + clippedVerticesItems[s + 13] = y2; + clippedVerticesItems[s + 14] = light.r; + clippedVerticesItems[s + 15] = light.g; + clippedVerticesItems[s + 16] = light.b; + clippedVerticesItems[s + 17] = light.a; + clippedVerticesItems[s + 18] = u2; + clippedVerticesItems[s + 19] = v2; + clippedVerticesItems[s + 20] = dark.r; + clippedVerticesItems[s + 21] = dark.g; + clippedVerticesItems[s + 22] = dark.b; + clippedVerticesItems[s + 23] = dark.a; + clippedVerticesItems[s + 24] = x3; + clippedVerticesItems[s + 25] = y3; + clippedVerticesItems[s + 26] = light.r; + clippedVerticesItems[s + 27] = light.g; + clippedVerticesItems[s + 28] = light.b; + clippedVerticesItems[s + 29] = light.a; + clippedVerticesItems[s + 30] = u3; + clippedVerticesItems[s + 31] = v3; + clippedVerticesItems[s + 32] = dark.r; + clippedVerticesItems[s + 33] = dark.g; + clippedVerticesItems[s + 34] = dark.b; + clippedVerticesItems[s + 35] = dark.a; + } + s = clippedTriangles.length; + let clippedTrianglesItems = Utils.setArraySize(clippedTriangles, s + 3); + clippedTrianglesItems[s] = index; + clippedTrianglesItems[s + 1] = index + 1; + clippedTrianglesItems[s + 2] = index + 2; + index += 3; + continue outer; + } + } + } + } + clip(x1, y1, x2, y2, x3, y3, clippingArea, output) { + let originalOutput = output; + let clipped = false; + let input = null; + if (clippingArea.length % 4 >= 2) { + input = output; + output = this.scratch; + } else + input = this.scratch; + input.length = 0; + input.push(x1); + input.push(y1); + input.push(x2); + input.push(y2); + input.push(x3); + input.push(y3); + input.push(x1); + input.push(y1); + output.length = 0; + let clippingVertices = clippingArea; + let clippingVerticesLast = clippingArea.length - 4; + for (let i = 0; ; i += 2) { + let edgeX = clippingVertices[i], edgeY = clippingVertices[i + 1]; + let edgeX2 = clippingVertices[i + 2], edgeY2 = clippingVertices[i + 3]; + let deltaX = edgeX - edgeX2, deltaY = edgeY - edgeY2; + let inputVertices = input; + let inputVerticesLength = input.length - 2, outputStart = output.length; + for (let ii = 0; ii < inputVerticesLength; ii += 2) { + let inputX = inputVertices[ii], inputY = inputVertices[ii + 1]; + let inputX2 = inputVertices[ii + 2], inputY2 = inputVertices[ii + 3]; + let side2 = deltaX * (inputY2 - edgeY2) - deltaY * (inputX2 - edgeX2) > 0; + if (deltaX * (inputY - edgeY2) - deltaY * (inputX - edgeX2) > 0) { + if (side2) { + output.push(inputX2); + output.push(inputY2); + continue; + } + let c0 = inputY2 - inputY, c2 = inputX2 - inputX; + let s = c0 * (edgeX2 - edgeX) - c2 * (edgeY2 - edgeY); + if (Math.abs(s) > 1e-6) { + let ua = (c2 * (edgeY - inputY) - c0 * (edgeX - inputX)) / s; + output.push(edgeX + (edgeX2 - edgeX) * ua); + output.push(edgeY + (edgeY2 - edgeY) * ua); + } else { + output.push(edgeX); + output.push(edgeY); + } + } else if (side2) { + let c0 = inputY2 - inputY, c2 = inputX2 - inputX; + let s = c0 * (edgeX2 - edgeX) - c2 * (edgeY2 - edgeY); + if (Math.abs(s) > 1e-6) { + let ua = (c2 * (edgeY - inputY) - c0 * (edgeX - inputX)) / s; + output.push(edgeX + (edgeX2 - edgeX) * ua); + output.push(edgeY + (edgeY2 - edgeY) * ua); + } else { + output.push(edgeX); + output.push(edgeY); + } + output.push(inputX2); + output.push(inputY2); + } + clipped = true; + } + if (outputStart == output.length) { + originalOutput.length = 0; + return true; + } + output.push(output[0]); + output.push(output[1]); + if (i == clippingVerticesLast) + break; + let temp = output; + output = input; + output.length = 0; + input = temp; + } + if (originalOutput != output) { + originalOutput.length = 0; + for (let i = 0, n = output.length - 2; i < n; i++) + originalOutput[i] = output[i]; + } else + originalOutput.length = originalOutput.length - 2; + return clipped; + } + static makeClockwise(polygon) { + let vertices = polygon; + let verticeslength = polygon.length; + let area = vertices[verticeslength - 2] * vertices[1] - vertices[0] * vertices[verticeslength - 1], p1x = 0, p1y = 0, p2x = 0, p2y = 0; + for (let i = 0, n = verticeslength - 3; i < n; i += 2) { + p1x = vertices[i]; + p1y = vertices[i + 1]; + p2x = vertices[i + 2]; + p2y = vertices[i + 3]; + area += p1x * p2y - p2x * p1y; + } + if (area < 0) + return; + for (let i = 0, lastX = verticeslength - 2, n = verticeslength >> 1; i < n; i += 2) { + let x = vertices[i], y = vertices[i + 1]; + let other = lastX - i; + vertices[i] = vertices[other]; + vertices[i + 1] = vertices[other + 1]; + vertices[other] = x; + vertices[other + 1] = y; + } + } + }; + + // spine-core/src/SkeletonJson.ts + var SkeletonJson = class { + constructor(attachmentLoader) { + this.attachmentLoader = null; + this.scale = 1; + this.linkedMeshes = new Array(); + this.attachmentLoader = attachmentLoader; + } + readSkeletonData(json) { + let scale = this.scale; + let skeletonData = new SkeletonData(); + let root = typeof json === "string" ? JSON.parse(json) : json; + let skeletonMap = root.skeleton; + if (skeletonMap) { + skeletonData.hash = skeletonMap.hash; + skeletonData.version = skeletonMap.spine; + skeletonData.x = skeletonMap.x; + skeletonData.y = skeletonMap.y; + skeletonData.width = skeletonMap.width; + skeletonData.height = skeletonMap.height; + skeletonData.fps = skeletonMap.fps; + skeletonData.imagesPath = skeletonMap.images; + } + if (root.bones) { + for (let i = 0; i < root.bones.length; i++) { + let boneMap = root.bones[i]; + let parent = null; + let parentName = getValue(boneMap, "parent", null); + if (parentName) + parent = skeletonData.findBone(parentName); + let data = new BoneData(skeletonData.bones.length, boneMap.name, parent); + data.length = getValue(boneMap, "length", 0) * scale; + data.x = getValue(boneMap, "x", 0) * scale; + data.y = getValue(boneMap, "y", 0) * scale; + data.rotation = getValue(boneMap, "rotation", 0); + data.scaleX = getValue(boneMap, "scaleX", 1); + data.scaleY = getValue(boneMap, "scaleY", 1); + data.shearX = getValue(boneMap, "shearX", 0); + data.shearY = getValue(boneMap, "shearY", 0); + data.transformMode = Utils.enumValue(TransformMode, getValue(boneMap, "transform", "Normal")); + data.skinRequired = getValue(boneMap, "skin", false); + let color = getValue(boneMap, "color", null); + if (color) + data.color.setFromString(color); + skeletonData.bones.push(data); + } + } + if (root.slots) { + for (let i = 0; i < root.slots.length; i++) { + let slotMap = root.slots[i]; + let boneData = skeletonData.findBone(slotMap.bone); + let data = new SlotData(skeletonData.slots.length, slotMap.name, boneData); + let color = getValue(slotMap, "color", null); + if (color) + data.color.setFromString(color); + let dark = getValue(slotMap, "dark", null); + if (dark) + data.darkColor = Color.fromString(dark); + data.attachmentName = getValue(slotMap, "attachment", null); + data.blendMode = Utils.enumValue(BlendMode, getValue(slotMap, "blend", "normal")); + skeletonData.slots.push(data); + } + } + 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 = getValue(constraintMap, "order", 0); + data.skinRequired = getValue(constraintMap, "skin", false); + for (let ii = 0; ii < constraintMap.bones.length; ii++) + data.bones.push(skeletonData.findBone(constraintMap.bones[ii])); + data.target = skeletonData.findBone(constraintMap.target); + data.mix = getValue(constraintMap, "mix", 1); + data.softness = getValue(constraintMap, "softness", 0) * scale; + data.bendDirection = getValue(constraintMap, "bendPositive", true) ? 1 : -1; + data.compress = getValue(constraintMap, "compress", false); + data.stretch = getValue(constraintMap, "stretch", false); + data.uniform = getValue(constraintMap, "uniform", false); + skeletonData.ikConstraints.push(data); + } + } + 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 = getValue(constraintMap, "order", 0); + data.skinRequired = getValue(constraintMap, "skin", false); + for (let ii = 0; ii < constraintMap.bones.length; ii++) + data.bones.push(skeletonData.findBone(constraintMap.bones[ii])); + let targetName = constraintMap.target; + data.target = skeletonData.findBone(targetName); + data.local = getValue(constraintMap, "local", false); + data.relative = getValue(constraintMap, "relative", false); + data.offsetRotation = getValue(constraintMap, "rotation", 0); + data.offsetX = getValue(constraintMap, "x", 0) * scale; + data.offsetY = getValue(constraintMap, "y", 0) * scale; + data.offsetScaleX = getValue(constraintMap, "scaleX", 0); + data.offsetScaleY = getValue(constraintMap, "scaleY", 0); + data.offsetShearY = getValue(constraintMap, "shearY", 0); + data.mixRotate = getValue(constraintMap, "mixRotate", 1); + data.mixX = getValue(constraintMap, "mixX", 1); + data.mixY = getValue(constraintMap, "mixY", data.mixX); + data.mixScaleX = getValue(constraintMap, "mixScaleX", 1); + data.mixScaleY = getValue(constraintMap, "mixScaleY", data.mixScaleX); + data.mixShearY = getValue(constraintMap, "mixShearY", 1); + skeletonData.transformConstraints.push(data); + } + } + 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 = getValue(constraintMap, "order", 0); + data.skinRequired = getValue(constraintMap, "skin", false); + for (let ii = 0; ii < constraintMap.bones.length; ii++) + data.bones.push(skeletonData.findBone(constraintMap.bones[ii])); + let targetName = constraintMap.target; + data.target = skeletonData.findSlot(targetName); + data.positionMode = Utils.enumValue(PositionMode, getValue(constraintMap, "positionMode", "Percent")); + data.spacingMode = Utils.enumValue(SpacingMode, getValue(constraintMap, "spacingMode", "Length")); + data.rotateMode = Utils.enumValue(RotateMode, getValue(constraintMap, "rotateMode", "Tangent")); + data.offsetRotation = getValue(constraintMap, "rotation", 0); + data.position = getValue(constraintMap, "position", 0); + if (data.positionMode == PositionMode.Fixed) + data.position *= scale; + data.spacing = getValue(constraintMap, "spacing", 0); + if (data.spacingMode == SpacingMode.Length || data.spacingMode == SpacingMode.Fixed) + data.spacing *= scale; + data.mixRotate = getValue(constraintMap, "mixRotate", 1); + data.mixX = getValue(constraintMap, "mixX", 1); + data.mixY = getValue(constraintMap, "mixY", data.mixX); + skeletonData.pathConstraints.push(data); + } + } + 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++) + skin.bones.push(skeletonData.findBone(skinMap.bones[ii])); + } + if (skinMap.ik) { + for (let ii = 0; ii < skinMap.ik.length; ii++) + skin.constraints.push(skeletonData.findIkConstraint(skinMap.ik[ii])); + } + if (skinMap.transform) { + for (let ii = 0; ii < skinMap.transform.length; ii++) + skin.constraints.push(skeletonData.findTransformConstraint(skinMap.transform[ii])); + } + if (skinMap.path) { + for (let ii = 0; ii < skinMap.path.length; ii++) + skin.constraints.push(skeletonData.findPathConstraint(skinMap.path[ii])); + } + for (let slotName in skinMap.attachments) { + let slot = skeletonData.findSlot(slotName); + let slotMap = skinMap.attachments[slotName]; + for (let entryName in slotMap) { + let attachment = this.readAttachment(slotMap[entryName], skin, slot.index, entryName, skeletonData); + if (attachment) + skin.setAttachment(slot.index, entryName, attachment); + } + } + skeletonData.skins.push(skin); + if (skin.name == "default") + skeletonData.defaultSkin = skin; + } + } + for (let i = 0, n = this.linkedMeshes.length; i < n; i++) { + let linkedMesh = this.linkedMeshes[i]; + let skin = !linkedMesh.skin ? skeletonData.defaultSkin : skeletonData.findSkin(linkedMesh.skin); + let parent = skin.getAttachment(linkedMesh.slotIndex, linkedMesh.parent); + linkedMesh.mesh.deformAttachment = linkedMesh.inheritDeform ? parent : linkedMesh.mesh; + linkedMesh.mesh.setParentMesh(parent); + linkedMesh.mesh.updateUVs(); + } + this.linkedMeshes.length = 0; + if (root.events) { + for (let eventName in root.events) { + let eventMap = root.events[eventName]; + let data = new EventData(eventName); + data.intValue = getValue(eventMap, "int", 0); + data.floatValue = getValue(eventMap, "float", 0); + data.stringValue = getValue(eventMap, "string", ""); + data.audioPath = getValue(eventMap, "audio", null); + if (data.audioPath) { + data.volume = getValue(eventMap, "volume", 1); + data.balance = getValue(eventMap, "balance", 0); + } + skeletonData.events.push(data); + } + } + 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 = getValue(map, "name", name); + switch (getValue(map, "type", "region")) { + case "region": { + let path = getValue(map, "path", name); + let region = this.attachmentLoader.newRegionAttachment(skin, name, path); + if (!region) + return null; + region.path = path; + region.x = getValue(map, "x", 0) * scale; + region.y = getValue(map, "y", 0) * scale; + region.scaleX = getValue(map, "scaleX", 1); + region.scaleY = getValue(map, "scaleY", 1); + region.rotation = getValue(map, "rotation", 0); + region.width = map.width * scale; + region.height = map.height * scale; + let color = getValue(map, "color", null); + if (color) + region.color.setFromString(color); + region.updateOffset(); + return region; + } + case "boundingbox": { + let box = this.attachmentLoader.newBoundingBoxAttachment(skin, name); + if (!box) + return null; + this.readVertices(map, box, map.vertexCount << 1); + let color = getValue(map, "color", null); + if (color) + box.color.setFromString(color); + return box; + } + case "mesh": + case "linkedmesh": { + let path = getValue(map, "path", name); + let mesh = this.attachmentLoader.newMeshAttachment(skin, name, path); + if (!mesh) + return null; + mesh.path = path; + let color = getValue(map, "color", null); + if (color) + mesh.color.setFromString(color); + mesh.width = getValue(map, "width", 0) * scale; + mesh.height = getValue(map, "height", 0) * scale; + let parent = getValue(map, "parent", null); + if (parent) { + this.linkedMeshes.push(new LinkedMesh2(mesh, getValue(map, "skin", null), slotIndex, parent, getValue(map, "deform", true))); + return mesh; + } + let uvs = map.uvs; + this.readVertices(map, mesh, uvs.length); + mesh.triangles = map.triangles; + mesh.regionUVs = uvs; + mesh.updateUVs(); + mesh.edges = getValue(map, "edges", null); + mesh.hullLength = getValue(map, "hull", 0) * 2; + return mesh; + } + case "path": { + let path = this.attachmentLoader.newPathAttachment(skin, name); + if (!path) + return null; + path.closed = getValue(map, "closed", false); + path.constantSpeed = 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 = getValue(map, "color", null); + if (color) + path.color.setFromString(color); + return path; + } + case "point": { + let point = this.attachmentLoader.newPointAttachment(skin, name); + if (!point) + return null; + point.x = getValue(map, "x", 0) * scale; + point.y = getValue(map, "y", 0) * scale; + point.rotation = getValue(map, "rotation", 0); + let color = getValue(map, "color", null); + if (color) + point.color.setFromString(color); + return point; + } + case "clipping": { + let clip = this.attachmentLoader.newClippingAttachment(skin, name); + if (!clip) + return null; + let end = getValue(map, "end", null); + if (end) + clip.endSlot = skeletonData.findSlot(end); + let vertexCount = map.vertexCount; + this.readVertices(map, clip, vertexCount << 1); + let color = getValue(map, "color", null); + if (color) + 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(); + if (map.slots) { + for (let slotName in map.slots) { + let slotMap = map.slots[slotName]; + let slotIndex = skeletonData.findSlot(slotName).index; + for (let timelineName in slotMap) { + let timelineMap = slotMap[timelineName]; + if (!timelineMap) + continue; + let frames = timelineMap.length; + if (timelineName == "attachment") { + let timeline = new AttachmentTimeline(frames, slotIndex); + for (let frame = 0; frame < frames; frame++) { + let keyMap = timelineMap[frame]; + timeline.setFrame(frame, getValue(keyMap, "time", 0), keyMap.name); + } + timelines.push(timeline); + } else if (timelineName == "rgba") { + let timeline = new RGBATimeline(frames, frames << 2, slotIndex); + let keyMap = timelineMap[0]; + let time = getValue(keyMap, "time", 0); + let color = Color.fromString(keyMap.color); + for (let frame = 0, bezier = 0; ; frame++) { + timeline.setFrame(frame, time, color.r, color.g, color.b, color.a); + let nextMap = timelineMap[frame + 1]; + if (!nextMap) { + timeline.shrink(bezier); + break; + } + let time2 = getValue(nextMap, "time", 0); + let newColor = Color.fromString(nextMap.color); + let curve = keyMap.curve; + if (curve) { + bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, color.r, newColor.r, 1); + bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, color.g, newColor.g, 1); + bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, color.b, newColor.b, 1); + bezier = 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(frames, frames * 3, slotIndex); + let keyMap = timelineMap[0]; + let time = getValue(keyMap, "time", 0); + let color = Color.fromString(keyMap.color); + for (let frame = 0, bezier = 0; ; frame++) { + timeline.setFrame(frame, time, color.r, color.g, color.b); + let nextMap = timelineMap[frame + 1]; + if (!nextMap) { + timeline.shrink(bezier); + break; + } + let time2 = getValue(nextMap, "time", 0); + let newColor = Color.fromString(nextMap.color); + let curve = keyMap.curve; + if (curve) { + bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, color.r, newColor.r, 1); + bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, color.g, newColor.g, 1); + bezier = 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(readTimeline12(timelineMap, new AlphaTimeline(frames, frames, slotIndex), 0, 1)); + } else if (timelineName == "rgba2") { + let timeline = new RGBA2Timeline(frames, frames * 7, slotIndex); + let keyMap = timelineMap[0]; + let time = getValue(keyMap, "time", 0); + let color = Color.fromString(keyMap.light); + let color2 = Color.fromString(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); + let nextMap = timelineMap[frame + 1]; + if (!nextMap) { + timeline.shrink(bezier); + break; + } + let time2 = getValue(nextMap, "time", 0); + let newColor = Color.fromString(nextMap.light); + let newColor2 = Color.fromString(nextMap.dark); + let curve = keyMap.curve; + if (curve) { + bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, color.r, newColor.r, 1); + bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, color.g, newColor.g, 1); + bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, color.b, newColor.b, 1); + bezier = readCurve(curve, timeline, bezier, frame, 3, time, time2, color.a, newColor.a, 1); + bezier = readCurve(curve, timeline, bezier, frame, 4, time, time2, color2.r, newColor2.r, 1); + bezier = readCurve(curve, timeline, bezier, frame, 5, time, time2, color2.g, newColor2.g, 1); + bezier = 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(frames, frames * 6, slotIndex); + let keyMap = timelineMap[0]; + let time = getValue(keyMap, "time", 0); + let color = Color.fromString(keyMap.light); + let color2 = Color.fromString(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); + let nextMap = timelineMap[frame + 1]; + if (!nextMap) { + timeline.shrink(bezier); + break; + } + let time2 = getValue(nextMap, "time", 0); + let newColor = Color.fromString(nextMap.light); + let newColor2 = Color.fromString(nextMap.dark); + let curve = keyMap.curve; + if (curve) { + bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, color.r, newColor.r, 1); + bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, color.g, newColor.g, 1); + bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, color.b, newColor.b, 1); + bezier = readCurve(curve, timeline, bezier, frame, 3, time, time2, color2.r, newColor2.r, 1); + bezier = readCurve(curve, timeline, bezier, frame, 4, time, time2, color2.g, newColor2.g, 1); + bezier = readCurve(curve, timeline, bezier, frame, 5, time, time2, color2.b, newColor2.b, 1); + } + time = time2; + color = newColor; + color2 = newColor2; + keyMap = nextMap; + } + timelines.push(timeline); + } + } + } + } + if (map.bones) { + for (let boneName in map.bones) { + let boneMap = map.bones[boneName]; + let boneIndex = skeletonData.findBone(boneName).index; + for (let timelineName in boneMap) { + let timelineMap = boneMap[timelineName]; + let frames = timelineMap.length; + if (frames == 0) + continue; + if (timelineName === "rotate") { + timelines.push(readTimeline12(timelineMap, new RotateTimeline(frames, frames, boneIndex), 0, 1)); + } else if (timelineName === "translate") { + let timeline = new TranslateTimeline(frames, frames << 1, boneIndex); + timelines.push(readTimeline22(timelineMap, timeline, "x", "y", 0, scale)); + } else if (timelineName === "translatex") { + let timeline = new TranslateXTimeline(frames, frames, boneIndex); + timelines.push(readTimeline12(timelineMap, timeline, 0, scale)); + } else if (timelineName === "translatey") { + let timeline = new TranslateYTimeline(frames, frames, boneIndex); + timelines.push(readTimeline12(timelineMap, timeline, 0, scale)); + } else if (timelineName === "scale") { + let timeline = new ScaleTimeline(frames, frames << 1, boneIndex); + timelines.push(readTimeline22(timelineMap, timeline, "x", "y", 1, 1)); + } else if (timelineName === "scalex") { + let timeline = new ScaleXTimeline(frames, frames, boneIndex); + timelines.push(readTimeline12(timelineMap, timeline, 1, 1)); + } else if (timelineName === "scaley") { + let timeline = new ScaleYTimeline(frames, frames, boneIndex); + timelines.push(readTimeline12(timelineMap, timeline, 1, 1)); + } else if (timelineName === "shear") { + let timeline = new ShearTimeline(frames, frames << 1, boneIndex); + timelines.push(readTimeline22(timelineMap, timeline, "x", "y", 0, 1)); + } else if (timelineName === "shearx") { + let timeline = new ShearXTimeline(frames, frames, boneIndex); + timelines.push(readTimeline12(timelineMap, timeline, 0, 1)); + } else if (timelineName === "sheary") { + let timeline = new ShearYTimeline(frames, frames, boneIndex); + timelines.push(readTimeline12(timelineMap, timeline, 0, 1)); + } + } + } + } + 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(constraintMap.length, constraintMap.length << 1, constraintIndex); + let time = getValue(keyMap, "time", 0); + let mix = getValue(keyMap, "mix", 1); + let softness = getValue(keyMap, "softness", 0) * scale; + for (let frame = 0, bezier = 0; ; frame++) { + timeline.setFrame(frame, time, mix, softness, getValue(keyMap, "bendPositive", true) ? 1 : -1, getValue(keyMap, "compress", false), getValue(keyMap, "stretch", false)); + let nextMap = constraintMap[frame + 1]; + if (!nextMap) { + timeline.shrink(bezier); + break; + } + let time2 = getValue(nextMap, "time", 0); + let mix2 = getValue(nextMap, "mix", 1); + let softness2 = getValue(nextMap, "softness", 0) * scale; + let curve = keyMap.curve; + if (curve) { + bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, mix, mix2, 1); + bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, softness, softness2, scale); + } + time = time2; + mix = mix2; + softness = softness2; + keyMap = nextMap; + } + timelines.push(timeline); + } + } + 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(timelineMap.length, timelineMap.length * 6, constraintIndex); + let time = getValue(keyMap, "time", 0); + let mixRotate = getValue(keyMap, "mixRotate", 1); + let mixX = getValue(keyMap, "mixX", 1); + let mixY = getValue(keyMap, "mixY", mixX); + let mixScaleX = getValue(keyMap, "mixScaleX", 1); + let mixScaleY = getValue(keyMap, "mixScaleY", mixScaleX); + let mixShearY = getValue(keyMap, "mixShearY", 1); + for (let frame = 0, bezier = 0; ; frame++) { + timeline.setFrame(frame, time, mixRotate, mixX, mixY, mixScaleX, mixScaleY, mixShearY); + let nextMap = timelineMap[frame + 1]; + if (!nextMap) { + timeline.shrink(bezier); + break; + } + let time2 = getValue(nextMap, "time", 0); + let mixRotate2 = getValue(nextMap, "mixRotate", 1); + let mixX2 = getValue(nextMap, "mixX", 1); + let mixY2 = getValue(nextMap, "mixY", mixX2); + let mixScaleX2 = getValue(nextMap, "mixScaleX", 1); + let mixScaleY2 = getValue(nextMap, "mixScaleY", mixScaleX2); + let mixShearY2 = getValue(nextMap, "mixShearY", 1); + let curve = keyMap.curve; + if (curve) { + bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, mixRotate, mixRotate2, 1); + bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, mixX, mixX2, 1); + bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, mixY, mixY2, 1); + bezier = readCurve(curve, timeline, bezier, frame, 3, time, time2, mixScaleX, mixScaleX2, 1); + bezier = readCurve(curve, timeline, bezier, frame, 4, time, time2, mixScaleY, mixScaleY2, 1); + bezier = 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); + } + } + if (map.path) { + for (let constraintName in map.path) { + let constraintMap = map.path[constraintName]; + let constraint = skeletonData.findPathConstraint(constraintName); + let constraintIndex = skeletonData.pathConstraints.indexOf(constraint); + for (let timelineName in constraintMap) { + let timelineMap = constraintMap[timelineName]; + let keyMap = timelineMap[0]; + if (!keyMap) + continue; + let frames = timelineMap.length; + if (timelineName === "position") { + let timeline = new PathConstraintPositionTimeline(frames, frames, constraintIndex); + timelines.push(readTimeline12(timelineMap, timeline, 0, constraint.positionMode == PositionMode.Fixed ? scale : 1)); + } else if (timelineName === "spacing") { + let timeline = new PathConstraintSpacingTimeline(frames, frames, constraintIndex); + timelines.push(readTimeline12(timelineMap, timeline, 0, constraint.spacingMode == SpacingMode.Length || constraint.spacingMode == SpacingMode.Fixed ? scale : 1)); + } else if (timelineName === "mix") { + let timeline = new PathConstraintMixTimeline(frames, frames * 3, constraintIndex); + let time = getValue(keyMap, "time", 0); + let mixRotate = getValue(keyMap, "mixRotate", 1); + let mixX = getValue(keyMap, "mixX", 1); + let mixY = 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) { + timeline.shrink(bezier); + break; + } + let time2 = getValue(nextMap, "time", 0); + let mixRotate2 = getValue(nextMap, "mixRotate", 1); + let mixX2 = getValue(nextMap, "mixX", 1); + let mixY2 = getValue(nextMap, "mixY", mixX2); + let curve = keyMap.curve; + if (curve) { + bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, mixRotate, mixRotate2, 1); + bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, mixX, mixX2, 1); + bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, mixY, mixY2, 1); + } + time = time2; + mixRotate = mixRotate2; + mixX = mixX2; + mixY = mixY2; + keyMap = nextMap; + } + timelines.push(timeline); + } + } + } + } + if (map.deform) { + for (let deformName in map.deform) { + let deformMap = map.deform[deformName]; + let skin = skeletonData.findSkin(deformName); + for (let slotName in deformMap) { + let slotMap = deformMap[slotName]; + let slotIndex = skeletonData.findSlot(slotName).index; + for (let timelineName in slotMap) { + let timelineMap = slotMap[timelineName]; + let keyMap = timelineMap[0]; + if (!keyMap) + continue; + let attachment = skin.getAttachment(slotIndex, timelineName); + let weighted = attachment.bones; + let vertices = attachment.vertices; + let deformLength = weighted ? vertices.length / 3 * 2 : vertices.length; + let timeline = new DeformTimeline(timelineMap.length, timelineMap.length, slotIndex, attachment); + let time = getValue(keyMap, "time", 0); + for (let frame = 0, bezier = 0; ; frame++) { + let deform; + let verticesValue = getValue(keyMap, "vertices", null); + if (!verticesValue) + deform = weighted ? Utils.newFloatArray(deformLength) : vertices; + else { + deform = Utils.newFloatArray(deformLength); + let start = 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) { + timeline.shrink(bezier); + break; + } + let time2 = getValue(nextMap, "time", 0); + let curve = keyMap.curve; + if (curve) + bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, 0, 1, 1); + time = time2; + keyMap = nextMap; + } + timelines.push(timeline); + } + } + } + } + if (map.drawOrder) { + let timeline = new DrawOrderTimeline(map.drawOrder.length); + let slotCount = skeletonData.slots.length; + let frame = 0; + for (let i = 0; i < map.drawOrder.length; i++, frame++) { + let drawOrderMap = map.drawOrder[i]; + let drawOrder = null; + let offsets = getValue(drawOrderMap, "offsets", null); + if (offsets) { + drawOrder = Utils.newArray(slotCount, -1); + let unchanged = Utils.newArray(slotCount - offsets.length, 0); + let originalIndex = 0, unchangedIndex = 0; + for (let ii = 0; ii < offsets.length; ii++) { + let offsetMap = offsets[ii]; + let slotIndex = skeletonData.findSlot(offsetMap.slot).index; + while (originalIndex != slotIndex) + unchanged[unchangedIndex++] = originalIndex++; + drawOrder[originalIndex + offsetMap.offset] = originalIndex++; + } + while (originalIndex < slotCount) + unchanged[unchangedIndex++] = originalIndex++; + for (let ii = slotCount - 1; ii >= 0; ii--) + if (drawOrder[ii] == -1) + drawOrder[ii] = unchanged[--unchangedIndex]; + } + timeline.setFrame(frame, getValue(drawOrderMap, "time", 0), drawOrder); + } + timelines.push(timeline); + } + if (map.events) { + let timeline = new EventTimeline(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); + let event = new Event(Utils.toSinglePrecision(getValue(eventMap, "time", 0)), eventData); + event.intValue = getValue(eventMap, "int", eventData.intValue); + event.floatValue = getValue(eventMap, "float", eventData.floatValue); + event.stringValue = getValue(eventMap, "string", eventData.stringValue); + if (event.data.audioPath) { + event.volume = getValue(eventMap, "volume", 1); + event.balance = 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()); + skeletonData.animations.push(new Animation(name, timelines, duration)); + } + }; + var LinkedMesh2 = class { + constructor(mesh, skin, slotIndex, parent, inheritDeform) { + this.mesh = mesh; + this.skin = skin; + this.slotIndex = slotIndex; + this.parent = parent; + this.inheritDeform = inheritDeform; + } + }; + function readTimeline12(keys, timeline, defaultValue, scale) { + let keyMap = keys[0]; + let time = getValue(keyMap, "time", 0); + let value = 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) { + timeline.shrink(bezier); + return timeline; + } + let time2 = getValue(nextMap, "time", 0); + let value2 = getValue(nextMap, "value", defaultValue) * scale; + if (keyMap.curve) + bezier = readCurve(keyMap.curve, timeline, bezier, frame, 0, time, time2, value, value2, scale); + time = time2; + value = value2; + keyMap = nextMap; + } + } + function readTimeline22(keys, timeline, name1, name2, defaultValue, scale) { + let keyMap = keys[0]; + let time = getValue(keyMap, "time", 0); + let value1 = getValue(keyMap, name1, defaultValue) * scale; + let value2 = 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) { + timeline.shrink(bezier); + return timeline; + } + let time2 = getValue(nextMap, "time", 0); + let nvalue1 = getValue(nextMap, name1, defaultValue) * scale; + let nvalue2 = getValue(nextMap, name2, defaultValue) * scale; + let curve = keyMap.curve; + if (curve) { + bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, value1, nvalue1, scale); + bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, value2, nvalue2, scale); + } + time = time2; + value1 = nvalue1; + value2 = nvalue2; + keyMap = nextMap; + } + } + function readCurve(curve, timeline, bezier, frame, value, time1, time2, value1, value2, scale) { + if (curve == "stepped") { + timeline.setStepped(frame); + return bezier; + } + let i = value << 2; + let cx1 = curve[i]; + let cy1 = curve[i + 1] * scale; + let cx2 = curve[i + 2]; + let cy2 = curve[i + 3] * scale; + timeline.setBezier(bezier, frame, value, time1, value1, cx1, cy1, cx2, cy2, time2, value2); + return bezier + 1; + } + function getValue(map, property, defaultValue) { + return map[property] !== void 0 ? map[property] : defaultValue; + } + + // spine-core/src/polyfills.ts + (() => { + if (typeof Math.fround === "undefined") { + Math.fround = function(array) { + return function(x) { + return array[0] = x, array[0]; + }; + }(new Float32Array(1)); + } + })(); + + // spine-core/src/vertexeffects/JitterEffect.ts + var JitterEffect = class { + constructor(jitterX, jitterY) { + this.jitterX = 0; + this.jitterY = 0; + 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() { + } + }; + + // spine-core/src/vertexeffects/SwirlEffect.ts + var _SwirlEffect = class { + constructor(radius) { + this.centerX = 0; + this.centerY = 0; + this.radius = 0; + this.angle = 0; + this.worldX = 0; + this.worldY = 0; + 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() { + } + }; + var SwirlEffect = _SwirlEffect; + SwirlEffect.interpolation = new PowOut(2); + + // spine-webgl/src/WebGL.ts + var ManagedWebGLRenderingContext = class { + constructor(canvasOrContext, contextConfig = { alpha: "true" }) { + this.restorables = new Array(); + if (!(canvasOrContext instanceof WebGLRenderingContext || typeof WebGL2RenderingContext !== "undefined" && canvasOrContext instanceof WebGL2RenderingContext)) + this.setupCanvas(canvasOrContext, contextConfig); + else { + this.gl = canvasOrContext; + this.canvas = this.gl.canvas; + } + } + setupCanvas(canvas, contextConfig) { + this.gl = canvas.getContext("webgl2", contextConfig) || canvas.getContext("webgl", contextConfig); + this.canvas = canvas; + canvas.addEventListener("webglcontextlost", (e) => { + let event = e; + if (e) + e.preventDefault(); + }); + canvas.addEventListener("webglcontextrestored", (e) => { + for (let i = 0, n = this.restorables.length; i < n; i++) + this.restorables[i].restore(); + }); + } + addRestorable(restorable) { + this.restorables.push(restorable); + } + removeRestorable(restorable) { + let index = this.restorables.indexOf(restorable); + if (index > -1) + this.restorables.splice(index, 1); + } + }; + var ONE = 1; + var ONE_MINUS_SRC_COLOR = 769; + var SRC_ALPHA = 770; + var ONE_MINUS_SRC_ALPHA = 771; + var DST_COLOR = 774; + var WebGLBlendModeConverter = class { + static getDestGLBlendMode(blendMode) { + switch (blendMode) { + case BlendMode.Normal: + return ONE_MINUS_SRC_ALPHA; + case BlendMode.Additive: + return ONE; + case BlendMode.Multiply: + return ONE_MINUS_SRC_ALPHA; + case BlendMode.Screen: + return ONE_MINUS_SRC_ALPHA; + default: + throw new Error("Unknown blend mode: " + blendMode); + } + } + static getSourceColorGLBlendMode(blendMode, premultipliedAlpha = false) { + switch (blendMode) { + case BlendMode.Normal: + return premultipliedAlpha ? ONE : SRC_ALPHA; + case BlendMode.Additive: + return premultipliedAlpha ? ONE : SRC_ALPHA; + case BlendMode.Multiply: + return DST_COLOR; + case BlendMode.Screen: + return ONE; + default: + throw new Error("Unknown blend mode: " + blendMode); + } + } + static getSourceAlphaGLBlendMode(blendMode) { + switch (blendMode) { + case BlendMode.Normal: + return ONE; + case BlendMode.Additive: + return ONE; + case BlendMode.Multiply: + return ONE_MINUS_SRC_ALPHA; + case BlendMode.Screen: + return ONE_MINUS_SRC_COLOR; + default: + throw new Error("Unknown blend mode: " + blendMode); + } + } + }; + + // spine-webgl/src/GLTexture.ts + var _GLTexture = class extends Texture { + constructor(context, image, useMipMaps = false) { + super(image); + this.texture = null; + this.boundUnit = 0; + this.useMipMaps = false; + this.context = context instanceof ManagedWebGLRenderingContext ? context : new ManagedWebGLRenderingContext(context); + this.useMipMaps = useMipMaps; + this.restore(); + this.context.addRestorable(this); + } + setFilters(minFilter, magFilter) { + let gl = this.context.gl; + this.bind(); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, minFilter); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, _GLTexture.validateMagFilter(magFilter)); + } + static validateMagFilter(magFilter) { + switch (magFilter) { + case TextureFilter.MipMap: + case TextureFilter.MipMapLinearLinear: + case TextureFilter.MipMapLinearNearest: + case TextureFilter.MipMapNearestLinear: + case TextureFilter.MipMapNearestNearest: + return TextureFilter.Linear; + default: + return magFilter; + } + } + setWraps(uWrap, vWrap) { + let gl = this.context.gl; + this.bind(); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, uWrap); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, vWrap); + } + update(useMipMaps) { + let gl = this.context.gl; + if (!this.texture) + this.texture = this.context.gl.createTexture(); + this.bind(); + if (_GLTexture.DISABLE_UNPACK_PREMULTIPLIED_ALPHA_WEBGL) + gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, this._image); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, useMipMaps ? gl.LINEAR_MIPMAP_LINEAR : gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + if (useMipMaps) + gl.generateMipmap(gl.TEXTURE_2D); + } + restore() { + this.texture = null; + this.update(this.useMipMaps); + } + bind(unit = 0) { + let gl = this.context.gl; + this.boundUnit = unit; + gl.activeTexture(gl.TEXTURE0 + unit); + gl.bindTexture(gl.TEXTURE_2D, this.texture); + } + unbind() { + let gl = this.context.gl; + gl.activeTexture(gl.TEXTURE0 + this.boundUnit); + gl.bindTexture(gl.TEXTURE_2D, null); + } + dispose() { + this.context.removeRestorable(this); + let gl = this.context.gl; + gl.deleteTexture(this.texture); + } + }; + var GLTexture = _GLTexture; + GLTexture.DISABLE_UNPACK_PREMULTIPLIED_ALPHA_WEBGL = false; + + // spine-webgl/src/AssetManager.ts + var AssetManager = class extends AssetManagerBase { + constructor(context, pathPrefix = "", downloader = null) { + super((image) => { + return new GLTexture(context, image); + }, pathPrefix, downloader); + } + }; + + // spine-webgl/src/Vector3.ts + var Vector3 = class { + constructor(x = 0, y = 0, z = 0) { + this.x = 0; + this.y = 0; + this.z = 0; + this.x = x; + this.y = y; + this.z = z; + } + setFrom(v) { + this.x = v.x; + this.y = v.y; + this.z = v.z; + return this; + } + set(x, y, z) { + this.x = x; + this.y = y; + this.z = z; + return this; + } + add(v) { + this.x += v.x; + this.y += v.y; + this.z += v.z; + return this; + } + sub(v) { + this.x -= v.x; + this.y -= v.y; + this.z -= v.z; + return this; + } + scale(s) { + this.x *= s; + this.y *= s; + this.z *= s; + return this; + } + normalize() { + let len = this.length(); + if (len == 0) + return this; + len = 1 / len; + this.x *= len; + this.y *= len; + this.z *= len; + return this; + } + cross(v) { + return this.set(this.y * v.z - this.z * v.y, this.z * v.x - this.x * v.z, this.x * v.y - this.y * v.x); + } + multiply(matrix) { + let l_mat = matrix.values; + return this.set(this.x * l_mat[M00] + this.y * l_mat[M01] + this.z * l_mat[M02] + l_mat[M03], this.x * l_mat[M10] + this.y * l_mat[M11] + this.z * l_mat[M12] + l_mat[M13], this.x * l_mat[M20] + this.y * l_mat[M21] + this.z * l_mat[M22] + l_mat[M23]); + } + project(matrix) { + let l_mat = matrix.values; + let l_w = 1 / (this.x * l_mat[M30] + this.y * l_mat[M31] + this.z * l_mat[M32] + l_mat[M33]); + return this.set((this.x * l_mat[M00] + this.y * l_mat[M01] + this.z * l_mat[M02] + l_mat[M03]) * l_w, (this.x * l_mat[M10] + this.y * l_mat[M11] + this.z * l_mat[M12] + l_mat[M13]) * l_w, (this.x * l_mat[M20] + this.y * l_mat[M21] + this.z * l_mat[M22] + l_mat[M23]) * l_w); + } + dot(v) { + return this.x * v.x + this.y * v.y + this.z * v.z; + } + length() { + return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z); + } + distance(v) { + let a = v.x - this.x; + let b = v.y - this.y; + let c = v.z - this.z; + return Math.sqrt(a * a + b * b + c * c); + } + }; + + // spine-webgl/src/Matrix4.ts + var M00 = 0; + var M01 = 4; + var M02 = 8; + var M03 = 12; + var M10 = 1; + var M11 = 5; + var M12 = 9; + var M13 = 13; + var M20 = 2; + var M21 = 6; + var M22 = 10; + var M23 = 14; + var M30 = 3; + var M31 = 7; + var M32 = 11; + var M33 = 15; + var _Matrix4 = class { + constructor() { + this.temp = new Float32Array(16); + this.values = new Float32Array(16); + let v = this.values; + v[M00] = 1; + v[M11] = 1; + v[M22] = 1; + v[M33] = 1; + } + set(values) { + this.values.set(values); + return this; + } + transpose() { + let t = this.temp; + let v = this.values; + t[M00] = v[M00]; + t[M01] = v[M10]; + t[M02] = v[M20]; + t[M03] = v[M30]; + t[M10] = v[M01]; + t[M11] = v[M11]; + t[M12] = v[M21]; + t[M13] = v[M31]; + t[M20] = v[M02]; + t[M21] = v[M12]; + t[M22] = v[M22]; + t[M23] = v[M32]; + t[M30] = v[M03]; + t[M31] = v[M13]; + t[M32] = v[M23]; + t[M33] = v[M33]; + return this.set(t); + } + identity() { + let v = this.values; + v[M00] = 1; + v[M01] = 0; + v[M02] = 0; + v[M03] = 0; + v[M10] = 0; + v[M11] = 1; + v[M12] = 0; + v[M13] = 0; + v[M20] = 0; + v[M21] = 0; + v[M22] = 1; + v[M23] = 0; + v[M30] = 0; + v[M31] = 0; + v[M32] = 0; + v[M33] = 1; + return this; + } + invert() { + let v = this.values; + let t = this.temp; + let l_det = v[M30] * v[M21] * v[M12] * v[M03] - v[M20] * v[M31] * v[M12] * v[M03] - v[M30] * v[M11] * v[M22] * v[M03] + v[M10] * v[M31] * v[M22] * v[M03] + v[M20] * v[M11] * v[M32] * v[M03] - v[M10] * v[M21] * v[M32] * v[M03] - v[M30] * v[M21] * v[M02] * v[M13] + v[M20] * v[M31] * v[M02] * v[M13] + v[M30] * v[M01] * v[M22] * v[M13] - v[M00] * v[M31] * v[M22] * v[M13] - v[M20] * v[M01] * v[M32] * v[M13] + v[M00] * v[M21] * v[M32] * v[M13] + v[M30] * v[M11] * v[M02] * v[M23] - v[M10] * v[M31] * v[M02] * v[M23] - v[M30] * v[M01] * v[M12] * v[M23] + v[M00] * v[M31] * v[M12] * v[M23] + v[M10] * v[M01] * v[M32] * v[M23] - v[M00] * v[M11] * v[M32] * v[M23] - v[M20] * v[M11] * v[M02] * v[M33] + v[M10] * v[M21] * v[M02] * v[M33] + v[M20] * v[M01] * v[M12] * v[M33] - v[M00] * v[M21] * v[M12] * v[M33] - v[M10] * v[M01] * v[M22] * v[M33] + v[M00] * v[M11] * v[M22] * v[M33]; + if (l_det == 0) + throw new Error("non-invertible matrix"); + let inv_det = 1 / l_det; + t[M00] = v[M12] * v[M23] * v[M31] - v[M13] * v[M22] * v[M31] + v[M13] * v[M21] * v[M32] - v[M11] * v[M23] * v[M32] - v[M12] * v[M21] * v[M33] + v[M11] * v[M22] * v[M33]; + t[M01] = v[M03] * v[M22] * v[M31] - v[M02] * v[M23] * v[M31] - v[M03] * v[M21] * v[M32] + v[M01] * v[M23] * v[M32] + v[M02] * v[M21] * v[M33] - v[M01] * v[M22] * v[M33]; + t[M02] = v[M02] * v[M13] * v[M31] - v[M03] * v[M12] * v[M31] + v[M03] * v[M11] * v[M32] - v[M01] * v[M13] * v[M32] - v[M02] * v[M11] * v[M33] + v[M01] * v[M12] * v[M33]; + t[M03] = v[M03] * v[M12] * v[M21] - v[M02] * v[M13] * v[M21] - v[M03] * v[M11] * v[M22] + v[M01] * v[M13] * v[M22] + v[M02] * v[M11] * v[M23] - v[M01] * v[M12] * v[M23]; + t[M10] = v[M13] * v[M22] * v[M30] - v[M12] * v[M23] * v[M30] - v[M13] * v[M20] * v[M32] + v[M10] * v[M23] * v[M32] + v[M12] * v[M20] * v[M33] - v[M10] * v[M22] * v[M33]; + t[M11] = v[M02] * v[M23] * v[M30] - v[M03] * v[M22] * v[M30] + v[M03] * v[M20] * v[M32] - v[M00] * v[M23] * v[M32] - v[M02] * v[M20] * v[M33] + v[M00] * v[M22] * v[M33]; + t[M12] = v[M03] * v[M12] * v[M30] - v[M02] * v[M13] * v[M30] - v[M03] * v[M10] * v[M32] + v[M00] * v[M13] * v[M32] + v[M02] * v[M10] * v[M33] - v[M00] * v[M12] * v[M33]; + t[M13] = v[M02] * v[M13] * v[M20] - v[M03] * v[M12] * v[M20] + v[M03] * v[M10] * v[M22] - v[M00] * v[M13] * v[M22] - v[M02] * v[M10] * v[M23] + v[M00] * v[M12] * v[M23]; + t[M20] = v[M11] * v[M23] * v[M30] - v[M13] * v[M21] * v[M30] + v[M13] * v[M20] * v[M31] - v[M10] * v[M23] * v[M31] - v[M11] * v[M20] * v[M33] + v[M10] * v[M21] * v[M33]; + t[M21] = v[M03] * v[M21] * v[M30] - v[M01] * v[M23] * v[M30] - v[M03] * v[M20] * v[M31] + v[M00] * v[M23] * v[M31] + v[M01] * v[M20] * v[M33] - v[M00] * v[M21] * v[M33]; + t[M22] = v[M01] * v[M13] * v[M30] - v[M03] * v[M11] * v[M30] + v[M03] * v[M10] * v[M31] - v[M00] * v[M13] * v[M31] - v[M01] * v[M10] * v[M33] + v[M00] * v[M11] * v[M33]; + t[M23] = v[M03] * v[M11] * v[M20] - v[M01] * v[M13] * v[M20] - v[M03] * v[M10] * v[M21] + v[M00] * v[M13] * v[M21] + v[M01] * v[M10] * v[M23] - v[M00] * v[M11] * v[M23]; + t[M30] = v[M12] * v[M21] * v[M30] - v[M11] * v[M22] * v[M30] - v[M12] * v[M20] * v[M31] + v[M10] * v[M22] * v[M31] + v[M11] * v[M20] * v[M32] - v[M10] * v[M21] * v[M32]; + t[M31] = v[M01] * v[M22] * v[M30] - v[M02] * v[M21] * v[M30] + v[M02] * v[M20] * v[M31] - v[M00] * v[M22] * v[M31] - v[M01] * v[M20] * v[M32] + v[M00] * v[M21] * v[M32]; + t[M32] = v[M02] * v[M11] * v[M30] - v[M01] * v[M12] * v[M30] - v[M02] * v[M10] * v[M31] + v[M00] * v[M12] * v[M31] + v[M01] * v[M10] * v[M32] - v[M00] * v[M11] * v[M32]; + t[M33] = v[M01] * v[M12] * v[M20] - v[M02] * v[M11] * v[M20] + v[M02] * v[M10] * v[M21] - v[M00] * v[M12] * v[M21] - v[M01] * v[M10] * v[M22] + v[M00] * v[M11] * v[M22]; + v[M00] = t[M00] * inv_det; + v[M01] = t[M01] * inv_det; + v[M02] = t[M02] * inv_det; + v[M03] = t[M03] * inv_det; + v[M10] = t[M10] * inv_det; + v[M11] = t[M11] * inv_det; + v[M12] = t[M12] * inv_det; + v[M13] = t[M13] * inv_det; + v[M20] = t[M20] * inv_det; + v[M21] = t[M21] * inv_det; + v[M22] = t[M22] * inv_det; + v[M23] = t[M23] * inv_det; + v[M30] = t[M30] * inv_det; + v[M31] = t[M31] * inv_det; + v[M32] = t[M32] * inv_det; + v[M33] = t[M33] * inv_det; + return this; + } + determinant() { + let v = this.values; + return v[M30] * v[M21] * v[M12] * v[M03] - v[M20] * v[M31] * v[M12] * v[M03] - v[M30] * v[M11] * v[M22] * v[M03] + v[M10] * v[M31] * v[M22] * v[M03] + v[M20] * v[M11] * v[M32] * v[M03] - v[M10] * v[M21] * v[M32] * v[M03] - v[M30] * v[M21] * v[M02] * v[M13] + v[M20] * v[M31] * v[M02] * v[M13] + v[M30] * v[M01] * v[M22] * v[M13] - v[M00] * v[M31] * v[M22] * v[M13] - v[M20] * v[M01] * v[M32] * v[M13] + v[M00] * v[M21] * v[M32] * v[M13] + v[M30] * v[M11] * v[M02] * v[M23] - v[M10] * v[M31] * v[M02] * v[M23] - v[M30] * v[M01] * v[M12] * v[M23] + v[M00] * v[M31] * v[M12] * v[M23] + v[M10] * v[M01] * v[M32] * v[M23] - v[M00] * v[M11] * v[M32] * v[M23] - v[M20] * v[M11] * v[M02] * v[M33] + v[M10] * v[M21] * v[M02] * v[M33] + v[M20] * v[M01] * v[M12] * v[M33] - v[M00] * v[M21] * v[M12] * v[M33] - v[M10] * v[M01] * v[M22] * v[M33] + v[M00] * v[M11] * v[M22] * v[M33]; + } + translate(x, y, z) { + let v = this.values; + v[M03] += x; + v[M13] += y; + v[M23] += z; + return this; + } + copy() { + return new _Matrix4().set(this.values); + } + projection(near, far, fovy, aspectRatio) { + this.identity(); + let l_fd = 1 / Math.tan(fovy * (Math.PI / 180) / 2); + let l_a1 = (far + near) / (near - far); + let l_a2 = 2 * far * near / (near - far); + let v = this.values; + v[M00] = l_fd / aspectRatio; + v[M10] = 0; + v[M20] = 0; + v[M30] = 0; + v[M01] = 0; + v[M11] = l_fd; + v[M21] = 0; + v[M31] = 0; + v[M02] = 0; + v[M12] = 0; + v[M22] = l_a1; + v[M32] = -1; + v[M03] = 0; + v[M13] = 0; + v[M23] = l_a2; + v[M33] = 0; + return this; + } + ortho2d(x, y, width, height) { + return this.ortho(x, x + width, y, y + height, 0, 1); + } + ortho(left, right, bottom, top, near, far) { + this.identity(); + let x_orth = 2 / (right - left); + let y_orth = 2 / (top - bottom); + let z_orth = -2 / (far - near); + let tx = -(right + left) / (right - left); + let ty = -(top + bottom) / (top - bottom); + let tz = -(far + near) / (far - near); + let v = this.values; + v[M00] = x_orth; + v[M10] = 0; + v[M20] = 0; + v[M30] = 0; + v[M01] = 0; + v[M11] = y_orth; + v[M21] = 0; + v[M31] = 0; + v[M02] = 0; + v[M12] = 0; + v[M22] = z_orth; + v[M32] = 0; + v[M03] = tx; + v[M13] = ty; + v[M23] = tz; + v[M33] = 1; + return this; + } + multiply(matrix) { + let t = this.temp; + let v = this.values; + let m = matrix.values; + t[M00] = v[M00] * m[M00] + v[M01] * m[M10] + v[M02] * m[M20] + v[M03] * m[M30]; + t[M01] = v[M00] * m[M01] + v[M01] * m[M11] + v[M02] * m[M21] + v[M03] * m[M31]; + t[M02] = v[M00] * m[M02] + v[M01] * m[M12] + v[M02] * m[M22] + v[M03] * m[M32]; + t[M03] = v[M00] * m[M03] + v[M01] * m[M13] + v[M02] * m[M23] + v[M03] * m[M33]; + t[M10] = v[M10] * m[M00] + v[M11] * m[M10] + v[M12] * m[M20] + v[M13] * m[M30]; + t[M11] = v[M10] * m[M01] + v[M11] * m[M11] + v[M12] * m[M21] + v[M13] * m[M31]; + t[M12] = v[M10] * m[M02] + v[M11] * m[M12] + v[M12] * m[M22] + v[M13] * m[M32]; + t[M13] = v[M10] * m[M03] + v[M11] * m[M13] + v[M12] * m[M23] + v[M13] * m[M33]; + t[M20] = v[M20] * m[M00] + v[M21] * m[M10] + v[M22] * m[M20] + v[M23] * m[M30]; + t[M21] = v[M20] * m[M01] + v[M21] * m[M11] + v[M22] * m[M21] + v[M23] * m[M31]; + t[M22] = v[M20] * m[M02] + v[M21] * m[M12] + v[M22] * m[M22] + v[M23] * m[M32]; + t[M23] = v[M20] * m[M03] + v[M21] * m[M13] + v[M22] * m[M23] + v[M23] * m[M33]; + t[M30] = v[M30] * m[M00] + v[M31] * m[M10] + v[M32] * m[M20] + v[M33] * m[M30]; + t[M31] = v[M30] * m[M01] + v[M31] * m[M11] + v[M32] * m[M21] + v[M33] * m[M31]; + t[M32] = v[M30] * m[M02] + v[M31] * m[M12] + v[M32] * m[M22] + v[M33] * m[M32]; + t[M33] = v[M30] * m[M03] + v[M31] * m[M13] + v[M32] * m[M23] + v[M33] * m[M33]; + return this.set(this.temp); + } + multiplyLeft(matrix) { + let t = this.temp; + let v = this.values; + let m = matrix.values; + t[M00] = m[M00] * v[M00] + m[M01] * v[M10] + m[M02] * v[M20] + m[M03] * v[M30]; + t[M01] = m[M00] * v[M01] + m[M01] * v[M11] + m[M02] * v[M21] + m[M03] * v[M31]; + t[M02] = m[M00] * v[M02] + m[M01] * v[M12] + m[M02] * v[M22] + m[M03] * v[M32]; + t[M03] = m[M00] * v[M03] + m[M01] * v[M13] + m[M02] * v[M23] + m[M03] * v[M33]; + t[M10] = m[M10] * v[M00] + m[M11] * v[M10] + m[M12] * v[M20] + m[M13] * v[M30]; + t[M11] = m[M10] * v[M01] + m[M11] * v[M11] + m[M12] * v[M21] + m[M13] * v[M31]; + t[M12] = m[M10] * v[M02] + m[M11] * v[M12] + m[M12] * v[M22] + m[M13] * v[M32]; + t[M13] = m[M10] * v[M03] + m[M11] * v[M13] + m[M12] * v[M23] + m[M13] * v[M33]; + t[M20] = m[M20] * v[M00] + m[M21] * v[M10] + m[M22] * v[M20] + m[M23] * v[M30]; + t[M21] = m[M20] * v[M01] + m[M21] * v[M11] + m[M22] * v[M21] + m[M23] * v[M31]; + t[M22] = m[M20] * v[M02] + m[M21] * v[M12] + m[M22] * v[M22] + m[M23] * v[M32]; + t[M23] = m[M20] * v[M03] + m[M21] * v[M13] + m[M22] * v[M23] + m[M23] * v[M33]; + t[M30] = m[M30] * v[M00] + m[M31] * v[M10] + m[M32] * v[M20] + m[M33] * v[M30]; + t[M31] = m[M30] * v[M01] + m[M31] * v[M11] + m[M32] * v[M21] + m[M33] * v[M31]; + t[M32] = m[M30] * v[M02] + m[M31] * v[M12] + m[M32] * v[M22] + m[M33] * v[M32]; + t[M33] = m[M30] * v[M03] + m[M31] * v[M13] + m[M32] * v[M23] + m[M33] * v[M33]; + return this.set(this.temp); + } + lookAt(position, direction, up) { + _Matrix4.initTemps(); + let xAxis = _Matrix4.xAxis, yAxis = _Matrix4.yAxis, zAxis = _Matrix4.zAxis; + zAxis.setFrom(direction).normalize(); + xAxis.setFrom(direction).normalize(); + xAxis.cross(up).normalize(); + yAxis.setFrom(xAxis).cross(zAxis).normalize(); + this.identity(); + let val = this.values; + val[M00] = xAxis.x; + val[M01] = xAxis.y; + val[M02] = xAxis.z; + val[M10] = yAxis.x; + val[M11] = yAxis.y; + val[M12] = yAxis.z; + val[M20] = -zAxis.x; + val[M21] = -zAxis.y; + val[M22] = -zAxis.z; + _Matrix4.tmpMatrix.identity(); + _Matrix4.tmpMatrix.values[M03] = -position.x; + _Matrix4.tmpMatrix.values[M13] = -position.y; + _Matrix4.tmpMatrix.values[M23] = -position.z; + this.multiply(_Matrix4.tmpMatrix); + return this; + } + static initTemps() { + if (_Matrix4.xAxis === null) + _Matrix4.xAxis = new Vector3(); + if (_Matrix4.yAxis === null) + _Matrix4.yAxis = new Vector3(); + if (_Matrix4.zAxis === null) + _Matrix4.zAxis = new Vector3(); + } + }; + var Matrix42 = _Matrix4; + Matrix42.xAxis = null; + Matrix42.yAxis = null; + Matrix42.zAxis = null; + Matrix42.tmpMatrix = new _Matrix4(); + + // spine-webgl/src/Camera.ts + var OrthoCamera = class { + constructor(viewportWidth, viewportHeight) { + this.position = new Vector3(0, 0, 0); + this.direction = new Vector3(0, 0, -1); + this.up = new Vector3(0, 1, 0); + this.near = 0; + this.far = 100; + this.zoom = 1; + this.viewportWidth = 0; + this.viewportHeight = 0; + this.projectionView = new Matrix42(); + this.inverseProjectionView = new Matrix42(); + this.projection = new Matrix42(); + this.view = new Matrix42(); + this.viewportWidth = viewportWidth; + this.viewportHeight = viewportHeight; + this.update(); + } + update() { + let projection = this.projection; + let view = this.view; + let projectionView = this.projectionView; + let inverseProjectionView = this.inverseProjectionView; + let zoom = this.zoom, viewportWidth = this.viewportWidth, viewportHeight = this.viewportHeight; + projection.ortho(zoom * (-viewportWidth / 2), zoom * (viewportWidth / 2), zoom * (-viewportHeight / 2), zoom * (viewportHeight / 2), this.near, this.far); + view.lookAt(this.position, this.direction, this.up); + projectionView.set(projection.values); + projectionView.multiply(view); + inverseProjectionView.set(projectionView.values).invert(); + } + screenToWorld(screenCoords, screenWidth, screenHeight) { + let x = screenCoords.x, y = screenHeight - screenCoords.y - 1; + screenCoords.x = 2 * x / screenWidth - 1; + screenCoords.y = 2 * y / screenHeight - 1; + screenCoords.z = 2 * screenCoords.z - 1; + screenCoords.project(this.inverseProjectionView); + return screenCoords; + } + worldToScreen(worldCoords, screenWidth, screenHeight) { + worldCoords.project(this.projectionView); + worldCoords.x = screenWidth * (worldCoords.x + 1) / 2; + worldCoords.y = screenHeight * (worldCoords.y + 1) / 2; + worldCoords.z = (worldCoords.z + 1) / 2; + return worldCoords; + } + setViewport(viewportWidth, viewportHeight) { + this.viewportWidth = viewportWidth; + this.viewportHeight = viewportHeight; + } + }; + + // spine-webgl/src/Input.ts + var Input = class { + constructor(element) { + this.mouseX = 0; + this.mouseY = 0; + this.buttonDown = false; + this.touch0 = null; + this.touch1 = null; + this.initialPinchDistance = 0; + this.listeners = new Array(); + this.element = element; + this.setupCallbacks(element); + } + setupCallbacks(element) { + let mouseDown = (ev) => { + if (ev instanceof MouseEvent) { + let rect = element.getBoundingClientRect(); + this.mouseX = ev.clientX - rect.left; + ; + this.mouseY = ev.clientY - rect.top; + this.buttonDown = true; + this.listeners.map((listener) => { + if (listener.down) + listener.down(this.mouseX, this.mouseY); + }); + document.addEventListener("mousemove", mouseMove); + document.addEventListener("mouseup", mouseUp); + } + }; + let mouseMove = (ev) => { + if (ev instanceof MouseEvent) { + let rect = element.getBoundingClientRect(); + this.mouseX = ev.clientX - rect.left; + ; + this.mouseY = ev.clientY - rect.top; + this.listeners.map((listener) => { + if (this.buttonDown) { + if (listener.dragged) + listener.dragged(this.mouseX, this.mouseY); + } else { + if (listener.moved) + listener.moved(this.mouseX, this.mouseY); + } + }); + } + }; + let mouseUp = (ev) => { + if (ev instanceof MouseEvent) { + let rect = element.getBoundingClientRect(); + this.mouseX = ev.clientX - rect.left; + ; + this.mouseY = ev.clientY - rect.top; + this.buttonDown = false; + this.listeners.map((listener) => { + if (listener.up) + listener.up(this.mouseX, this.mouseY); + }); + document.removeEventListener("mousemove", mouseMove); + document.removeEventListener("mouseup", mouseUp); + } + }; + let mouseWheel = (e) => { + e.preventDefault(); + let deltaY = e.deltaY; + if (e.deltaMode == WheelEvent.DOM_DELTA_LINE) + deltaY *= 8; + if (e.deltaMode == WheelEvent.DOM_DELTA_PAGE) + deltaY *= 24; + this.listeners.map((listener) => { + if (listener.wheel) + listener.wheel(e.deltaY); + }); + }; + element.addEventListener("mousedown", mouseDown, true); + element.addEventListener("mousemove", mouseMove, true); + element.addEventListener("mouseup", mouseUp, true); + element.addEventListener("wheel", mouseWheel, true); + element.addEventListener("touchstart", (ev) => { + if (!this.touch0 || !this.touch1) { + var touches = ev.changedTouches; + let nativeTouch = touches.item(0); + let rect = element.getBoundingClientRect(); + let x = nativeTouch.clientX - rect.left; + let y = nativeTouch.clientY - rect.top; + let touch = new Touch(nativeTouch.identifier, x, y); + this.mouseX = x; + this.mouseY = y; + this.buttonDown = true; + if (!this.touch0) { + this.touch0 = touch; + this.listeners.map((listener) => { + if (listener.down) + listener.down(touch.x, touch.y); + }); + } else if (!this.touch1) { + this.touch1 = touch; + let dx = this.touch1.x - this.touch0.x; + let dy = this.touch1.x - this.touch0.x; + this.initialPinchDistance = Math.sqrt(dx * dx + dy * dy); + this.listeners.map((listener) => { + if (listener.zoom) + listener.zoom(this.initialPinchDistance, this.initialPinchDistance); + }); + } + } + ev.preventDefault(); + }, false); + element.addEventListener("touchmove", (ev) => { + if (this.touch0) { + var touches = ev.changedTouches; + let rect = element.getBoundingClientRect(); + for (var i = 0; i < touches.length; i++) { + var nativeTouch = touches[i]; + let x = nativeTouch.clientX - rect.left; + let y = nativeTouch.clientY - rect.top; + if (this.touch0.identifier === nativeTouch.identifier) { + this.touch0.x = this.mouseX = x; + this.touch0.y = this.mouseY = y; + this.listeners.map((listener) => { + if (listener.dragged) + listener.dragged(x, y); + }); + } + if (this.touch1 && this.touch1.identifier === nativeTouch.identifier) { + this.touch1.x = this.mouseX = x; + this.touch1.y = this.mouseY = y; + } + } + if (this.touch0 && this.touch1) { + let dx = this.touch1.x - this.touch0.x; + let dy = this.touch1.x - this.touch0.x; + let distance = Math.sqrt(dx * dx + dy * dy); + this.listeners.map((listener) => { + if (listener.zoom) + listener.zoom(this.initialPinchDistance, distance); + }); + } + } + ev.preventDefault(); + }, false); + let touchEnd = (ev) => { + if (this.touch0) { + var touches = ev.changedTouches; + let rect = element.getBoundingClientRect(); + for (var i = 0; i < touches.length; i++) { + var nativeTouch = touches[i]; + let x = nativeTouch.clientX - rect.left; + let y = nativeTouch.clientY - rect.top; + if (this.touch0.identifier === nativeTouch.identifier) { + this.touch0 = null; + this.mouseX = x; + this.mouseY = y; + this.listeners.map((listener) => { + if (listener.up) + listener.up(x, y); + }); + if (!this.touch1) { this.buttonDown = false; - this.currTouch = null; - this.touchesPool = new spine.Pool(function () { - return new spine.webgl.Touch(0, 0, 0); + break; + } else { + this.touch0 = this.touch1; + this.touch1 = null; + this.mouseX = this.touch0.x; + this.mouseX = this.touch0.x; + this.buttonDown = true; + this.listeners.map((listener) => { + if (listener.down) + listener.down(this.touch0.x, this.touch0.y); }); - this.listeners = new Array(); - this.element = element; - this.setupCallbacks(element); - } - Input.prototype.setupCallbacks = function (element) { - var _this = this; - var mouseDown = function (ev) { - if (ev instanceof MouseEvent) { - var rect = element.getBoundingClientRect(); - var x = ev.clientX - rect.left; - var y = ev.clientY - rect.top; - var listeners = _this.listeners; - for (var i = 0; i < listeners.length; i++) { - if (listeners[i].down) - listeners[i].down(x, y); - } - _this.lastX = x; - _this.lastY = y; - _this.buttonDown = true; - document.addEventListener("mousemove", mouseMove); - document.addEventListener("mouseup", mouseUp); - } - }; - var mouseMove = function (ev) { - if (ev instanceof MouseEvent) { - var rect = element.getBoundingClientRect(); - var x = ev.clientX - rect.left; - var y = ev.clientY - rect.top; - var listeners = _this.listeners; - for (var i = 0; i < listeners.length; i++) { - if (_this.buttonDown) { - if (listeners[i].dragged) - listeners[i].dragged(x, y); - } - else { - if (listeners[i].moved) - listeners[i].moved(x, y); - } - } - _this.lastX = x; - _this.lastY = y; - } - }; - var mouseUp = function (ev) { - if (ev instanceof MouseEvent) { - var rect = element.getBoundingClientRect(); - var x = ev.clientX - rect.left; - var y = ev.clientY - rect.top; - var listeners = _this.listeners; - for (var i = 0; i < listeners.length; i++) { - if (listeners[i].up) - listeners[i].up(x, y); - } - _this.lastX = x; - _this.lastY = y; - _this.buttonDown = false; - document.removeEventListener("mousemove", mouseMove); - document.removeEventListener("mouseup", mouseUp); - } - }; - element.addEventListener("mousedown", mouseDown, true); - element.addEventListener("mousemove", mouseMove, true); - element.addEventListener("mouseup", mouseUp, true); - element.addEventListener("touchstart", function (ev) { - if (_this.currTouch != null) - return; - var touches = ev.changedTouches; - for (var i = 0; i < touches.length; i++) { - var touch = touches[i]; - var rect = element.getBoundingClientRect(); - var x = touch.clientX - rect.left; - var y = touch.clientY - rect.top; - _this.currTouch = _this.touchesPool.obtain(); - _this.currTouch.identifier = touch.identifier; - _this.currTouch.x = x; - _this.currTouch.y = y; - break; - } - var listeners = _this.listeners; - for (var i_17 = 0; i_17 < listeners.length; i_17++) { - if (listeners[i_17].down) - listeners[i_17].down(_this.currTouch.x, _this.currTouch.y); - } - _this.lastX = _this.currTouch.x; - _this.lastY = _this.currTouch.y; - _this.buttonDown = true; - ev.preventDefault(); - }, false); - element.addEventListener("touchend", function (ev) { - var touches = ev.changedTouches; - for (var i = 0; i < touches.length; i++) { - var touch = touches[i]; - if (_this.currTouch.identifier === touch.identifier) { - var rect = element.getBoundingClientRect(); - var x = _this.currTouch.x = touch.clientX - rect.left; - var y = _this.currTouch.y = touch.clientY - rect.top; - _this.touchesPool.free(_this.currTouch); - var listeners = _this.listeners; - for (var i_18 = 0; i_18 < listeners.length; i_18++) { - if (listeners[i_18].up) - listeners[i_18].up(x, y); - } - _this.lastX = x; - _this.lastY = y; - _this.buttonDown = false; - _this.currTouch = null; - break; - } - } - ev.preventDefault(); - }, false); - element.addEventListener("touchcancel", function (ev) { - var touches = ev.changedTouches; - for (var i = 0; i < touches.length; i++) { - var touch = touches[i]; - if (_this.currTouch.identifier === touch.identifier) { - var rect = element.getBoundingClientRect(); - var x = _this.currTouch.x = touch.clientX - rect.left; - var y = _this.currTouch.y = touch.clientY - rect.top; - _this.touchesPool.free(_this.currTouch); - var listeners = _this.listeners; - for (var i_19 = 0; i_19 < listeners.length; i_19++) { - if (listeners[i_19].up) - listeners[i_19].up(x, y); - } - _this.lastX = x; - _this.lastY = y; - _this.buttonDown = false; - _this.currTouch = null; - break; - } - } - ev.preventDefault(); - }, false); - element.addEventListener("touchmove", function (ev) { - if (_this.currTouch == null) - return; - var touches = ev.changedTouches; - for (var i = 0; i < touches.length; i++) { - var touch = touches[i]; - if (_this.currTouch.identifier === touch.identifier) { - var rect = element.getBoundingClientRect(); - var x = touch.clientX - rect.left; - var y = touch.clientY - rect.top; - var listeners = _this.listeners; - for (var i_20 = 0; i_20 < listeners.length; i_20++) { - if (listeners[i_20].dragged) - listeners[i_20].dragged(x, y); - } - _this.lastX = _this.currTouch.x = x; - _this.lastY = _this.currTouch.y = y; - break; - } - } - ev.preventDefault(); - }, false); - }; - Input.prototype.addListener = function (listener) { - this.listeners.push(listener); - }; - Input.prototype.removeListener = function (listener) { - var idx = this.listeners.indexOf(listener); - if (idx > -1) { - this.listeners.splice(idx, 1); - } - }; - return Input; - }()); - webgl.Input = Input; - var Touch = (function () { - function Touch(identifier, x, y) { - this.identifier = identifier; - this.x = x; - this.y = y; - } - return Touch; - }()); - webgl.Touch = Touch; - })(webgl = spine.webgl || (spine.webgl = {})); -})(spine || (spine = {})); -var spine; -(function (spine) { - var webgl; - (function (webgl) { - var LoadingScreen = (function () { - function LoadingScreen(renderer) { - this.logo = null; - this.spinner = null; - this.angle = 0; - this.fadeOut = 0; - this.timeKeeper = new spine.TimeKeeper(); - this.backgroundColor = new spine.Color(0.135, 0.135, 0.135, 1); - this.tempColor = new spine.Color(); - this.firstDraw = 0; - this.renderer = renderer; - this.timeKeeper.maxDelta = 9; - if (LoadingScreen.logoImg === null) { - var isSafari = navigator.userAgent.indexOf("Safari") > -1; - LoadingScreen.logoImg = new Image(); - LoadingScreen.logoImg.src = LoadingScreen.SPINE_LOGO_DATA; - if (!isSafari) - LoadingScreen.logoImg.crossOrigin = "anonymous"; - LoadingScreen.logoImg.onload = function (ev) { - LoadingScreen.loaded++; - }; - LoadingScreen.spinnerImg = new Image(); - LoadingScreen.spinnerImg.src = LoadingScreen.SPINNER_DATA; - if (!isSafari) - LoadingScreen.spinnerImg.crossOrigin = "anonymous"; - LoadingScreen.spinnerImg.onload = function (ev) { - LoadingScreen.loaded++; - }; - } - } - LoadingScreen.prototype.draw = function (complete) { - if (complete === void 0) { complete = false; } - if (complete && this.fadeOut > LoadingScreen.FADE_SECONDS) - return; - this.timeKeeper.update(); - var a = Math.abs(Math.sin(this.timeKeeper.totalTime + 0.75)); - this.angle -= this.timeKeeper.delta / 1.4 * 360 * (1 + 1.5 * Math.pow(a, 5)); - var renderer = this.renderer; - var canvas = renderer.canvas; - var gl = renderer.context.gl; - renderer.resize(webgl.ResizeMode.Stretch); - var oldX = renderer.camera.position.x, oldY = renderer.camera.position.y; - renderer.camera.position.set(canvas.width / 2, canvas.height / 2, 0); - renderer.camera.viewportWidth = canvas.width; - renderer.camera.viewportHeight = canvas.height; - if (!complete) { - gl.clearColor(this.backgroundColor.r, this.backgroundColor.g, this.backgroundColor.b, this.backgroundColor.a); - gl.clear(gl.COLOR_BUFFER_BIT); - this.tempColor.a = 1; - } - else { - this.fadeOut += this.timeKeeper.delta * (this.timeKeeper.totalTime < 1 ? 2 : 1); - if (this.fadeOut > LoadingScreen.FADE_SECONDS) { - renderer.camera.position.set(oldX, oldY, 0); - return; - } - a = 1 - this.fadeOut / LoadingScreen.FADE_SECONDS; - this.tempColor.setFromColor(this.backgroundColor); - this.tempColor.a = 1 - (a - 1) * (a - 1); - renderer.begin(); - renderer.quad(true, 0, 0, canvas.width, 0, canvas.width, canvas.height, 0, canvas.height, this.tempColor, this.tempColor, this.tempColor, this.tempColor); - renderer.end(); - } - this.tempColor.set(1, 1, 1, this.tempColor.a); - if (LoadingScreen.loaded != 2) - return; - if (this.logo === null) { - this.logo = new webgl.GLTexture(renderer.context, LoadingScreen.logoImg); - this.spinner = new webgl.GLTexture(renderer.context, LoadingScreen.spinnerImg); - } - this.logo.update(false); - this.spinner.update(false); - var logoWidth = this.logo.getImage().width; - var logoHeight = this.logo.getImage().height; - var spinnerWidth = this.spinner.getImage().width; - var spinnerHeight = this.spinner.getImage().height; - renderer.batcher.setBlendMode(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA); - renderer.begin(); - renderer.drawTexture(this.logo, (canvas.width - logoWidth) / 2, (canvas.height - logoHeight) / 2, logoWidth, logoHeight, this.tempColor); - renderer.drawTextureRotated(this.spinner, (canvas.width - spinnerWidth) / 2, (canvas.height - spinnerHeight) / 2, spinnerWidth, spinnerHeight, spinnerWidth / 2, spinnerHeight / 2, this.angle, this.tempColor); - renderer.end(); - renderer.camera.position.set(oldX, oldY, 0); - }; - LoadingScreen.FADE_SECONDS = 1; - LoadingScreen.loaded = 0; - LoadingScreen.spinnerImg = null; - LoadingScreen.logoImg = null; - LoadingScreen.SPINNER_DATA = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKMAAACjCAYAAADmbK6AAAAACXBIWXMAAAsTAAALEwEAmpwYAAALB2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDIgNzkuMTYwOTI0LCAyMDE3LzA3LzEzLTAxOjA2OjM5ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIiB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxNS41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMTYtMDktMDhUMTQ6MjU6MTIrMDI6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMTgtMTEtMTVUMTY6NDA6NTkrMDE6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDE4LTExLTE1VDE2OjQwOjU5KzAxOjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpmZDhlNTljMC02NGJjLTIxNGQtODAyZi1jZDlhODJjM2ZjMGMiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDpmYmNmZWJlYS03MjY2LWE0NGQtOTI4NS0wOTJmNGNhYzk4ZWEiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowODMzNWIyYy04NzYyLWQzNGMtOTBhOS02ODJjYjJmYTQ2M2UiIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHRpZmY6T3JpZW50YXRpb249IjEiIHRpZmY6WFJlc29sdXRpb249IjcyMDAwMC8xMDAwMCIgdGlmZjpZUmVzb2x1dGlvbj0iNzIwMDAwLzEwMDAwIiB0aWZmOlJlc29sdXRpb25Vbml0PSIyIiBleGlmOkNvbG9yU3BhY2U9IjY1NTM1IiBleGlmOlBpeGVsWERpbWVuc2lvbj0iMjk3IiBleGlmOlBpeGVsWURpbWVuc2lvbj0iMjQyIj4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY3JlYXRlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDowODMzNWIyYy04NzYyLWQzNGMtOTBhOS02ODJjYjJmYTQ2M2UiIHN0RXZ0OndoZW49IjIwMTYtMDktMDhUMTQ6MjU6MTIrMDI6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1LjUgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpiNThlMTlkNi0xYTRjLTQyNDEtODU0ZC01MDVlZjYxMjRhODQiIHN0RXZ0OndoZW49IjIwMTgtMTEtMTVUMTY6NDA6MjMrMDE6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cykiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjQ3YzYzYzIwLWJkYjgtYzM0YS1hYzMyLWQ5MDdjOWEyOTA0MCIgc3RFdnQ6d2hlbj0iMjAxOC0xMS0xNVQxNjo0MDo1OSswMTowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY29udmVydGVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJmcm9tIGFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5waG90b3Nob3AgdG8gaW1hZ2UvcG5nIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJkZXJpdmVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJjb252ZXJ0ZWQgZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6ZmQ4ZTU5YzAtNjRiYy0yMTRkLTgwMmYtY2Q5YTgyYzNmYzBjIiBzdEV2dDp3aGVuPSIyMDE4LTExLTE1VDE2OjQwOjU5KzAxOjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0N2M2M2MyMC1iZGI4LWMzNGEtYWMzMi1kOTA3YzlhMjkwNDAiIHN0UmVmOmRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDo2OWRmZjljYy01YzFiLWE5NDctOTc3OS03ODgxZjM0ODk3MDMiIHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowODMzNWIyYy04NzYyLWQzNGMtOTBhOS02ODJjYjJmYTQ2M2UiLz4gPHBob3Rvc2hvcDpEb2N1bWVudEFu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"; - LoadingScreen.SPINE_LOGO_DATA = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKUAAABsCAYAAAALzHKmAAAACXBIWXMAAAsTAAALEwEAmpwYAAALB2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDIgNzkuMTYwOTI0LCAyMDE3LzA3LzEzLTAxOjA2OjM5ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIiB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxNS41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMTYtMDktMDhUMTQ6MjU6MTIrMDI6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMTgtMTEtMTVUMTY6NDA6NTkrMDE6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDE4LTExLTE1VDE2OjQwOjU5KzAxOjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDowMTdhZGQ3Ni04OTZlLThlNGUtYmM5MS00ZjEyNjI1YjA3MjgiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDplMTViNGE2ZS1hMDg3LWEzNDktODdhOS1mNDYzYjE2MzQ0Y2MiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowODMzNWIyYy04NzYyLWQzNGMtOTBhOS02ODJjYjJmYTQ2M2UiIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHRpZmY6T3JpZW50YXRpb249IjEiIHRpZmY6WFJlc29sdXRpb249IjcyMDAwMC8xMDAwMCIgdGlmZjpZUmVzb2x1dGlvbj0iNzIwMDAwLzEwMDAwIiB0aWZmOlJlc29sdXRpb25Vbml0PSIyIiBleGlmOkNvbG9yU3BhY2U9IjY1NTM1IiBleGlmOlBpeGVsWERpbWVuc2lvbj0iMjk3IiBleGlmOlBpeGVsWURpbWVuc2lvbj0iMjQyIj4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY3JlYXRlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDowODMzNWIyYy04NzYyLWQzNGMtOTBhOS02ODJjYjJmYTQ2M2UiIHN0RXZ0OndoZW49IjIwMTYtMDktMDhUMTQ6MjU6MTIrMDI6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1LjUgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpiNThlMTlkNi0xYTRjLTQyNDEtODU0ZC01MDVlZjYxMjRhODQiIHN0RXZ0OndoZW49IjIwMTgtMTEtMTVUMTY6NDA6MjMrMDE6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cykiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjJlNjJiMWM2LWIxYzQtNDk0MC04MDMxLWU4ZDkyNTBmODJjNSIgc3RFdnQ6d2hlbj0iMjAxOC0xMS0xNVQxNjo0MDo1OSswMTowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY29udmVydGVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJmcm9tIGFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5waG90b3Nob3AgdG8gaW1hZ2UvcG5nIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJkZXJpdmVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJjb252ZXJ0ZWQgZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6MDE3YWRkNzYtODk2ZS04ZTRlLWJjOTEtNGYxMjYyNWIwNzI4IiBzdEV2dDp3aGVuPSIyMDE4LTExLTE1VDE2OjQwOjU5KzAxOjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyZTYyYjFjNi1iMWM0LTQ5NDAtODAzMS1lOGQ5MjUwZjgyYzUiIHN0UmVmOmRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDo2OWRmZjljYy01YzFiLWE5NDctOTc3OS03ODgxZjM0ODk3MDMiIHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowODMzNWIyYy04NzYyLWQzNGMtOTBhOS02ODJjYjJmYTQ2M2UiLz4gPHBob3Rvc2hvcDpEb2N1bWVudEFu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"; - return LoadingScreen; - }()); - webgl.LoadingScreen = LoadingScreen; - })(webgl = spine.webgl || (spine.webgl = {})); -})(spine || (spine = {})); -var spine; -(function (spine) { - var webgl; - (function (webgl) { - webgl.M00 = 0; - webgl.M01 = 4; - webgl.M02 = 8; - webgl.M03 = 12; - webgl.M10 = 1; - webgl.M11 = 5; - webgl.M12 = 9; - webgl.M13 = 13; - webgl.M20 = 2; - webgl.M21 = 6; - webgl.M22 = 10; - webgl.M23 = 14; - webgl.M30 = 3; - webgl.M31 = 7; - webgl.M32 = 11; - webgl.M33 = 15; - var Matrix4 = (function () { - function Matrix4() { - this.temp = new Float32Array(16); - this.values = new Float32Array(16); - var v = this.values; - v[webgl.M00] = 1; - v[webgl.M11] = 1; - v[webgl.M22] = 1; - v[webgl.M33] = 1; - } - Matrix4.prototype.set = function (values) { - this.values.set(values); - return this; - }; - Matrix4.prototype.transpose = function () { - var t = this.temp; - var v = this.values; - t[webgl.M00] = v[webgl.M00]; - t[webgl.M01] = v[webgl.M10]; - t[webgl.M02] = v[webgl.M20]; - t[webgl.M03] = v[webgl.M30]; - t[webgl.M10] = v[webgl.M01]; - t[webgl.M11] = v[webgl.M11]; - t[webgl.M12] = v[webgl.M21]; - t[webgl.M13] = v[webgl.M31]; - t[webgl.M20] = v[webgl.M02]; - t[webgl.M21] = v[webgl.M12]; - t[webgl.M22] = v[webgl.M22]; - t[webgl.M23] = v[webgl.M32]; - t[webgl.M30] = v[webgl.M03]; - t[webgl.M31] = v[webgl.M13]; - t[webgl.M32] = v[webgl.M23]; - t[webgl.M33] = v[webgl.M33]; - return this.set(t); - }; - Matrix4.prototype.identity = function () { - var v = this.values; - v[webgl.M00] = 1; - v[webgl.M01] = 0; - v[webgl.M02] = 0; - v[webgl.M03] = 0; - v[webgl.M10] = 0; - v[webgl.M11] = 1; - v[webgl.M12] = 0; - v[webgl.M13] = 0; - v[webgl.M20] = 0; - v[webgl.M21] = 0; - v[webgl.M22] = 1; - v[webgl.M23] = 0; - v[webgl.M30] = 0; - v[webgl.M31] = 0; - v[webgl.M32] = 0; - v[webgl.M33] = 1; - return this; - }; - Matrix4.prototype.invert = function () { - var v = this.values; - var t = this.temp; - var l_det = v[webgl.M30] * v[webgl.M21] * v[webgl.M12] * v[webgl.M03] - v[webgl.M20] * v[webgl.M31] * v[webgl.M12] * v[webgl.M03] - v[webgl.M30] * v[webgl.M11] * v[webgl.M22] * v[webgl.M03] - + v[webgl.M10] * v[webgl.M31] * v[webgl.M22] * v[webgl.M03] + v[webgl.M20] * v[webgl.M11] * v[webgl.M32] * v[webgl.M03] - v[webgl.M10] * v[webgl.M21] * v[webgl.M32] * v[webgl.M03] - - v[webgl.M30] * v[webgl.M21] * v[webgl.M02] * v[webgl.M13] + v[webgl.M20] * v[webgl.M31] * v[webgl.M02] * v[webgl.M13] + v[webgl.M30] * v[webgl.M01] * v[webgl.M22] * v[webgl.M13] - - v[webgl.M00] * v[webgl.M31] * v[webgl.M22] * v[webgl.M13] - v[webgl.M20] * v[webgl.M01] * v[webgl.M32] * v[webgl.M13] + v[webgl.M00] * v[webgl.M21] * v[webgl.M32] * v[webgl.M13] - + v[webgl.M30] * v[webgl.M11] * v[webgl.M02] * v[webgl.M23] - v[webgl.M10] * v[webgl.M31] * v[webgl.M02] * v[webgl.M23] - v[webgl.M30] * v[webgl.M01] * v[webgl.M12] * v[webgl.M23] - + v[webgl.M00] * v[webgl.M31] * v[webgl.M12] * v[webgl.M23] + v[webgl.M10] * v[webgl.M01] * v[webgl.M32] * v[webgl.M23] - v[webgl.M00] * v[webgl.M11] * v[webgl.M32] * v[webgl.M23] - - v[webgl.M20] * v[webgl.M11] * v[webgl.M02] * v[webgl.M33] + v[webgl.M10] * v[webgl.M21] * v[webgl.M02] * v[webgl.M33] + v[webgl.M20] * v[webgl.M01] * v[webgl.M12] * v[webgl.M33] - - v[webgl.M00] * v[webgl.M21] * v[webgl.M12] * v[webgl.M33] - v[webgl.M10] * v[webgl.M01] * v[webgl.M22] * v[webgl.M33] + v[webgl.M00] * v[webgl.M11] * v[webgl.M22] * v[webgl.M33]; - if (l_det == 0) - throw new Error("non-invertible matrix"); - var inv_det = 1.0 / l_det; - t[webgl.M00] = v[webgl.M12] * v[webgl.M23] * v[webgl.M31] - v[webgl.M13] * v[webgl.M22] * v[webgl.M31] + v[webgl.M13] * v[webgl.M21] * v[webgl.M32] - - v[webgl.M11] * v[webgl.M23] * v[webgl.M32] - v[webgl.M12] * v[webgl.M21] * v[webgl.M33] + v[webgl.M11] * v[webgl.M22] * v[webgl.M33]; - t[webgl.M01] = v[webgl.M03] * v[webgl.M22] * v[webgl.M31] - v[webgl.M02] * v[webgl.M23] * v[webgl.M31] - v[webgl.M03] * v[webgl.M21] * v[webgl.M32] - + v[webgl.M01] * v[webgl.M23] * v[webgl.M32] + v[webgl.M02] * v[webgl.M21] * v[webgl.M33] - v[webgl.M01] * v[webgl.M22] * v[webgl.M33]; - t[webgl.M02] = v[webgl.M02] * v[webgl.M13] * v[webgl.M31] - v[webgl.M03] * v[webgl.M12] * v[webgl.M31] + v[webgl.M03] * v[webgl.M11] * v[webgl.M32] - - v[webgl.M01] * v[webgl.M13] * v[webgl.M32] - v[webgl.M02] * v[webgl.M11] * v[webgl.M33] + v[webgl.M01] * v[webgl.M12] * v[webgl.M33]; - t[webgl.M03] = v[webgl.M03] * v[webgl.M12] * v[webgl.M21] - v[webgl.M02] * v[webgl.M13] * v[webgl.M21] - v[webgl.M03] * v[webgl.M11] * v[webgl.M22] - + v[webgl.M01] * v[webgl.M13] * v[webgl.M22] + v[webgl.M02] * v[webgl.M11] * v[webgl.M23] - v[webgl.M01] * v[webgl.M12] * v[webgl.M23]; - t[webgl.M10] = v[webgl.M13] * v[webgl.M22] * v[webgl.M30] - v[webgl.M12] * v[webgl.M23] * v[webgl.M30] - v[webgl.M13] * v[webgl.M20] * v[webgl.M32] - + v[webgl.M10] * v[webgl.M23] * v[webgl.M32] + v[webgl.M12] * v[webgl.M20] * v[webgl.M33] - v[webgl.M10] * v[webgl.M22] * v[webgl.M33]; - t[webgl.M11] = v[webgl.M02] * v[webgl.M23] * v[webgl.M30] - v[webgl.M03] * v[webgl.M22] * v[webgl.M30] + v[webgl.M03] * v[webgl.M20] * v[webgl.M32] - - v[webgl.M00] * v[webgl.M23] * v[webgl.M32] - v[webgl.M02] * v[webgl.M20] * v[webgl.M33] + v[webgl.M00] * v[webgl.M22] * v[webgl.M33]; - t[webgl.M12] = v[webgl.M03] * v[webgl.M12] * v[webgl.M30] - v[webgl.M02] * v[webgl.M13] * v[webgl.M30] - v[webgl.M03] * v[webgl.M10] * v[webgl.M32] - + v[webgl.M00] * v[webgl.M13] * v[webgl.M32] + v[webgl.M02] * v[webgl.M10] * v[webgl.M33] - v[webgl.M00] * v[webgl.M12] * v[webgl.M33]; - t[webgl.M13] = v[webgl.M02] * v[webgl.M13] * v[webgl.M20] - v[webgl.M03] * v[webgl.M12] * v[webgl.M20] + v[webgl.M03] * v[webgl.M10] * v[webgl.M22] - - v[webgl.M00] * v[webgl.M13] * v[webgl.M22] - v[webgl.M02] * v[webgl.M10] * v[webgl.M23] + v[webgl.M00] * v[webgl.M12] * v[webgl.M23]; - t[webgl.M20] = v[webgl.M11] * v[webgl.M23] * v[webgl.M30] - v[webgl.M13] * v[webgl.M21] * v[webgl.M30] + v[webgl.M13] * v[webgl.M20] * v[webgl.M31] - - v[webgl.M10] * v[webgl.M23] * v[webgl.M31] - v[webgl.M11] * v[webgl.M20] * v[webgl.M33] + v[webgl.M10] * v[webgl.M21] * v[webgl.M33]; - t[webgl.M21] = v[webgl.M03] * v[webgl.M21] * v[webgl.M30] - v[webgl.M01] * v[webgl.M23] * v[webgl.M30] - v[webgl.M03] * v[webgl.M20] * v[webgl.M31] - + v[webgl.M00] * v[webgl.M23] * v[webgl.M31] + v[webgl.M01] * v[webgl.M20] * v[webgl.M33] - v[webgl.M00] * v[webgl.M21] * v[webgl.M33]; - t[webgl.M22] = v[webgl.M01] * v[webgl.M13] * v[webgl.M30] - v[webgl.M03] * v[webgl.M11] * v[webgl.M30] + v[webgl.M03] * v[webgl.M10] * v[webgl.M31] - - v[webgl.M00] * v[webgl.M13] * v[webgl.M31] - v[webgl.M01] * v[webgl.M10] * v[webgl.M33] + v[webgl.M00] * v[webgl.M11] * v[webgl.M33]; - t[webgl.M23] = v[webgl.M03] * v[webgl.M11] * v[webgl.M20] - v[webgl.M01] * v[webgl.M13] * v[webgl.M20] - v[webgl.M03] * v[webgl.M10] * v[webgl.M21] - + v[webgl.M00] * v[webgl.M13] * v[webgl.M21] + v[webgl.M01] * v[webgl.M10] * v[webgl.M23] - v[webgl.M00] * v[webgl.M11] * v[webgl.M23]; - t[webgl.M30] = v[webgl.M12] * v[webgl.M21] * v[webgl.M30] - v[webgl.M11] * v[webgl.M22] * v[webgl.M30] - v[webgl.M12] * v[webgl.M20] * v[webgl.M31] - + v[webgl.M10] * v[webgl.M22] * v[webgl.M31] + v[webgl.M11] * v[webgl.M20] * v[webgl.M32] - v[webgl.M10] * v[webgl.M21] * v[webgl.M32]; - t[webgl.M31] = v[webgl.M01] * v[webgl.M22] * v[webgl.M30] - v[webgl.M02] * v[webgl.M21] * v[webgl.M30] + v[webgl.M02] * v[webgl.M20] * v[webgl.M31] - - v[webgl.M00] * v[webgl.M22] * v[webgl.M31] - v[webgl.M01] * v[webgl.M20] * v[webgl.M32] + v[webgl.M00] * v[webgl.M21] * v[webgl.M32]; - t[webgl.M32] = v[webgl.M02] * v[webgl.M11] * v[webgl.M30] - v[webgl.M01] * v[webgl.M12] * v[webgl.M30] - v[webgl.M02] * v[webgl.M10] * v[webgl.M31] - + v[webgl.M00] * v[webgl.M12] * v[webgl.M31] + v[webgl.M01] * v[webgl.M10] * v[webgl.M32] - v[webgl.M00] * v[webgl.M11] * v[webgl.M32]; - t[webgl.M33] = v[webgl.M01] * v[webgl.M12] * v[webgl.M20] - v[webgl.M02] * v[webgl.M11] * v[webgl.M20] + v[webgl.M02] * v[webgl.M10] * v[webgl.M21] - - v[webgl.M00] * v[webgl.M12] * v[webgl.M21] - v[webgl.M01] * v[webgl.M10] * v[webgl.M22] + v[webgl.M00] * v[webgl.M11] * v[webgl.M22]; - v[webgl.M00] = t[webgl.M00] * inv_det; - v[webgl.M01] = t[webgl.M01] * inv_det; - v[webgl.M02] = t[webgl.M02] * inv_det; - v[webgl.M03] = t[webgl.M03] * inv_det; - v[webgl.M10] = t[webgl.M10] * inv_det; - v[webgl.M11] = t[webgl.M11] * inv_det; - v[webgl.M12] = t[webgl.M12] * inv_det; - v[webgl.M13] = t[webgl.M13] * inv_det; - v[webgl.M20] = t[webgl.M20] * inv_det; - v[webgl.M21] = t[webgl.M21] * inv_det; - v[webgl.M22] = t[webgl.M22] * inv_det; - v[webgl.M23] = t[webgl.M23] * inv_det; - v[webgl.M30] = t[webgl.M30] * inv_det; - v[webgl.M31] = t[webgl.M31] * inv_det; - v[webgl.M32] = t[webgl.M32] * inv_det; - v[webgl.M33] = t[webgl.M33] * inv_det; - return this; - }; - Matrix4.prototype.determinant = function () { - var v = this.values; - return v[webgl.M30] * v[webgl.M21] * v[webgl.M12] * v[webgl.M03] - v[webgl.M20] * v[webgl.M31] * v[webgl.M12] * v[webgl.M03] - v[webgl.M30] * v[webgl.M11] * v[webgl.M22] * v[webgl.M03] - + v[webgl.M10] * v[webgl.M31] * v[webgl.M22] * v[webgl.M03] + v[webgl.M20] * v[webgl.M11] * v[webgl.M32] * v[webgl.M03] - v[webgl.M10] * v[webgl.M21] * v[webgl.M32] * v[webgl.M03] - - v[webgl.M30] * v[webgl.M21] * v[webgl.M02] * v[webgl.M13] + v[webgl.M20] * v[webgl.M31] * v[webgl.M02] * v[webgl.M13] + v[webgl.M30] * v[webgl.M01] * v[webgl.M22] * v[webgl.M13] - - v[webgl.M00] * v[webgl.M31] * v[webgl.M22] * v[webgl.M13] - v[webgl.M20] * v[webgl.M01] * v[webgl.M32] * v[webgl.M13] + v[webgl.M00] * v[webgl.M21] * v[webgl.M32] * v[webgl.M13] - + v[webgl.M30] * v[webgl.M11] * v[webgl.M02] * v[webgl.M23] - v[webgl.M10] * v[webgl.M31] * v[webgl.M02] * v[webgl.M23] - v[webgl.M30] * v[webgl.M01] * v[webgl.M12] * v[webgl.M23] - + v[webgl.M00] * v[webgl.M31] * v[webgl.M12] * v[webgl.M23] + v[webgl.M10] * v[webgl.M01] * v[webgl.M32] * v[webgl.M23] - v[webgl.M00] * v[webgl.M11] * v[webgl.M32] * v[webgl.M23] - - v[webgl.M20] * v[webgl.M11] * v[webgl.M02] * v[webgl.M33] + v[webgl.M10] * v[webgl.M21] * v[webgl.M02] * v[webgl.M33] + v[webgl.M20] * v[webgl.M01] * v[webgl.M12] * v[webgl.M33] - - v[webgl.M00] * v[webgl.M21] * v[webgl.M12] * v[webgl.M33] - v[webgl.M10] * v[webgl.M01] * v[webgl.M22] * v[webgl.M33] + v[webgl.M00] * v[webgl.M11] * v[webgl.M22] * v[webgl.M33]; - }; - Matrix4.prototype.translate = function (x, y, z) { - var v = this.values; - v[webgl.M03] += x; - v[webgl.M13] += y; - v[webgl.M23] += z; - return this; - }; - Matrix4.prototype.copy = function () { - return new Matrix4().set(this.values); - }; - Matrix4.prototype.projection = function (near, far, fovy, aspectRatio) { - this.identity(); - var l_fd = (1.0 / Math.tan((fovy * (Math.PI / 180)) / 2.0)); - var l_a1 = (far + near) / (near - far); - var l_a2 = (2 * far * near) / (near - far); - var v = this.values; - v[webgl.M00] = l_fd / aspectRatio; - v[webgl.M10] = 0; - v[webgl.M20] = 0; - v[webgl.M30] = 0; - v[webgl.M01] = 0; - v[webgl.M11] = l_fd; - v[webgl.M21] = 0; - v[webgl.M31] = 0; - v[webgl.M02] = 0; - v[webgl.M12] = 0; - v[webgl.M22] = l_a1; - v[webgl.M32] = -1; - v[webgl.M03] = 0; - v[webgl.M13] = 0; - v[webgl.M23] = l_a2; - v[webgl.M33] = 0; - return this; - }; - Matrix4.prototype.ortho2d = function (x, y, width, height) { - return this.ortho(x, x + width, y, y + height, 0, 1); - }; - Matrix4.prototype.ortho = function (left, right, bottom, top, near, far) { - this.identity(); - var x_orth = 2 / (right - left); - var y_orth = 2 / (top - bottom); - var z_orth = -2 / (far - near); - var tx = -(right + left) / (right - left); - var ty = -(top + bottom) / (top - bottom); - var tz = -(far + near) / (far - near); - var v = this.values; - v[webgl.M00] = x_orth; - v[webgl.M10] = 0; - v[webgl.M20] = 0; - v[webgl.M30] = 0; - v[webgl.M01] = 0; - v[webgl.M11] = y_orth; - v[webgl.M21] = 0; - v[webgl.M31] = 0; - v[webgl.M02] = 0; - v[webgl.M12] = 0; - v[webgl.M22] = z_orth; - v[webgl.M32] = 0; - v[webgl.M03] = tx; - v[webgl.M13] = ty; - v[webgl.M23] = tz; - v[webgl.M33] = 1; - return this; - }; - Matrix4.prototype.multiply = function (matrix) { - var t = this.temp; - var v = this.values; - var m = matrix.values; - t[webgl.M00] = v[webgl.M00] * m[webgl.M00] + v[webgl.M01] * m[webgl.M10] + v[webgl.M02] * m[webgl.M20] + v[webgl.M03] * m[webgl.M30]; - t[webgl.M01] = v[webgl.M00] * m[webgl.M01] + v[webgl.M01] * m[webgl.M11] + v[webgl.M02] * m[webgl.M21] + v[webgl.M03] * m[webgl.M31]; - t[webgl.M02] = v[webgl.M00] * m[webgl.M02] + v[webgl.M01] * m[webgl.M12] + v[webgl.M02] * m[webgl.M22] + v[webgl.M03] * m[webgl.M32]; - t[webgl.M03] = v[webgl.M00] * m[webgl.M03] + v[webgl.M01] * m[webgl.M13] + v[webgl.M02] * m[webgl.M23] + v[webgl.M03] * m[webgl.M33]; - t[webgl.M10] = v[webgl.M10] * m[webgl.M00] + v[webgl.M11] * m[webgl.M10] + v[webgl.M12] * m[webgl.M20] + v[webgl.M13] * m[webgl.M30]; - t[webgl.M11] = v[webgl.M10] * m[webgl.M01] + v[webgl.M11] * m[webgl.M11] + v[webgl.M12] * m[webgl.M21] + v[webgl.M13] * m[webgl.M31]; - t[webgl.M12] = v[webgl.M10] * m[webgl.M02] + v[webgl.M11] * m[webgl.M12] + v[webgl.M12] * m[webgl.M22] + v[webgl.M13] * m[webgl.M32]; - t[webgl.M13] = v[webgl.M10] * m[webgl.M03] + v[webgl.M11] * m[webgl.M13] + v[webgl.M12] * m[webgl.M23] + v[webgl.M13] * m[webgl.M33]; - t[webgl.M20] = v[webgl.M20] * m[webgl.M00] + v[webgl.M21] * m[webgl.M10] + v[webgl.M22] * m[webgl.M20] + v[webgl.M23] * m[webgl.M30]; - t[webgl.M21] = v[webgl.M20] * m[webgl.M01] + v[webgl.M21] * m[webgl.M11] + v[webgl.M22] * m[webgl.M21] + v[webgl.M23] * m[webgl.M31]; - t[webgl.M22] = v[webgl.M20] * m[webgl.M02] + v[webgl.M21] * m[webgl.M12] + v[webgl.M22] * m[webgl.M22] + v[webgl.M23] * m[webgl.M32]; - t[webgl.M23] = v[webgl.M20] * m[webgl.M03] + v[webgl.M21] * m[webgl.M13] + v[webgl.M22] * m[webgl.M23] + v[webgl.M23] * m[webgl.M33]; - t[webgl.M30] = v[webgl.M30] * m[webgl.M00] + v[webgl.M31] * m[webgl.M10] + v[webgl.M32] * m[webgl.M20] + v[webgl.M33] * m[webgl.M30]; - t[webgl.M31] = v[webgl.M30] * m[webgl.M01] + v[webgl.M31] * m[webgl.M11] + v[webgl.M32] * m[webgl.M21] + v[webgl.M33] * m[webgl.M31]; - t[webgl.M32] = v[webgl.M30] * m[webgl.M02] + v[webgl.M31] * m[webgl.M12] + v[webgl.M32] * m[webgl.M22] + v[webgl.M33] * m[webgl.M32]; - t[webgl.M33] = v[webgl.M30] * m[webgl.M03] + v[webgl.M31] * m[webgl.M13] + v[webgl.M32] * m[webgl.M23] + v[webgl.M33] * m[webgl.M33]; - return this.set(this.temp); - }; - Matrix4.prototype.multiplyLeft = function (matrix) { - var t = this.temp; - var v = this.values; - var m = matrix.values; - t[webgl.M00] = m[webgl.M00] * v[webgl.M00] + m[webgl.M01] * v[webgl.M10] + m[webgl.M02] * v[webgl.M20] + m[webgl.M03] * v[webgl.M30]; - t[webgl.M01] = m[webgl.M00] * v[webgl.M01] + m[webgl.M01] * v[webgl.M11] + m[webgl.M02] * v[webgl.M21] + m[webgl.M03] * v[webgl.M31]; - t[webgl.M02] = m[webgl.M00] * v[webgl.M02] + m[webgl.M01] * v[webgl.M12] + m[webgl.M02] * v[webgl.M22] + m[webgl.M03] * v[webgl.M32]; - t[webgl.M03] = m[webgl.M00] * v[webgl.M03] + m[webgl.M01] * v[webgl.M13] + m[webgl.M02] * v[webgl.M23] + m[webgl.M03] * v[webgl.M33]; - t[webgl.M10] = m[webgl.M10] * v[webgl.M00] + m[webgl.M11] * v[webgl.M10] + m[webgl.M12] * v[webgl.M20] + m[webgl.M13] * v[webgl.M30]; - t[webgl.M11] = m[webgl.M10] * v[webgl.M01] + m[webgl.M11] * v[webgl.M11] + m[webgl.M12] * v[webgl.M21] + m[webgl.M13] * v[webgl.M31]; - t[webgl.M12] = m[webgl.M10] * v[webgl.M02] + m[webgl.M11] * v[webgl.M12] + m[webgl.M12] * v[webgl.M22] + m[webgl.M13] * v[webgl.M32]; - t[webgl.M13] = m[webgl.M10] * v[webgl.M03] + m[webgl.M11] * v[webgl.M13] + m[webgl.M12] * v[webgl.M23] + m[webgl.M13] * v[webgl.M33]; - t[webgl.M20] = m[webgl.M20] * v[webgl.M00] + m[webgl.M21] * v[webgl.M10] + m[webgl.M22] * v[webgl.M20] + m[webgl.M23] * v[webgl.M30]; - t[webgl.M21] = m[webgl.M20] * v[webgl.M01] + m[webgl.M21] * v[webgl.M11] + m[webgl.M22] * v[webgl.M21] + m[webgl.M23] * v[webgl.M31]; - t[webgl.M22] = m[webgl.M20] * v[webgl.M02] + m[webgl.M21] * v[webgl.M12] + m[webgl.M22] * v[webgl.M22] + m[webgl.M23] * v[webgl.M32]; - t[webgl.M23] = m[webgl.M20] * v[webgl.M03] + m[webgl.M21] * v[webgl.M13] + m[webgl.M22] * v[webgl.M23] + m[webgl.M23] * v[webgl.M33]; - t[webgl.M30] = m[webgl.M30] * v[webgl.M00] + m[webgl.M31] * v[webgl.M10] + m[webgl.M32] * v[webgl.M20] + m[webgl.M33] * v[webgl.M30]; - t[webgl.M31] = m[webgl.M30] * v[webgl.M01] + m[webgl.M31] * v[webgl.M11] + m[webgl.M32] * v[webgl.M21] + m[webgl.M33] * v[webgl.M31]; - t[webgl.M32] = m[webgl.M30] * v[webgl.M02] + m[webgl.M31] * v[webgl.M12] + m[webgl.M32] * v[webgl.M22] + m[webgl.M33] * v[webgl.M32]; - t[webgl.M33] = m[webgl.M30] * v[webgl.M03] + m[webgl.M31] * v[webgl.M13] + m[webgl.M32] * v[webgl.M23] + m[webgl.M33] * v[webgl.M33]; - return this.set(this.temp); - }; - Matrix4.prototype.lookAt = function (position, direction, up) { - Matrix4.initTemps(); - var xAxis = Matrix4.xAxis, yAxis = Matrix4.yAxis, zAxis = Matrix4.zAxis; - zAxis.setFrom(direction).normalize(); - xAxis.setFrom(direction).normalize(); - xAxis.cross(up).normalize(); - yAxis.setFrom(xAxis).cross(zAxis).normalize(); - this.identity(); - var val = this.values; - val[webgl.M00] = xAxis.x; - val[webgl.M01] = xAxis.y; - val[webgl.M02] = xAxis.z; - val[webgl.M10] = yAxis.x; - val[webgl.M11] = yAxis.y; - val[webgl.M12] = yAxis.z; - val[webgl.M20] = -zAxis.x; - val[webgl.M21] = -zAxis.y; - val[webgl.M22] = -zAxis.z; - Matrix4.tmpMatrix.identity(); - Matrix4.tmpMatrix.values[webgl.M03] = -position.x; - Matrix4.tmpMatrix.values[webgl.M13] = -position.y; - Matrix4.tmpMatrix.values[webgl.M23] = -position.z; - this.multiply(Matrix4.tmpMatrix); - return this; - }; - Matrix4.initTemps = function () { - if (Matrix4.xAxis === null) - Matrix4.xAxis = new webgl.Vector3(); - if (Matrix4.yAxis === null) - Matrix4.yAxis = new webgl.Vector3(); - if (Matrix4.zAxis === null) - Matrix4.zAxis = new webgl.Vector3(); - }; - Matrix4.xAxis = null; - Matrix4.yAxis = null; - Matrix4.zAxis = null; - Matrix4.tmpMatrix = new Matrix4(); - return Matrix4; - }()); - webgl.Matrix4 = Matrix4; - })(webgl = spine.webgl || (spine.webgl = {})); -})(spine || (spine = {})); -var spine; -(function (spine) { - var webgl; - (function (webgl) { - var Mesh = (function () { - function Mesh(context, attributes, maxVertices, maxIndices) { - this.attributes = attributes; - this.verticesLength = 0; - this.dirtyVertices = false; - this.indicesLength = 0; - this.dirtyIndices = false; - this.elementsPerVertex = 0; - this.context = context instanceof webgl.ManagedWebGLRenderingContext ? context : new webgl.ManagedWebGLRenderingContext(context); - this.elementsPerVertex = 0; - for (var i = 0; i < attributes.length; i++) { - this.elementsPerVertex += attributes[i].numElements; - } - this.vertices = new Float32Array(maxVertices * this.elementsPerVertex); - this.indices = new Uint16Array(maxIndices); - this.context.addRestorable(this); - } - Mesh.prototype.getAttributes = function () { return this.attributes; }; - Mesh.prototype.maxVertices = function () { return this.vertices.length / this.elementsPerVertex; }; - Mesh.prototype.numVertices = function () { return this.verticesLength / this.elementsPerVertex; }; - Mesh.prototype.setVerticesLength = function (length) { - this.dirtyVertices = true; - this.verticesLength = length; - }; - Mesh.prototype.getVertices = function () { return this.vertices; }; - Mesh.prototype.maxIndices = function () { return this.indices.length; }; - Mesh.prototype.numIndices = function () { return this.indicesLength; }; - Mesh.prototype.setIndicesLength = function (length) { - this.dirtyIndices = true; - this.indicesLength = length; - }; - Mesh.prototype.getIndices = function () { return this.indices; }; - ; - Mesh.prototype.getVertexSizeInFloats = function () { - var size = 0; - for (var i = 0; i < this.attributes.length; i++) { - var attribute = this.attributes[i]; - size += attribute.numElements; - } - return size; - }; - Mesh.prototype.setVertices = function (vertices) { - this.dirtyVertices = true; - if (vertices.length > this.vertices.length) - throw Error("Mesh can't store more than " + this.maxVertices() + " vertices"); - this.vertices.set(vertices, 0); - this.verticesLength = vertices.length; - }; - Mesh.prototype.setIndices = function (indices) { - this.dirtyIndices = true; - if (indices.length > this.indices.length) - throw Error("Mesh can't store more than " + this.maxIndices() + " indices"); - this.indices.set(indices, 0); - this.indicesLength = indices.length; - }; - Mesh.prototype.draw = function (shader, primitiveType) { - this.drawWithOffset(shader, primitiveType, 0, this.indicesLength > 0 ? this.indicesLength : this.verticesLength / this.elementsPerVertex); - }; - Mesh.prototype.drawWithOffset = function (shader, primitiveType, offset, count) { - var gl = this.context.gl; - if (this.dirtyVertices || this.dirtyIndices) - this.update(); - this.bind(shader); - if (this.indicesLength > 0) { - gl.drawElements(primitiveType, count, gl.UNSIGNED_SHORT, offset * 2); - } - else { - gl.drawArrays(primitiveType, offset, count); - } - this.unbind(shader); - }; - Mesh.prototype.bind = function (shader) { - var gl = this.context.gl; - gl.bindBuffer(gl.ARRAY_BUFFER, this.verticesBuffer); - var offset = 0; - for (var i = 0; i < this.attributes.length; i++) { - var attrib = this.attributes[i]; - var location_1 = shader.getAttributeLocation(attrib.name); - gl.enableVertexAttribArray(location_1); - gl.vertexAttribPointer(location_1, attrib.numElements, gl.FLOAT, false, this.elementsPerVertex * 4, offset * 4); - offset += attrib.numElements; - } - if (this.indicesLength > 0) - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indicesBuffer); - }; - Mesh.prototype.unbind = function (shader) { - var gl = this.context.gl; - for (var i = 0; i < this.attributes.length; i++) { - var attrib = this.attributes[i]; - var location_2 = shader.getAttributeLocation(attrib.name); - gl.disableVertexAttribArray(location_2); - } - gl.bindBuffer(gl.ARRAY_BUFFER, null); - if (this.indicesLength > 0) - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null); - }; - Mesh.prototype.update = function () { - var gl = this.context.gl; - if (this.dirtyVertices) { - if (!this.verticesBuffer) { - this.verticesBuffer = gl.createBuffer(); - } - gl.bindBuffer(gl.ARRAY_BUFFER, this.verticesBuffer); - gl.bufferData(gl.ARRAY_BUFFER, this.vertices.subarray(0, this.verticesLength), gl.DYNAMIC_DRAW); - this.dirtyVertices = false; - } - if (this.dirtyIndices) { - if (!this.indicesBuffer) { - this.indicesBuffer = gl.createBuffer(); - } - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indicesBuffer); - gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.indices.subarray(0, this.indicesLength), gl.DYNAMIC_DRAW); - this.dirtyIndices = false; - } - }; - Mesh.prototype.restore = function () { - this.verticesBuffer = null; - this.indicesBuffer = null; - this.update(); - }; - Mesh.prototype.dispose = function () { - this.context.removeRestorable(this); - var gl = this.context.gl; - gl.deleteBuffer(this.verticesBuffer); - gl.deleteBuffer(this.indicesBuffer); - }; - return Mesh; - }()); - webgl.Mesh = Mesh; - var VertexAttribute = (function () { - function VertexAttribute(name, type, numElements) { - this.name = name; - this.type = type; - this.numElements = numElements; - } - return VertexAttribute; - }()); - webgl.VertexAttribute = VertexAttribute; - var Position2Attribute = (function (_super) { - __extends(Position2Attribute, _super); - function Position2Attribute() { - return _super.call(this, webgl.Shader.POSITION, VertexAttributeType.Float, 2) || this; - } - return Position2Attribute; - }(VertexAttribute)); - webgl.Position2Attribute = Position2Attribute; - var Position3Attribute = (function (_super) { - __extends(Position3Attribute, _super); - function Position3Attribute() { - return _super.call(this, webgl.Shader.POSITION, VertexAttributeType.Float, 3) || this; - } - return Position3Attribute; - }(VertexAttribute)); - webgl.Position3Attribute = Position3Attribute; - var TexCoordAttribute = (function (_super) { - __extends(TexCoordAttribute, _super); - function TexCoordAttribute(unit) { - if (unit === void 0) { unit = 0; } - return _super.call(this, webgl.Shader.TEXCOORDS + (unit == 0 ? "" : unit), VertexAttributeType.Float, 2) || this; - } - return TexCoordAttribute; - }(VertexAttribute)); - webgl.TexCoordAttribute = TexCoordAttribute; - var ColorAttribute = (function (_super) { - __extends(ColorAttribute, _super); - function ColorAttribute() { - return _super.call(this, webgl.Shader.COLOR, VertexAttributeType.Float, 4) || this; - } - return ColorAttribute; - }(VertexAttribute)); - webgl.ColorAttribute = ColorAttribute; - var Color2Attribute = (function (_super) { - __extends(Color2Attribute, _super); - function Color2Attribute() { - return _super.call(this, webgl.Shader.COLOR2, VertexAttributeType.Float, 4) || this; - } - return Color2Attribute; - }(VertexAttribute)); - webgl.Color2Attribute = Color2Attribute; - var VertexAttributeType; - (function (VertexAttributeType) { - VertexAttributeType[VertexAttributeType["Float"] = 0] = "Float"; - })(VertexAttributeType = webgl.VertexAttributeType || (webgl.VertexAttributeType = {})); - })(webgl = spine.webgl || (spine.webgl = {})); -})(spine || (spine = {})); -var spine; -(function (spine) { - var webgl; - (function (webgl) { - var PolygonBatcher = (function () { - function PolygonBatcher(context, twoColorTint, maxVertices) { - if (twoColorTint === void 0) { twoColorTint = true; } - if (maxVertices === void 0) { maxVertices = 10920; } - this.isDrawing = false; - this.shader = null; - this.lastTexture = null; - this.verticesLength = 0; - this.indicesLength = 0; - if (maxVertices > 10920) - throw new Error("Can't have more than 10920 triangles per batch: " + maxVertices); - this.context = context instanceof webgl.ManagedWebGLRenderingContext ? context : new webgl.ManagedWebGLRenderingContext(context); - var attributes = twoColorTint ? - [new webgl.Position2Attribute(), new webgl.ColorAttribute(), new webgl.TexCoordAttribute(), new webgl.Color2Attribute()] : - [new webgl.Position2Attribute(), new webgl.ColorAttribute(), new webgl.TexCoordAttribute()]; - this.mesh = new webgl.Mesh(context, attributes, maxVertices, maxVertices * 3); - this.srcBlend = this.context.gl.SRC_ALPHA; - this.dstBlend = this.context.gl.ONE_MINUS_SRC_ALPHA; - } - PolygonBatcher.prototype.begin = function (shader) { - var gl = this.context.gl; - if (this.isDrawing) - throw new Error("PolygonBatch is already drawing. Call PolygonBatch.end() before calling PolygonBatch.begin()"); - this.drawCalls = 0; - this.shader = shader; - this.lastTexture = null; - this.isDrawing = true; - gl.enable(gl.BLEND); - gl.blendFunc(this.srcBlend, this.dstBlend); - }; - PolygonBatcher.prototype.setBlendMode = function (srcBlend, dstBlend) { - var gl = this.context.gl; - this.srcBlend = srcBlend; - this.dstBlend = dstBlend; - if (this.isDrawing) { - this.flush(); - gl.blendFunc(this.srcBlend, this.dstBlend); - } - }; - PolygonBatcher.prototype.draw = function (texture, vertices, indices) { - if (texture != this.lastTexture) { - this.flush(); - this.lastTexture = texture; - } - else if (this.verticesLength + vertices.length > this.mesh.getVertices().length || - this.indicesLength + indices.length > this.mesh.getIndices().length) { - this.flush(); - } - var indexStart = this.mesh.numVertices(); - this.mesh.getVertices().set(vertices, this.verticesLength); - this.verticesLength += vertices.length; - this.mesh.setVerticesLength(this.verticesLength); - var indicesArray = this.mesh.getIndices(); - for (var i = this.indicesLength, j = 0; j < indices.length; i++, j++) - indicesArray[i] = indices[j] + indexStart; - this.indicesLength += indices.length; - this.mesh.setIndicesLength(this.indicesLength); - }; - PolygonBatcher.prototype.flush = function () { - var gl = this.context.gl; - if (this.verticesLength == 0) - return; - this.lastTexture.bind(); - this.mesh.draw(this.shader, gl.TRIANGLES); - this.verticesLength = 0; - this.indicesLength = 0; - this.mesh.setVerticesLength(0); - this.mesh.setIndicesLength(0); - this.drawCalls++; - }; - PolygonBatcher.prototype.end = function () { - var gl = this.context.gl; - if (!this.isDrawing) - throw new Error("PolygonBatch is not drawing. Call PolygonBatch.begin() before calling PolygonBatch.end()"); - if (this.verticesLength > 0 || this.indicesLength > 0) - this.flush(); - this.shader = null; - this.lastTexture = null; - this.isDrawing = false; - gl.disable(gl.BLEND); - }; - PolygonBatcher.prototype.getDrawCalls = function () { return this.drawCalls; }; - PolygonBatcher.prototype.dispose = function () { - this.mesh.dispose(); - }; - return PolygonBatcher; - }()); - webgl.PolygonBatcher = PolygonBatcher; - })(webgl = spine.webgl || (spine.webgl = {})); -})(spine || (spine = {})); -var spine; -(function (spine) { - var webgl; - (function (webgl) { - var SceneRenderer = (function () { - function SceneRenderer(canvas, context, twoColorTint) { - if (twoColorTint === void 0) { twoColorTint = true; } - this.twoColorTint = false; - this.activeRenderer = null; - this.QUAD = [ - 0, 0, 1, 1, 1, 1, 0, 0, - 0, 0, 1, 1, 1, 1, 0, 0, - 0, 0, 1, 1, 1, 1, 0, 0, - 0, 0, 1, 1, 1, 1, 0, 0, - ]; - this.QUAD_TRIANGLES = [0, 1, 2, 2, 3, 0]; - this.WHITE = new spine.Color(1, 1, 1, 1); - this.canvas = canvas; - this.context = context instanceof webgl.ManagedWebGLRenderingContext ? context : new webgl.ManagedWebGLRenderingContext(context); - this.twoColorTint = twoColorTint; - this.camera = new webgl.OrthoCamera(canvas.width, canvas.height); - this.batcherShader = twoColorTint ? webgl.Shader.newTwoColoredTextured(this.context) : webgl.Shader.newColoredTextured(this.context); - this.batcher = new webgl.PolygonBatcher(this.context, twoColorTint); - this.shapesShader = webgl.Shader.newColored(this.context); - this.shapes = new webgl.ShapeRenderer(this.context); - this.skeletonRenderer = new webgl.SkeletonRenderer(this.context, twoColorTint); - this.skeletonDebugRenderer = new webgl.SkeletonDebugRenderer(this.context); - } - SceneRenderer.prototype.begin = function () { - this.camera.update(); - this.enableRenderer(this.batcher); - }; - SceneRenderer.prototype.drawSkeleton = function (skeleton, premultipliedAlpha, slotRangeStart, slotRangeEnd) { - if (premultipliedAlpha === void 0) { premultipliedAlpha = false; } - if (slotRangeStart === void 0) { slotRangeStart = -1; } - if (slotRangeEnd === void 0) { slotRangeEnd = -1; } - this.enableRenderer(this.batcher); - this.skeletonRenderer.premultipliedAlpha = premultipliedAlpha; - this.skeletonRenderer.draw(this.batcher, skeleton, slotRangeStart, slotRangeEnd, {}); - }; - SceneRenderer.prototype.drawSkeletonDebug = function (skeleton, premultipliedAlpha, ignoredBones) { - if (premultipliedAlpha === void 0) { premultipliedAlpha = false; } - if (ignoredBones === void 0) { ignoredBones = null; } - this.enableRenderer(this.shapes); - this.skeletonDebugRenderer.premultipliedAlpha = premultipliedAlpha; - this.skeletonDebugRenderer.draw(this.shapes, skeleton, ignoredBones); - }; - SceneRenderer.prototype.drawTexture = function (texture, x, y, width, height, color) { - if (color === void 0) { color = null; } - this.enableRenderer(this.batcher); - if (color === null) - color = this.WHITE; - var quad = this.QUAD; - var i = 0; - quad[i++] = x; - quad[i++] = y; - quad[i++] = color.r; - quad[i++] = color.g; - quad[i++] = color.b; - quad[i++] = color.a; - quad[i++] = 0; - quad[i++] = 1; - if (this.twoColorTint) { - quad[i++] = 0; - quad[i++] = 0; - quad[i++] = 0; - quad[i++] = 0; - } - quad[i++] = x + width; - quad[i++] = y; - quad[i++] = color.r; - quad[i++] = color.g; - quad[i++] = color.b; - quad[i++] = color.a; - quad[i++] = 1; - quad[i++] = 1; - if (this.twoColorTint) { - quad[i++] = 0; - quad[i++] = 0; - quad[i++] = 0; - quad[i++] = 0; - } - quad[i++] = x + width; - quad[i++] = y + height; - quad[i++] = color.r; - quad[i++] = color.g; - quad[i++] = color.b; - quad[i++] = color.a; - quad[i++] = 1; - quad[i++] = 0; - if (this.twoColorTint) { - quad[i++] = 0; - quad[i++] = 0; - quad[i++] = 0; - quad[i++] = 0; - } - quad[i++] = x; - quad[i++] = y + height; - quad[i++] = color.r; - quad[i++] = color.g; - quad[i++] = color.b; - quad[i++] = color.a; - quad[i++] = 0; - quad[i++] = 0; - if (this.twoColorTint) { - quad[i++] = 0; - quad[i++] = 0; - quad[i++] = 0; - quad[i++] = 0; - } - this.batcher.draw(texture, quad, this.QUAD_TRIANGLES); - }; - SceneRenderer.prototype.drawTextureUV = function (texture, x, y, width, height, u, v, u2, v2, color) { - if (color === void 0) { color = null; } - this.enableRenderer(this.batcher); - if (color === null) - color = this.WHITE; - var quad = this.QUAD; - var i = 0; - quad[i++] = x; - quad[i++] = y; - quad[i++] = color.r; - quad[i++] = color.g; - quad[i++] = color.b; - quad[i++] = color.a; - quad[i++] = u; - quad[i++] = v; - if (this.twoColorTint) { - quad[i++] = 0; - quad[i++] = 0; - quad[i++] = 0; - quad[i++] = 0; - } - quad[i++] = x + width; - quad[i++] = y; - quad[i++] = color.r; - quad[i++] = color.g; - quad[i++] = color.b; - quad[i++] = color.a; - quad[i++] = u2; - quad[i++] = v; - if (this.twoColorTint) { - quad[i++] = 0; - quad[i++] = 0; - quad[i++] = 0; - quad[i++] = 0; - } - quad[i++] = x + width; - quad[i++] = y + height; - quad[i++] = color.r; - quad[i++] = color.g; - quad[i++] = color.b; - quad[i++] = color.a; - quad[i++] = u2; - quad[i++] = v2; - if (this.twoColorTint) { - quad[i++] = 0; - quad[i++] = 0; - quad[i++] = 0; - quad[i++] = 0; - } - quad[i++] = x; - quad[i++] = y + height; - quad[i++] = color.r; - quad[i++] = color.g; - quad[i++] = color.b; - quad[i++] = color.a; - quad[i++] = u; - quad[i++] = v2; - if (this.twoColorTint) { - quad[i++] = 0; - quad[i++] = 0; - quad[i++] = 0; - quad[i++] = 0; - } - this.batcher.draw(texture, quad, this.QUAD_TRIANGLES); - }; - SceneRenderer.prototype.drawTextureRotated = function (texture, x, y, width, height, pivotX, pivotY, angle, color, premultipliedAlpha) { - if (color === void 0) { color = null; } - if (premultipliedAlpha === void 0) { premultipliedAlpha = false; } - this.enableRenderer(this.batcher); - if (color === null) - color = this.WHITE; - var quad = this.QUAD; - var worldOriginX = x + pivotX; - var worldOriginY = y + pivotY; - var fx = -pivotX; - var fy = -pivotY; - var fx2 = width - pivotX; - var fy2 = height - pivotY; - var p1x = fx; - var p1y = fy; - var p2x = fx; - var p2y = fy2; - var p3x = fx2; - var p3y = fy2; - var p4x = fx2; - var p4y = fy; - var x1 = 0; - var y1 = 0; - var x2 = 0; - var y2 = 0; - var x3 = 0; - var y3 = 0; - var x4 = 0; - var y4 = 0; - if (angle != 0) { - var cos = spine.MathUtils.cosDeg(angle); - var sin = spine.MathUtils.sinDeg(angle); - x1 = cos * p1x - sin * p1y; - y1 = sin * p1x + cos * p1y; - x4 = cos * p2x - sin * p2y; - y4 = sin * p2x + cos * p2y; - x3 = cos * p3x - sin * p3y; - y3 = sin * p3x + cos * p3y; - x2 = x3 + (x1 - x4); - y2 = y3 + (y1 - y4); - } - else { - x1 = p1x; - y1 = p1y; - x4 = p2x; - y4 = p2y; - x3 = p3x; - y3 = p3y; - x2 = p4x; - y2 = p4y; - } - x1 += worldOriginX; - y1 += worldOriginY; - x2 += worldOriginX; - y2 += worldOriginY; - x3 += worldOriginX; - y3 += worldOriginY; - x4 += worldOriginX; - y4 += worldOriginY; - var i = 0; - quad[i++] = x1; - quad[i++] = y1; - quad[i++] = color.r; - quad[i++] = color.g; - quad[i++] = color.b; - quad[i++] = color.a; - quad[i++] = 0; - quad[i++] = 1; - if (this.twoColorTint) { - quad[i++] = 0; - quad[i++] = 0; - quad[i++] = 0; - quad[i++] = 0; - } - quad[i++] = x2; - quad[i++] = y2; - quad[i++] = color.r; - quad[i++] = color.g; - quad[i++] = color.b; - quad[i++] = color.a; - quad[i++] = 1; - quad[i++] = 1; - if (this.twoColorTint) { - quad[i++] = 0; - quad[i++] = 0; - quad[i++] = 0; - quad[i++] = 0; - } - quad[i++] = x3; - quad[i++] = y3; - quad[i++] = color.r; - quad[i++] = color.g; - quad[i++] = color.b; - quad[i++] = color.a; - quad[i++] = 1; - quad[i++] = 0; - if (this.twoColorTint) { - quad[i++] = 0; - quad[i++] = 0; - quad[i++] = 0; - quad[i++] = 0; - } - quad[i++] = x4; - quad[i++] = y4; - quad[i++] = color.r; - quad[i++] = color.g; - quad[i++] = color.b; - quad[i++] = color.a; - quad[i++] = 0; - quad[i++] = 0; - if (this.twoColorTint) { - quad[i++] = 0; - quad[i++] = 0; - quad[i++] = 0; - quad[i++] = 0; - } - this.batcher.draw(texture, quad, this.QUAD_TRIANGLES); - }; - SceneRenderer.prototype.drawRegion = function (region, x, y, width, height, color, premultipliedAlpha) { - if (color === void 0) { color = null; } - if (premultipliedAlpha === void 0) { premultipliedAlpha = false; } - this.enableRenderer(this.batcher); - if (color === null) - color = this.WHITE; - var quad = this.QUAD; - var i = 0; - quad[i++] = x; - quad[i++] = y; - quad[i++] = color.r; - quad[i++] = color.g; - quad[i++] = color.b; - quad[i++] = color.a; - quad[i++] = region.u; - quad[i++] = region.v2; - if (this.twoColorTint) { - quad[i++] = 0; - quad[i++] = 0; - quad[i++] = 0; - quad[i++] = 0; - } - quad[i++] = x + width; - quad[i++] = y; - quad[i++] = color.r; - quad[i++] = color.g; - quad[i++] = color.b; - quad[i++] = color.a; - quad[i++] = region.u2; - quad[i++] = region.v2; - if (this.twoColorTint) { - quad[i++] = 0; - quad[i++] = 0; - quad[i++] = 0; - quad[i++] = 0; - } - quad[i++] = x + width; - quad[i++] = y + height; - quad[i++] = color.r; - quad[i++] = color.g; - quad[i++] = color.b; - quad[i++] = color.a; - quad[i++] = region.u2; - quad[i++] = region.v; - if (this.twoColorTint) { - quad[i++] = 0; - quad[i++] = 0; - quad[i++] = 0; - quad[i++] = 0; - } - quad[i++] = x; - quad[i++] = y + height; - quad[i++] = color.r; - quad[i++] = color.g; - quad[i++] = color.b; - quad[i++] = color.a; - quad[i++] = region.u; - quad[i++] = region.v; - if (this.twoColorTint) { - quad[i++] = 0; - quad[i++] = 0; - quad[i++] = 0; - quad[i++] = 0; - } - this.batcher.draw(region.texture, quad, this.QUAD_TRIANGLES); - }; - SceneRenderer.prototype.line = function (x, y, x2, y2, color, color2) { - if (color === void 0) { color = null; } - if (color2 === void 0) { color2 = null; } - this.enableRenderer(this.shapes); - this.shapes.line(x, y, x2, y2, color); - }; - SceneRenderer.prototype.triangle = function (filled, x, y, x2, y2, x3, y3, color, color2, color3) { - if (color === void 0) { color = null; } - if (color2 === void 0) { color2 = null; } - if (color3 === void 0) { color3 = null; } - this.enableRenderer(this.shapes); - this.shapes.triangle(filled, x, y, x2, y2, x3, y3, color, color2, color3); - }; - SceneRenderer.prototype.quad = function (filled, x, y, x2, y2, x3, y3, x4, y4, color, color2, color3, color4) { - if (color === void 0) { color = null; } - if (color2 === void 0) { color2 = null; } - if (color3 === void 0) { color3 = null; } - if (color4 === void 0) { color4 = null; } - this.enableRenderer(this.shapes); - this.shapes.quad(filled, x, y, x2, y2, x3, y3, x4, y4, color, color2, color3, color4); - }; - SceneRenderer.prototype.rect = function (filled, x, y, width, height, color) { - if (color === void 0) { color = null; } - this.enableRenderer(this.shapes); - this.shapes.rect(filled, x, y, width, height, color); - }; - SceneRenderer.prototype.rectLine = function (filled, x1, y1, x2, y2, width, color) { - if (color === void 0) { color = null; } - this.enableRenderer(this.shapes); - this.shapes.rectLine(filled, x1, y1, x2, y2, width, color); - }; - SceneRenderer.prototype.polygon = function (polygonVertices, offset, count, color) { - if (color === void 0) { color = null; } - this.enableRenderer(this.shapes); - this.shapes.polygon(polygonVertices, offset, count, color); - }; - SceneRenderer.prototype.circle = function (filled, x, y, radius, color, segments) { - if (color === void 0) { color = null; } - if (segments === void 0) { segments = 0; } - this.enableRenderer(this.shapes); - this.shapes.circle(filled, x, y, radius, color, segments); - }; - SceneRenderer.prototype.curve = function (x1, y1, cx1, cy1, cx2, cy2, x2, y2, segments, color) { - if (color === void 0) { color = null; } - this.enableRenderer(this.shapes); - this.shapes.curve(x1, y1, cx1, cy1, cx2, cy2, x2, y2, segments, color); - }; - SceneRenderer.prototype.end = function () { - if (this.activeRenderer === this.batcher) - this.batcher.end(); - else if (this.activeRenderer === this.shapes) - this.shapes.end(); - this.activeRenderer = null; - }; - SceneRenderer.prototype.resize = function (resizeMode) { - var canvas = this.canvas; - var w = canvas.clientWidth; - var h = canvas.clientHeight; - if (canvas.width != w || canvas.height != h) { - canvas.width = w; - canvas.height = h; - } - this.context.gl.viewport(0, 0, canvas.width, canvas.height); - if (resizeMode === ResizeMode.Stretch) { - } - else if (resizeMode === ResizeMode.Expand) { - this.camera.setViewport(w, h); - } - else if (resizeMode === ResizeMode.Fit) { - var sourceWidth = canvas.width, sourceHeight = canvas.height; - var targetWidth = this.camera.viewportWidth, targetHeight = this.camera.viewportHeight; - var targetRatio = targetHeight / targetWidth; - var sourceRatio = sourceHeight / sourceWidth; - var scale = targetRatio < sourceRatio ? targetWidth / sourceWidth : targetHeight / sourceHeight; - this.camera.viewportWidth = sourceWidth * scale; - this.camera.viewportHeight = sourceHeight * scale; - } - this.camera.update(); - }; - SceneRenderer.prototype.enableRenderer = function (renderer) { - if (this.activeRenderer === renderer) - return; - this.end(); - if (renderer instanceof webgl.PolygonBatcher) { - this.batcherShader.bind(); - this.batcherShader.setUniform4x4f(webgl.Shader.MVP_MATRIX, this.camera.projectionView.values); - this.batcherShader.setUniformi("u_texture", 0); - this.batcher.begin(this.batcherShader); - this.activeRenderer = this.batcher; - } - else if (renderer instanceof webgl.ShapeRenderer) { - this.shapesShader.bind(); - this.shapesShader.setUniform4x4f(webgl.Shader.MVP_MATRIX, this.camera.projectionView.values); - this.shapes.begin(this.shapesShader); - this.activeRenderer = this.shapes; - } - else { - this.activeRenderer = this.skeletonDebugRenderer; - } - }; - SceneRenderer.prototype.dispose = function () { - this.batcher.dispose(); - this.batcherShader.dispose(); - this.shapes.dispose(); - this.shapesShader.dispose(); - this.skeletonDebugRenderer.dispose(); - }; - return SceneRenderer; - }()); - webgl.SceneRenderer = SceneRenderer; - var ResizeMode; - (function (ResizeMode) { - ResizeMode[ResizeMode["Stretch"] = 0] = "Stretch"; - ResizeMode[ResizeMode["Expand"] = 1] = "Expand"; - ResizeMode[ResizeMode["Fit"] = 2] = "Fit"; - })(ResizeMode = webgl.ResizeMode || (webgl.ResizeMode = {})); - })(webgl = spine.webgl || (spine.webgl = {})); -})(spine || (spine = {})); -var spine; -(function (spine) { - var webgl; - (function (webgl) { - var Shader = (function () { - function Shader(context, vertexShader, fragmentShader) { - this.vertexShader = vertexShader; - this.fragmentShader = fragmentShader; - this.vs = null; - this.fs = null; - this.program = null; - this.tmp2x2 = new Float32Array(2 * 2); - this.tmp3x3 = new Float32Array(3 * 3); - this.tmp4x4 = new Float32Array(4 * 4); - this.vsSource = vertexShader; - this.fsSource = fragmentShader; - this.context = context instanceof webgl.ManagedWebGLRenderingContext ? context : new webgl.ManagedWebGLRenderingContext(context); - this.context.addRestorable(this); - this.compile(); - } - Shader.prototype.getProgram = function () { return this.program; }; - Shader.prototype.getVertexShader = function () { return this.vertexShader; }; - Shader.prototype.getFragmentShader = function () { return this.fragmentShader; }; - Shader.prototype.getVertexShaderSource = function () { return this.vsSource; }; - Shader.prototype.getFragmentSource = function () { return this.fsSource; }; - Shader.prototype.compile = function () { - var gl = this.context.gl; - try { - this.vs = this.compileShader(gl.VERTEX_SHADER, this.vertexShader); - this.fs = this.compileShader(gl.FRAGMENT_SHADER, this.fragmentShader); - this.program = this.compileProgram(this.vs, this.fs); - } - catch (e) { - this.dispose(); - throw e; - } - }; - Shader.prototype.compileShader = function (type, source) { - var gl = this.context.gl; - var shader = gl.createShader(type); - gl.shaderSource(shader, source); - gl.compileShader(shader); - if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { - var error = "Couldn't compile shader: " + gl.getShaderInfoLog(shader); - gl.deleteShader(shader); - if (!gl.isContextLost()) - throw new Error(error); - } - return shader; - }; - Shader.prototype.compileProgram = function (vs, fs) { - var gl = this.context.gl; - var program = gl.createProgram(); - gl.attachShader(program, vs); - gl.attachShader(program, fs); - gl.linkProgram(program); - if (!gl.getProgramParameter(program, gl.LINK_STATUS)) { - var error = "Couldn't compile shader program: " + gl.getProgramInfoLog(program); - gl.deleteProgram(program); - if (!gl.isContextLost()) - throw new Error(error); - } - return program; - }; - Shader.prototype.restore = function () { - this.compile(); - }; - Shader.prototype.bind = function () { - this.context.gl.useProgram(this.program); - }; - Shader.prototype.unbind = function () { - this.context.gl.useProgram(null); - }; - Shader.prototype.setUniformi = function (uniform, value) { - this.context.gl.uniform1i(this.getUniformLocation(uniform), value); - }; - Shader.prototype.setUniformf = function (uniform, value) { - this.context.gl.uniform1f(this.getUniformLocation(uniform), value); - }; - Shader.prototype.setUniform2f = function (uniform, value, value2) { - this.context.gl.uniform2f(this.getUniformLocation(uniform), value, value2); - }; - Shader.prototype.setUniform3f = function (uniform, value, value2, value3) { - this.context.gl.uniform3f(this.getUniformLocation(uniform), value, value2, value3); - }; - Shader.prototype.setUniform4f = function (uniform, value, value2, value3, value4) { - this.context.gl.uniform4f(this.getUniformLocation(uniform), value, value2, value3, value4); - }; - Shader.prototype.setUniform2x2f = function (uniform, value) { - var gl = this.context.gl; - this.tmp2x2.set(value); - gl.uniformMatrix2fv(this.getUniformLocation(uniform), false, this.tmp2x2); - }; - Shader.prototype.setUniform3x3f = function (uniform, value) { - var gl = this.context.gl; - this.tmp3x3.set(value); - gl.uniformMatrix3fv(this.getUniformLocation(uniform), false, this.tmp3x3); - }; - Shader.prototype.setUniform4x4f = function (uniform, value) { - var gl = this.context.gl; - this.tmp4x4.set(value); - gl.uniformMatrix4fv(this.getUniformLocation(uniform), false, this.tmp4x4); - }; - Shader.prototype.getUniformLocation = function (uniform) { - var gl = this.context.gl; - var location = gl.getUniformLocation(this.program, uniform); - if (!location && !gl.isContextLost()) - throw new Error("Couldn't find location for uniform " + uniform); - return location; - }; - Shader.prototype.getAttributeLocation = function (attribute) { - var gl = this.context.gl; - var location = gl.getAttribLocation(this.program, attribute); - if (location == -1 && !gl.isContextLost()) - throw new Error("Couldn't find location for attribute " + attribute); - return location; - }; - Shader.prototype.dispose = function () { - this.context.removeRestorable(this); - var gl = this.context.gl; - if (this.vs) { - gl.deleteShader(this.vs); - this.vs = null; - } - if (this.fs) { - gl.deleteShader(this.fs); - this.fs = null; - } - if (this.program) { - gl.deleteProgram(this.program); - this.program = null; - } - }; - Shader.newColoredTextured = function (context) { - var vs = "\n\t\t\t\tattribute vec4 " + Shader.POSITION + ";\n\t\t\t\tattribute vec4 " + Shader.COLOR + ";\n\t\t\t\tattribute vec2 " + Shader.TEXCOORDS + ";\n\t\t\t\tuniform mat4 " + Shader.MVP_MATRIX + ";\n\t\t\t\tvarying vec4 v_color;\n\t\t\t\tvarying vec2 v_texCoords;\n\n\t\t\t\tvoid main () {\n\t\t\t\t\tv_color = " + Shader.COLOR + ";\n\t\t\t\t\tv_texCoords = " + Shader.TEXCOORDS + ";\n\t\t\t\t\tgl_Position = " + Shader.MVP_MATRIX + " * " + Shader.POSITION + ";\n\t\t\t\t}\n\t\t\t"; - var fs = "\n\t\t\t\t#ifdef GL_ES\n\t\t\t\t\t#define LOWP lowp\n\t\t\t\t\tprecision mediump float;\n\t\t\t\t#else\n\t\t\t\t\t#define LOWP\n\t\t\t\t#endif\n\t\t\t\tvarying LOWP vec4 v_color;\n\t\t\t\tvarying vec2 v_texCoords;\n\t\t\t\tuniform sampler2D u_texture;\n\n\t\t\t\tvoid main () {\n\t\t\t\t\tgl_FragColor = v_color * texture2D(u_texture, v_texCoords);\n\t\t\t\t}\n\t\t\t"; - return new Shader(context, vs, fs); - }; - Shader.newTwoColoredTextured = function (context) { - var vs = "\n\t\t\t\tattribute vec4 " + Shader.POSITION + ";\n\t\t\t\tattribute vec4 " + Shader.COLOR + ";\n\t\t\t\tattribute vec4 " + Shader.COLOR2 + ";\n\t\t\t\tattribute vec2 " + Shader.TEXCOORDS + ";\n\t\t\t\tuniform mat4 " + Shader.MVP_MATRIX + ";\n\t\t\t\tvarying vec4 v_light;\n\t\t\t\tvarying vec4 v_dark;\n\t\t\t\tvarying vec2 v_texCoords;\n\n\t\t\t\tvoid main () {\n\t\t\t\t\tv_light = " + Shader.COLOR + ";\n\t\t\t\t\tv_dark = " + Shader.COLOR2 + ";\n\t\t\t\t\tv_texCoords = " + Shader.TEXCOORDS + ";\n\t\t\t\t\tgl_Position = " + Shader.MVP_MATRIX + " * " + Shader.POSITION + ";\n\t\t\t\t}\n\t\t\t"; - var fs = "\n\t\t\t\t#ifdef GL_ES\n\t\t\t\t\t#define LOWP lowp\n\t\t\t\t\tprecision mediump float;\n\t\t\t\t#else\n\t\t\t\t\t#define LOWP\n\t\t\t\t#endif\n\t\t\t\tvarying LOWP vec4 v_light;\n\t\t\t\tvarying LOWP vec4 v_dark;\n\t\t\t\tvarying vec2 v_texCoords;\n\t\t\t\tuniform sampler2D u_texture;\n\t\t\t\tuniform sampler2D u_palette;\n\t\t\t\tuniform float paletteEnable;\n\n\t\t\t\tvoid main () {\n\t\t\t\t\tvec4 texColor = texture2D(u_texture, v_texCoords);\n\t\t\t\t\tif (v_light.a >= 0.0)\n\t\t\t\t\t{\n\t\t\t\t\t\tgl_FragColor.a = texColor.a * v_light.a;\n\t\t\t\t\t\tgl_FragColor.rgb = ((texColor.a - 1.0) * v_dark.a + 1.0 - texColor.rgb) * v_dark.rgb + texColor.rgb * v_light.rgb;\n\t\t\t\t\t} else\n\t\t\t\t\t{\n\t\t\t\t\t\t// float index = ((texColor.r * 31.0)+0.5)/32.0;\n\t\t\t\t\t\tmediump float index = texColor.r + v_light.g;\n\t\t\t\t\t\tmediump float paletteNumber = ((v_light.b * 63.0)+0.5)/64.0;\n\t\t\t\t\t\t// paletteColor\n\t\t\t\t\t\tgl_FragColor = texture2D(u_palette, vec2(index,paletteNumber))*texColor.a;\n\t\t\t\t\t\t// gl_FragColor = texture2D(u_palette, vec2(index,0));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t"; - return new Shader(context, vs, fs); - }; - Shader.newColored = function (context) { - var vs = "\n\t\t\t\tattribute vec4 " + Shader.POSITION + ";\n\t\t\t\tattribute vec4 " + Shader.COLOR + ";\n\t\t\t\tuniform mat4 " + Shader.MVP_MATRIX + ";\n\t\t\t\tvarying vec4 v_color;\n\n\t\t\t\tvoid main () {\n\t\t\t\t\tv_color = " + Shader.COLOR + ";\n\t\t\t\t\tgl_Position = " + Shader.MVP_MATRIX + " * " + Shader.POSITION + ";\n\t\t\t\t}\n\t\t\t"; - var fs = "\n\t\t\t\t#ifdef GL_ES\n\t\t\t\t\t#define LOWP lowp\n\t\t\t\t\tprecision mediump float;\n\t\t\t\t#else\n\t\t\t\t\t#define LOWP\n\t\t\t\t#endif\n\t\t\t\tvarying LOWP vec4 v_color;\n\n\t\t\t\tvoid main () {\n\t\t\t\t\tgl_FragColor = v_color;\n\t\t\t\t}\n\t\t\t"; - return new Shader(context, vs, fs); - }; - Shader.MVP_MATRIX = "u_projTrans"; - Shader.POSITION = "a_position"; - Shader.COLOR = "a_color"; - Shader.COLOR2 = "a_color2"; - Shader.TEXCOORDS = "a_texCoords"; - Shader.SAMPLER = "u_texture"; - return Shader; - }()); - webgl.Shader = Shader; - })(webgl = spine.webgl || (spine.webgl = {})); -})(spine || (spine = {})); -var spine; -(function (spine) { - var webgl; - (function (webgl) { - var ShapeRenderer = (function () { - function ShapeRenderer(context, maxVertices) { - if (maxVertices === void 0) { maxVertices = 10920; } - this.isDrawing = false; - this.shapeType = ShapeType.Filled; - this.color = new spine.Color(1, 1, 1, 1); - this.vertexIndex = 0; - this.tmp = new spine.Vector2(); - if (maxVertices > 10920) - throw new Error("Can't have more than 10920 triangles per batch: " + maxVertices); - this.context = context instanceof webgl.ManagedWebGLRenderingContext ? context : new webgl.ManagedWebGLRenderingContext(context); - this.mesh = new webgl.Mesh(context, [new webgl.Position2Attribute(), new webgl.ColorAttribute()], maxVertices, 0); - this.srcBlend = this.context.gl.SRC_ALPHA; - this.dstBlend = this.context.gl.ONE_MINUS_SRC_ALPHA; - } - ShapeRenderer.prototype.begin = function (shader) { - if (this.isDrawing) - throw new Error("ShapeRenderer.begin() has already been called"); - this.shader = shader; - this.vertexIndex = 0; - this.isDrawing = true; - var gl = this.context.gl; - gl.enable(gl.BLEND); - gl.blendFunc(this.srcBlend, this.dstBlend); - }; - ShapeRenderer.prototype.setBlendMode = function (srcBlend, dstBlend) { - var gl = this.context.gl; - this.srcBlend = srcBlend; - this.dstBlend = dstBlend; - if (this.isDrawing) { - this.flush(); - gl.blendFunc(this.srcBlend, this.dstBlend); - } - }; - ShapeRenderer.prototype.setColor = function (color) { - this.color.setFromColor(color); - }; - ShapeRenderer.prototype.setColorWith = function (r, g, b, a) { - this.color.set(r, g, b, a); - }; - ShapeRenderer.prototype.point = function (x, y, color) { - if (color === void 0) { color = null; } - this.check(ShapeType.Point, 1); - if (color === null) - color = this.color; - this.vertex(x, y, color); - }; - ShapeRenderer.prototype.line = function (x, y, x2, y2, color) { - if (color === void 0) { color = null; } - this.check(ShapeType.Line, 2); - var vertices = this.mesh.getVertices(); - var idx = this.vertexIndex; - if (color === null) - color = this.color; - this.vertex(x, y, color); - this.vertex(x2, y2, color); - }; - ShapeRenderer.prototype.triangle = function (filled, x, y, x2, y2, x3, y3, color, color2, color3) { - if (color === void 0) { color = null; } - if (color2 === void 0) { color2 = null; } - if (color3 === void 0) { color3 = null; } - this.check(filled ? ShapeType.Filled : ShapeType.Line, 3); - var vertices = this.mesh.getVertices(); - var idx = this.vertexIndex; - if (color === null) - color = this.color; - if (color2 === null) - color2 = this.color; - if (color3 === null) - color3 = this.color; - if (filled) { - this.vertex(x, y, color); - this.vertex(x2, y2, color2); - this.vertex(x3, y3, color3); - } - else { - this.vertex(x, y, color); - this.vertex(x2, y2, color2); - this.vertex(x2, y2, color); - this.vertex(x3, y3, color2); - this.vertex(x3, y3, color); - this.vertex(x, y, color2); - } - }; - ShapeRenderer.prototype.quad = function (filled, x, y, x2, y2, x3, y3, x4, y4, color, color2, color3, color4) { - if (color === void 0) { color = null; } - if (color2 === void 0) { color2 = null; } - if (color3 === void 0) { color3 = null; } - if (color4 === void 0) { color4 = null; } - this.check(filled ? ShapeType.Filled : ShapeType.Line, 3); - var vertices = this.mesh.getVertices(); - var idx = this.vertexIndex; - if (color === null) - color = this.color; - if (color2 === null) - color2 = this.color; - if (color3 === null) - color3 = this.color; - if (color4 === null) - color4 = this.color; - if (filled) { - this.vertex(x, y, color); - this.vertex(x2, y2, color2); - this.vertex(x3, y3, color3); - this.vertex(x3, y3, color3); - this.vertex(x4, y4, color4); - this.vertex(x, y, color); - } - else { - this.vertex(x, y, color); - this.vertex(x2, y2, color2); - this.vertex(x2, y2, color2); - this.vertex(x3, y3, color3); - this.vertex(x3, y3, color3); - this.vertex(x4, y4, color4); - this.vertex(x4, y4, color4); - this.vertex(x, y, color); - } - }; - ShapeRenderer.prototype.rect = function (filled, x, y, width, height, color) { - if (color === void 0) { color = null; } - this.quad(filled, x, y, x + width, y, x + width, y + height, x, y + height, color, color, color, color); - }; - ShapeRenderer.prototype.rectLine = function (filled, x1, y1, x2, y2, width, color) { - if (color === void 0) { color = null; } - this.check(filled ? ShapeType.Filled : ShapeType.Line, 8); - if (color === null) - color = this.color; - var t = this.tmp.set(y2 - y1, x1 - x2); - t.normalize(); - width *= 0.5; - var tx = t.x * width; - var ty = t.y * width; - if (!filled) { - this.vertex(x1 + tx, y1 + ty, color); - this.vertex(x1 - tx, y1 - ty, color); - this.vertex(x2 + tx, y2 + ty, color); - this.vertex(x2 - tx, y2 - ty, color); - this.vertex(x2 + tx, y2 + ty, color); - this.vertex(x1 + tx, y1 + ty, color); - this.vertex(x2 - tx, y2 - ty, color); - this.vertex(x1 - tx, y1 - ty, color); - } - else { - this.vertex(x1 + tx, y1 + ty, color); - this.vertex(x1 - tx, y1 - ty, color); - this.vertex(x2 + tx, y2 + ty, color); - this.vertex(x2 - tx, y2 - ty, color); - this.vertex(x2 + tx, y2 + ty, color); - this.vertex(x1 - tx, y1 - ty, color); - } - }; - ShapeRenderer.prototype.x = function (x, y, size) { - this.line(x - size, y - size, x + size, y + size); - this.line(x - size, y + size, x + size, y - size); - }; - ShapeRenderer.prototype.polygon = function (polygonVertices, offset, count, color) { - if (color === void 0) { color = null; } - if (count < 3) - throw new Error("Polygon must contain at least 3 vertices"); - this.check(ShapeType.Line, count * 2); - if (color === null) - color = this.color; - var vertices = this.mesh.getVertices(); - var idx = this.vertexIndex; - offset <<= 1; - count <<= 1; - var firstX = polygonVertices[offset]; - var firstY = polygonVertices[offset + 1]; - var last = offset + count; - for (var i = offset, n = offset + count - 2; i < n; i += 2) { - var x1 = polygonVertices[i]; - var y1 = polygonVertices[i + 1]; - var x2 = 0; - var y2 = 0; - if (i + 2 >= last) { - x2 = firstX; - y2 = firstY; - } - else { - x2 = polygonVertices[i + 2]; - y2 = polygonVertices[i + 3]; - } - this.vertex(x1, y1, color); - this.vertex(x2, y2, color); - } - }; - ShapeRenderer.prototype.circle = function (filled, x, y, radius, color, segments) { - if (color === void 0) { color = null; } - if (segments === void 0) { segments = 0; } - if (segments === 0) - segments = Math.max(1, (6 * spine.MathUtils.cbrt(radius)) | 0); - if (segments <= 0) - throw new Error("segments must be > 0."); - if (color === null) - color = this.color; - var angle = 2 * spine.MathUtils.PI / segments; - var cos = Math.cos(angle); - var sin = Math.sin(angle); - var cx = radius, cy = 0; - if (!filled) { - this.check(ShapeType.Line, segments * 2 + 2); - for (var i = 0; i < segments; i++) { - this.vertex(x + cx, y + cy, color); - var temp_1 = cx; - cx = cos * cx - sin * cy; - cy = sin * temp_1 + cos * cy; - this.vertex(x + cx, y + cy, color); - } - this.vertex(x + cx, y + cy, color); - } - else { - this.check(ShapeType.Filled, segments * 3 + 3); - segments--; - for (var i = 0; i < segments; i++) { - this.vertex(x, y, color); - this.vertex(x + cx, y + cy, color); - var temp_2 = cx; - cx = cos * cx - sin * cy; - cy = sin * temp_2 + cos * cy; - this.vertex(x + cx, y + cy, color); - } - this.vertex(x, y, color); - this.vertex(x + cx, y + cy, color); - } - var temp = cx; - cx = radius; - cy = 0; - this.vertex(x + cx, y + cy, color); - }; - ShapeRenderer.prototype.curve = function (x1, y1, cx1, cy1, cx2, cy2, x2, y2, segments, color) { - if (color === void 0) { color = null; } - this.check(ShapeType.Line, segments * 2 + 2); - if (color === null) - color = this.color; - var subdiv_step = 1 / segments; - var subdiv_step2 = subdiv_step * subdiv_step; - var subdiv_step3 = subdiv_step * subdiv_step * subdiv_step; - var pre1 = 3 * subdiv_step; - var pre2 = 3 * subdiv_step2; - var pre4 = 6 * subdiv_step2; - var pre5 = 6 * subdiv_step3; - var tmp1x = x1 - cx1 * 2 + cx2; - var tmp1y = y1 - cy1 * 2 + cy2; - var tmp2x = (cx1 - cx2) * 3 - x1 + x2; - var tmp2y = (cy1 - cy2) * 3 - y1 + y2; - var fx = x1; - var fy = y1; - var dfx = (cx1 - x1) * pre1 + tmp1x * pre2 + tmp2x * subdiv_step3; - var dfy = (cy1 - y1) * pre1 + tmp1y * pre2 + tmp2y * subdiv_step3; - var ddfx = tmp1x * pre4 + tmp2x * pre5; - var ddfy = tmp1y * pre4 + tmp2y * pre5; - var dddfx = tmp2x * pre5; - var dddfy = tmp2y * pre5; - while (segments-- > 0) { - this.vertex(fx, fy, color); - fx += dfx; - fy += dfy; - dfx += ddfx; - dfy += ddfy; - ddfx += dddfx; - ddfy += dddfy; - this.vertex(fx, fy, color); - } - this.vertex(fx, fy, color); - this.vertex(x2, y2, color); - }; - ShapeRenderer.prototype.vertex = function (x, y, color) { - var idx = this.vertexIndex; - var vertices = this.mesh.getVertices(); - vertices[idx++] = x; - vertices[idx++] = y; - vertices[idx++] = color.r; - vertices[idx++] = color.g; - vertices[idx++] = color.b; - vertices[idx++] = color.a; - this.vertexIndex = idx; - }; - ShapeRenderer.prototype.end = function () { - if (!this.isDrawing) - throw new Error("ShapeRenderer.begin() has not been called"); - this.flush(); - this.context.gl.disable(this.context.gl.BLEND); - this.isDrawing = false; - }; - ShapeRenderer.prototype.flush = function () { - if (this.vertexIndex == 0) - return; - this.mesh.setVerticesLength(this.vertexIndex); - this.mesh.draw(this.shader, this.shapeType); - this.vertexIndex = 0; - }; - ShapeRenderer.prototype.check = function (shapeType, numVertices) { - if (!this.isDrawing) - throw new Error("ShapeRenderer.begin() has not been called"); - if (this.shapeType == shapeType) { - if (this.mesh.maxVertices() - this.mesh.numVertices() < numVertices) - this.flush(); - else - return; - } - else { - this.flush(); - this.shapeType = shapeType; - } - }; - ShapeRenderer.prototype.dispose = function () { - this.mesh.dispose(); - }; - return ShapeRenderer; - }()); - webgl.ShapeRenderer = ShapeRenderer; - var ShapeType; - (function (ShapeType) { - ShapeType[ShapeType["Point"] = 0] = "Point"; - ShapeType[ShapeType["Line"] = 1] = "Line"; - ShapeType[ShapeType["Filled"] = 4] = "Filled"; - })(ShapeType = webgl.ShapeType || (webgl.ShapeType = {})); - })(webgl = spine.webgl || (spine.webgl = {})); -})(spine || (spine = {})); -var spine; -(function (spine) { - var webgl; - (function (webgl) { - var SkeletonDebugRenderer = (function () { - function SkeletonDebugRenderer(context) { - this.boneLineColor = new spine.Color(1, 0, 0, 1); - this.boneOriginColor = new spine.Color(0, 1, 0, 1); - this.attachmentLineColor = new spine.Color(0, 0, 1, 0.5); - this.triangleLineColor = new spine.Color(1, 0.64, 0, 0.5); - this.pathColor = new spine.Color().setFromString("FF7F00"); - this.clipColor = new spine.Color(0.8, 0, 0, 2); - this.aabbColor = new spine.Color(0, 1, 0, 0.5); - this.drawBones = true; - this.drawRegionAttachments = true; - this.drawBoundingBoxes = true; - this.drawMeshHull = true; - this.drawMeshTriangles = true; - this.drawPaths = true; - this.drawSkeletonXY = false; - this.drawClipping = true; - this.premultipliedAlpha = false; - this.scale = 1; - this.boneWidth = 2; - this.bounds = new spine.SkeletonBounds(); - this.temp = new Array(); - this.vertices = spine.Utils.newFloatArray(2 * 1024); - this.context = context instanceof webgl.ManagedWebGLRenderingContext ? context : new webgl.ManagedWebGLRenderingContext(context); - } - SkeletonDebugRenderer.prototype.draw = function (shapes, skeleton, ignoredBones) { - if (ignoredBones === void 0) { ignoredBones = null; } - var skeletonX = skeleton.x; - var skeletonY = skeleton.y; - var gl = this.context.gl; - var srcFunc = this.premultipliedAlpha ? gl.ONE : gl.SRC_ALPHA; - shapes.setBlendMode(srcFunc, gl.ONE_MINUS_SRC_ALPHA); - var bones = skeleton.bones; - if (this.drawBones) { - shapes.setColor(this.boneLineColor); - for (var i = 0, n = bones.length; i < n; i++) { - var bone = bones[i]; - if (ignoredBones && ignoredBones.indexOf(bone.data.name) > -1) - continue; - if (bone.parent == null) - continue; - var x = skeletonX + bone.data.length * bone.a + bone.worldX; - var y = skeletonY + bone.data.length * bone.c + bone.worldY; - shapes.rectLine(true, skeletonX + bone.worldX, skeletonY + bone.worldY, x, y, this.boneWidth * this.scale); - } - if (this.drawSkeletonXY) - shapes.x(skeletonX, skeletonY, 4 * this.scale); - } - if (this.drawRegionAttachments) { - shapes.setColor(this.attachmentLineColor); - var slots = skeleton.slots; - for (var i = 0, n = slots.length; i < n; i++) { - var slot = slots[i]; - var attachment = slot.getAttachment(); - if (attachment instanceof spine.RegionAttachment) { - var regionAttachment = attachment; - var vertices = this.vertices; - regionAttachment.computeWorldVertices(slot.bone, vertices, 0, 2); - shapes.line(vertices[0], vertices[1], vertices[2], vertices[3]); - shapes.line(vertices[2], vertices[3], vertices[4], vertices[5]); - shapes.line(vertices[4], vertices[5], vertices[6], vertices[7]); - shapes.line(vertices[6], vertices[7], vertices[0], vertices[1]); - } - } - } - if (this.drawMeshHull || this.drawMeshTriangles) { - var slots = skeleton.slots; - for (var i = 0, n = slots.length; i < n; i++) { - var slot = slots[i]; - if (!slot.bone.active) - continue; - var attachment = slot.getAttachment(); - if (!(attachment instanceof spine.MeshAttachment)) - continue; - var mesh = attachment; - var vertices = this.vertices; - mesh.computeWorldVertices(slot, 0, mesh.worldVerticesLength, vertices, 0, 2); - var triangles = mesh.triangles; - var hullLength = mesh.hullLength; - if (this.drawMeshTriangles) { - shapes.setColor(this.triangleLineColor); - for (var ii = 0, nn = triangles.length; ii < nn; ii += 3) { - var v1 = triangles[ii] * 2, v2 = triangles[ii + 1] * 2, v3 = triangles[ii + 2] * 2; - shapes.triangle(false, vertices[v1], vertices[v1 + 1], vertices[v2], vertices[v2 + 1], vertices[v3], vertices[v3 + 1]); - } - } - if (this.drawMeshHull && hullLength > 0) { - shapes.setColor(this.attachmentLineColor); - hullLength = (hullLength >> 1) * 2; - var lastX = vertices[hullLength - 2], lastY = vertices[hullLength - 1]; - for (var ii = 0, nn = hullLength; ii < nn; ii += 2) { - var x = vertices[ii], y = vertices[ii + 1]; - shapes.line(x, y, lastX, lastY); - lastX = x; - lastY = y; - } - } - } - } - if (this.drawBoundingBoxes) { - var bounds = this.bounds; - bounds.update(skeleton, true); - shapes.setColor(this.aabbColor); - shapes.rect(false, bounds.minX, bounds.minY, bounds.getWidth(), bounds.getHeight()); - var polygons = bounds.polygons; - var boxes = bounds.boundingBoxes; - for (var i = 0, n = polygons.length; i < n; i++) { - var polygon = polygons[i]; - shapes.setColor(boxes[i].color); - shapes.polygon(polygon, 0, polygon.length); - } - } - if (this.drawPaths) { - var slots = skeleton.slots; - for (var i = 0, n = slots.length; i < n; i++) { - var slot = slots[i]; - if (!slot.bone.active) - continue; - var attachment = slot.getAttachment(); - if (!(attachment instanceof spine.PathAttachment)) - continue; - var path = attachment; - var nn = path.worldVerticesLength; - var world = this.temp = spine.Utils.setArraySize(this.temp, nn, 0); - path.computeWorldVertices(slot, 0, nn, world, 0, 2); - var color = this.pathColor; - var x1 = world[2], y1 = world[3], x2 = 0, y2 = 0; - if (path.closed) { - shapes.setColor(color); - var cx1 = world[0], cy1 = world[1], cx2 = world[nn - 2], cy2 = world[nn - 1]; - x2 = world[nn - 4]; - y2 = world[nn - 3]; - shapes.curve(x1, y1, cx1, cy1, cx2, cy2, x2, y2, 32); - shapes.setColor(SkeletonDebugRenderer.LIGHT_GRAY); - shapes.line(x1, y1, cx1, cy1); - shapes.line(x2, y2, cx2, cy2); - } - nn -= 4; - for (var ii = 4; ii < nn; ii += 6) { - var cx1 = world[ii], cy1 = world[ii + 1], cx2 = world[ii + 2], cy2 = world[ii + 3]; - x2 = world[ii + 4]; - y2 = world[ii + 5]; - shapes.setColor(color); - shapes.curve(x1, y1, cx1, cy1, cx2, cy2, x2, y2, 32); - shapes.setColor(SkeletonDebugRenderer.LIGHT_GRAY); - shapes.line(x1, y1, cx1, cy1); - shapes.line(x2, y2, cx2, cy2); - x1 = x2; - y1 = y2; - } - } - } - if (this.drawBones) { - shapes.setColor(this.boneOriginColor); - for (var i = 0, n = bones.length; i < n; i++) { - var bone = bones[i]; - if (ignoredBones && ignoredBones.indexOf(bone.data.name) > -1) - continue; - shapes.circle(true, skeletonX + bone.worldX, skeletonY + bone.worldY, 3 * this.scale, SkeletonDebugRenderer.GREEN, 8); - } - } - if (this.drawClipping) { - var slots = skeleton.slots; - shapes.setColor(this.clipColor); - for (var i = 0, n = slots.length; i < n; i++) { - var slot = slots[i]; - if (!slot.bone.active) - continue; - var attachment = slot.getAttachment(); - if (!(attachment instanceof spine.ClippingAttachment)) - continue; - var clip = attachment; - var nn = clip.worldVerticesLength; - var world = this.temp = spine.Utils.setArraySize(this.temp, nn, 0); - clip.computeWorldVertices(slot, 0, nn, world, 0, 2); - for (var i_21 = 0, n_3 = world.length; i_21 < n_3; i_21 += 2) { - var x = world[i_21]; - var y = world[i_21 + 1]; - var x2 = world[(i_21 + 2) % world.length]; - var y2 = world[(i_21 + 3) % world.length]; - shapes.line(x, y, x2, y2); - } - } - } - }; - SkeletonDebugRenderer.prototype.dispose = function () { - }; - SkeletonDebugRenderer.LIGHT_GRAY = new spine.Color(192 / 255, 192 / 255, 192 / 255, 1); - SkeletonDebugRenderer.GREEN = new spine.Color(0, 1, 0, 1); - return SkeletonDebugRenderer; - }()); - webgl.SkeletonDebugRenderer = SkeletonDebugRenderer; - })(webgl = spine.webgl || (spine.webgl = {})); -})(spine || (spine = {})); -var spine; -(function (spine) { - var webgl; - (function (webgl) { - var Renderable = (function () { - function Renderable(vertices, numVertices, numFloats) { - this.vertices = vertices; - this.numVertices = numVertices; - this.numFloats = numFloats; - } - return Renderable; - }()); - ; - var SkeletonRenderer = (function () { - function SkeletonRenderer(context, twoColorTint) { - if (twoColorTint === void 0) { twoColorTint = true; } - this.premultipliedAlpha = false; - this.vertexEffect = null; - this.tempColor = new spine.Color(); - this.tempColor2 = new spine.Color(); - this.vertexSize = 2 + 2 + 4; - this.twoColorTint = false; - this.renderable = new Renderable(null, 0, 0); - this.clipper = new spine.SkeletonClipping(); - this.temp = new spine.Vector2(); - this.temp2 = new spine.Vector2(); - this.temp3 = new spine.Color(); - this.temp4 = new spine.Color(); - this.twoColorTint = twoColorTint; - if (twoColorTint) - this.vertexSize += 4; - this.vertices = spine.Utils.newFloatArray(this.vertexSize * 1024); - } - SkeletonRenderer.prototype.draw = function (batcher, skeleton, slotRangeStart, slotRangeEnd, palette) { - if (slotRangeStart === void 0) { slotRangeStart = -1; } - if (slotRangeEnd === void 0) { slotRangeEnd = -1; } - var clipper = this.clipper; - var premultipliedAlpha = this.premultipliedAlpha; - var twoColorTint = this.twoColorTint; - var blendMode = null; - var tempPos = this.temp; - var tempUv = this.temp2; - var tempLight = this.temp3; - var tempDark = this.temp4; - var renderable = this.renderable; - var uvs = null; - var triangles = null; - var drawOrder = skeleton.drawOrder; - var attachmentColor = null; - var skeletonColor = skeleton.color; - var vertexSize = twoColorTint ? 12 : 8; - var inRange = false; - if (slotRangeStart == -1) - inRange = true; - for (var i = 0, n = drawOrder.length; i < n; i++) { - var clippedVertexSize = clipper.isClipping() ? 2 : vertexSize; - var slot = drawOrder[i]; - var paletteIndex = 0; - var paletteOffset = 0; - if (palette.enable) { - if (palette.slotPalette.hasOwnProperty(slot.data.name)) { - paletteIndex = palette.slotPalette[slot.data.name] / palette.paletteNumber; - } - if (palette.slotPaletteOffset.hasOwnProperty(slot.data.name)) { - paletteOffset = palette.slotPaletteOffset[slot.data.name] / palette.indexSize; - } - } - if (!slot.bone.active) { - clipper.clipEndWithSlot(slot); - continue; - } - if (slotRangeStart >= 0 && slotRangeStart == slot.data.index) { - inRange = true; - } - if (!inRange) { - clipper.clipEndWithSlot(slot); - continue; - } - if (slotRangeEnd >= 0 && slotRangeEnd == slot.data.index) { - inRange = false; - } - var slotName = slot.data.name; - var attachment = slot.getAttachment(); - var texture = null; - if (attachment instanceof spine.RegionAttachment) { - var region = attachment; - renderable.vertices = this.vertices; - renderable.numVertices = 4; - renderable.numFloats = clippedVertexSize << 2; - region.computeWorldVertices(slot.bone, renderable.vertices, 0, clippedVertexSize); - triangles = SkeletonRenderer.QUAD_TRIANGLES; - uvs = region.uvs; - texture = region.region.renderObject.texture; - attachmentColor = region.color; - } - else if (attachment instanceof spine.MeshAttachment) { - var mesh = attachment; - renderable.vertices = this.vertices; - renderable.numVertices = (mesh.worldVerticesLength >> 1); - renderable.numFloats = renderable.numVertices * clippedVertexSize; - if (renderable.numFloats > renderable.vertices.length) { - renderable.vertices = this.vertices = spine.Utils.newFloatArray(renderable.numFloats); - } - mesh.computeWorldVertices(slot, 0, mesh.worldVerticesLength, renderable.vertices, 0, clippedVertexSize); - triangles = mesh.triangles; - texture = mesh.region.renderObject.texture; - uvs = mesh.uvs; - attachmentColor = mesh.color; - } - else if (attachment instanceof spine.ClippingAttachment) { - var clip = (attachment); - clipper.clipStart(slot, clip); - continue; - } - else { - clipper.clipEndWithSlot(slot); - continue; - } - if (texture != null) { - var slotColor = slot.color; - var finalColor = this.tempColor; - finalColor.r = skeletonColor.r * slotColor.r * attachmentColor.r; - finalColor.g = skeletonColor.g * slotColor.g * attachmentColor.g; - finalColor.b = skeletonColor.b * slotColor.b * attachmentColor.b; - finalColor.a = skeletonColor.a * slotColor.a * attachmentColor.a; - if (premultipliedAlpha) { - finalColor.r *= finalColor.a; - finalColor.g *= finalColor.a; - finalColor.b *= finalColor.a; - } - var darkColor = this.tempColor2; - if (slot.darkColor == null) - darkColor.set(0, 0, 0, 1.0); - else { - if (premultipliedAlpha) { - darkColor.r = slot.darkColor.r * finalColor.a; - darkColor.g = slot.darkColor.g * finalColor.a; - darkColor.b = slot.darkColor.b * finalColor.a; - } - else { - darkColor.setFromColor(slot.darkColor); - } - darkColor.a = premultipliedAlpha ? 1.0 : 0.0; - } - var slotBlendMode = slot.data.blendMode; - if (slotBlendMode != blendMode) { - blendMode = slotBlendMode; - batcher.setBlendMode(webgl.WebGLBlendModeConverter.getSourceGLBlendMode(blendMode, premultipliedAlpha), webgl.WebGLBlendModeConverter.getDestGLBlendMode(blendMode)); - } - if (clipper.isClipping()) { - clipper.clipTriangles(renderable.vertices, renderable.numFloats, triangles, triangles.length, uvs, finalColor, darkColor, twoColorTint); - var clippedVertices = new Float32Array(clipper.clippedVertices); - var clippedTriangles = clipper.clippedTriangles; - if (this.vertexEffect != null) { - var vertexEffect = this.vertexEffect; - var verts = clippedVertices; - if (!twoColorTint) { - for (var v = 0, n_4 = clippedVertices.length; v < n_4; v += vertexSize) { - tempPos.x = verts[v]; - tempPos.y = verts[v + 1]; - tempLight.set(verts[v + 2], verts[v + 3], verts[v + 4], verts[v + 5]); - tempUv.x = verts[v + 6]; - tempUv.y = verts[v + 7]; - tempDark.set(0, 0, 0, 0); - vertexEffect.transform(tempPos, tempUv, tempLight, tempDark); - verts[v] = tempPos.x; - verts[v + 1] = tempPos.y; - verts[v + 2] = tempLight.r; - verts[v + 3] = tempLight.g; - verts[v + 4] = tempLight.b; - verts[v + 5] = tempLight.a; - verts[v + 6] = tempUv.x; - verts[v + 7] = tempUv.y; - } - } - else { - for (var v = 0, n_5 = clippedVertices.length; v < n_5; v += vertexSize) { - tempPos.x = verts[v]; - tempPos.y = verts[v + 1]; - tempLight.set(verts[v + 2], verts[v + 3], verts[v + 4], verts[v + 5]); - tempUv.x = verts[v + 6]; - tempUv.y = verts[v + 7]; - tempDark.set(verts[v + 8], verts[v + 9], verts[v + 10], verts[v + 11]); - vertexEffect.transform(tempPos, tempUv, tempLight, tempDark); - verts[v] = tempPos.x; - verts[v + 1] = tempPos.y; - verts[v + 2] = tempLight.r; - verts[v + 3] = tempLight.g; - verts[v + 4] = tempLight.b; - verts[v + 5] = tempLight.a; - verts[v + 6] = tempUv.x; - verts[v + 7] = tempUv.y; - verts[v + 8] = tempDark.r; - verts[v + 9] = tempDark.g; - verts[v + 10] = tempDark.b; - verts[v + 11] = tempDark.a; - } - } - } - batcher.draw(texture, clippedVertices, clippedTriangles); - } - else { - var verts = renderable.vertices; - if (this.vertexEffect != null) { - var vertexEffect = this.vertexEffect; - if (!twoColorTint) { - for (var v = 0, u = 0, n_6 = renderable.numFloats; v < n_6; v += vertexSize, u += 2) { - tempPos.x = verts[v]; - tempPos.y = verts[v + 1]; - tempUv.x = uvs[u]; - tempUv.y = uvs[u + 1]; - tempLight.setFromColor(finalColor); - tempDark.set(0, 0, 0, 0); - vertexEffect.transform(tempPos, tempUv, tempLight, tempDark); - verts[v] = tempPos.x; - verts[v + 1] = tempPos.y; - verts[v + 2] = tempLight.r; - verts[v + 3] = tempLight.g; - verts[v + 4] = tempLight.b; - verts[v + 5] = tempLight.a; - verts[v + 6] = tempUv.x; - verts[v + 7] = tempUv.y; - } - } - else { - for (var v = 0, u = 0, n_7 = renderable.numFloats; v < n_7; v += vertexSize, u += 2) { - tempPos.x = verts[v]; - tempPos.y = verts[v + 1]; - tempUv.x = uvs[u]; - tempUv.y = uvs[u + 1]; - tempLight.setFromColor(finalColor); - tempDark.setFromColor(darkColor); - vertexEffect.transform(tempPos, tempUv, tempLight, tempDark); - verts[v] = tempPos.x; - verts[v + 1] = tempPos.y; - verts[v + 2] = tempLight.r; - verts[v + 3] = tempLight.g; - verts[v + 4] = tempLight.b; - verts[v + 5] = tempLight.a; - verts[v + 6] = tempUv.x; - verts[v + 7] = tempUv.y; - verts[v + 8] = tempDark.r; - verts[v + 9] = tempDark.g; - verts[v + 10] = tempDark.b; - verts[v + 11] = tempDark.a; - } - } - } - else { - if (!twoColorTint) { - for (var v = 2, u = 0, n_8 = renderable.numFloats; v < n_8; v += vertexSize, u += 2) { - verts[v] = finalColor.r; - verts[v + 1] = finalColor.g; - verts[v + 2] = finalColor.b; - verts[v + 3] = finalColor.a; - verts[v + 4] = uvs[u]; - verts[v + 5] = uvs[u + 1]; - } - } - else { - for (var v = 2, u = 0, n_9 = renderable.numFloats; v < n_9; v += vertexSize, u += 2) { - verts[v] = finalColor.r; - verts[v + 1] = finalColor.g; - if (palette.enable) { - verts[v + 1] = paletteOffset; - verts[v + 2] = paletteIndex; - verts[v + 3] = -1.0; - } - else { - verts[v + 2] = finalColor.b; - verts[v + 3] = finalColor.a; - } - verts[v + 4] = uvs[u]; - verts[v + 5] = uvs[u + 1]; - verts[v + 6] = darkColor.r; - verts[v + 7] = darkColor.g; - verts[v + 8] = darkColor.b; - verts[v + 9] = darkColor.a; - } - } - } - var view = renderable.vertices.subarray(0, renderable.numFloats); - batcher.draw(texture, view, triangles); - } - } - clipper.clipEndWithSlot(slot); - } - clipper.clipEnd(); - }; - SkeletonRenderer.QUAD_TRIANGLES = [0, 1, 2, 2, 3, 0]; - return SkeletonRenderer; - }()); - webgl.SkeletonRenderer = SkeletonRenderer; - })(webgl = spine.webgl || (spine.webgl = {})); -})(spine || (spine = {})); -var spine; -(function (spine) { - var webgl; - (function (webgl) { - var Vector3 = (function () { - function Vector3(x, y, z) { - if (x === void 0) { x = 0; } - if (y === void 0) { y = 0; } - if (z === void 0) { z = 0; } - this.x = 0; - this.y = 0; - this.z = 0; - this.x = x; - this.y = y; - this.z = z; - } - Vector3.prototype.setFrom = function (v) { - this.x = v.x; - this.y = v.y; - this.z = v.z; - return this; - }; - Vector3.prototype.set = function (x, y, z) { - this.x = x; - this.y = y; - this.z = z; - return this; - }; - Vector3.prototype.add = function (v) { - this.x += v.x; - this.y += v.y; - this.z += v.z; - return this; - }; - Vector3.prototype.sub = function (v) { - this.x -= v.x; - this.y -= v.y; - this.z -= v.z; - return this; - }; - Vector3.prototype.scale = function (s) { - this.x *= s; - this.y *= s; - this.z *= s; - return this; - }; - Vector3.prototype.normalize = function () { - var len = this.length(); - if (len == 0) - return this; - len = 1 / len; - this.x *= len; - this.y *= len; - this.z *= len; - return this; - }; - Vector3.prototype.cross = function (v) { - return this.set(this.y * v.z - this.z * v.y, this.z * v.x - this.x * v.z, this.x * v.y - this.y * v.x); - }; - Vector3.prototype.multiply = function (matrix) { - var l_mat = matrix.values; - return this.set(this.x * l_mat[webgl.M00] + this.y * l_mat[webgl.M01] + this.z * l_mat[webgl.M02] + l_mat[webgl.M03], this.x * l_mat[webgl.M10] + this.y * l_mat[webgl.M11] + this.z * l_mat[webgl.M12] + l_mat[webgl.M13], this.x * l_mat[webgl.M20] + this.y * l_mat[webgl.M21] + this.z * l_mat[webgl.M22] + l_mat[webgl.M23]); - }; - Vector3.prototype.project = function (matrix) { - var l_mat = matrix.values; - var l_w = 1 / (this.x * l_mat[webgl.M30] + this.y * l_mat[webgl.M31] + this.z * l_mat[webgl.M32] + l_mat[webgl.M33]); - return this.set((this.x * l_mat[webgl.M00] + this.y * l_mat[webgl.M01] + this.z * l_mat[webgl.M02] + l_mat[webgl.M03]) * l_w, (this.x * l_mat[webgl.M10] + this.y * l_mat[webgl.M11] + this.z * l_mat[webgl.M12] + l_mat[webgl.M13]) * l_w, (this.x * l_mat[webgl.M20] + this.y * l_mat[webgl.M21] + this.z * l_mat[webgl.M22] + l_mat[webgl.M23]) * l_w); - }; - Vector3.prototype.dot = function (v) { - return this.x * v.x + this.y * v.y + this.z * v.z; - }; - Vector3.prototype.length = function () { - return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z); - }; - Vector3.prototype.distance = function (v) { - var a = v.x - this.x; - var b = v.y - this.y; - var c = v.z - this.z; - return Math.sqrt(a * a + b * b + c * c); - }; - return Vector3; - }()); - webgl.Vector3 = Vector3; - })(webgl = spine.webgl || (spine.webgl = {})); -})(spine || (spine = {})); -var spine; -(function (spine) { - var webgl; - (function (webgl) { - var ManagedWebGLRenderingContext = (function () { - function ManagedWebGLRenderingContext(canvasOrContext, contextConfig) { - if (contextConfig === void 0) { contextConfig = { alpha: "true" }; } - this.restorables = new Array(); - if (!((canvasOrContext instanceof WebGLRenderingContext) || (canvasOrContext instanceof WebGL2RenderingContext))) { - this.setupCanvas(canvasOrContext, contextConfig); - } - else { - this.gl = canvasOrContext; - this.canvas = this.gl.canvas; - } + } } - ManagedWebGLRenderingContext.prototype.setupCanvas = function (canvas, contextConfig) { - var _this = this; - this.gl = (canvas.getContext("webgl2", contextConfig) || canvas.getContext("webgl", contextConfig)); - this.canvas = canvas; - canvas.addEventListener("webglcontextlost", function (e) { - var event = e; - if (e) { - e.preventDefault(); - } - }); - canvas.addEventListener("webglcontextrestored", function (e) { - for (var i = 0, n = _this.restorables.length; i < n; i++) { - _this.restorables[i].restore(); - } - }); - }; - ManagedWebGLRenderingContext.prototype.addRestorable = function (restorable) { - this.restorables.push(restorable); - }; - ManagedWebGLRenderingContext.prototype.removeRestorable = function (restorable) { - var index = this.restorables.indexOf(restorable); - if (index > -1) - this.restorables.splice(index, 1); - }; - return ManagedWebGLRenderingContext; - }()); - webgl.ManagedWebGLRenderingContext = ManagedWebGLRenderingContext; - var WebGLBlendModeConverter = (function () { - function WebGLBlendModeConverter() { + if (this.touch1 && this.touch1.identifier) { + this.touch1 = null; } - WebGLBlendModeConverter.getDestGLBlendMode = function (blendMode) { - switch (blendMode) { - case spine.BlendMode.Normal: return WebGLBlendModeConverter.ONE_MINUS_SRC_ALPHA; - case spine.BlendMode.Additive: return WebGLBlendModeConverter.ONE; - case spine.BlendMode.Multiply: return WebGLBlendModeConverter.ONE_MINUS_SRC_ALPHA; - case spine.BlendMode.Screen: return WebGLBlendModeConverter.ONE_MINUS_SRC_ALPHA; - default: throw new Error("Unknown blend mode: " + blendMode); - } - }; - WebGLBlendModeConverter.getSourceGLBlendMode = function (blendMode, premultipliedAlpha) { - if (premultipliedAlpha === void 0) { premultipliedAlpha = false; } - switch (blendMode) { - case spine.BlendMode.Normal: return premultipliedAlpha ? WebGLBlendModeConverter.ONE : WebGLBlendModeConverter.SRC_ALPHA; - case spine.BlendMode.Additive: return premultipliedAlpha ? WebGLBlendModeConverter.ONE : WebGLBlendModeConverter.SRC_ALPHA; - case spine.BlendMode.Multiply: return WebGLBlendModeConverter.DST_COLOR; - case spine.BlendMode.Screen: return WebGLBlendModeConverter.ONE; - default: throw new Error("Unknown blend mode: " + blendMode); - } - }; - WebGLBlendModeConverter.ZERO = 0; - WebGLBlendModeConverter.ONE = 1; - WebGLBlendModeConverter.SRC_COLOR = 0x0300; - WebGLBlendModeConverter.ONE_MINUS_SRC_COLOR = 0x0301; - WebGLBlendModeConverter.SRC_ALPHA = 0x0302; - WebGLBlendModeConverter.ONE_MINUS_SRC_ALPHA = 0x0303; - WebGLBlendModeConverter.DST_ALPHA = 0x0304; - WebGLBlendModeConverter.ONE_MINUS_DST_ALPHA = 0x0305; - WebGLBlendModeConverter.DST_COLOR = 0x0306; - return WebGLBlendModeConverter; - }()); - webgl.WebGLBlendModeConverter = WebGLBlendModeConverter; - })(webgl = spine.webgl || (spine.webgl = {})); -})(spine || (spine = {})); -//# sourceMappingURL=spine-webgl.js.map \ No newline at end of file + } + } + ev.preventDefault(); + }; + element.addEventListener("touchend", touchEnd, false); + element.addEventListener("touchcancel", touchEnd); + } + addListener(listener) { + this.listeners.push(listener); + } + removeListener(listener) { + let idx = this.listeners.indexOf(listener); + if (idx > -1) { + this.listeners.splice(idx, 1); + } + } + }; + var Touch = class { + constructor(identifier, x, y) { + this.identifier = identifier; + this.x = x; + this.y = y; + } + }; + + // spine-webgl/src/CameraController.ts + var CameraController = class { + constructor(canvas, camera) { + this.canvas = canvas; + this.camera = camera; + let cameraX = 0, cameraY = 0, cameraZoom = 0; + let mouseX = 0, mouseY = 0; + let lastX = 0, lastY = 0; + let initialZoom = 0; + new Input(canvas).addListener({ + down: (x, y) => { + cameraX = camera.position.x; + cameraY = camera.position.y; + mouseX = lastX = x; + mouseY = lastY = y; + initialZoom = camera.zoom; + }, + dragged: (x, y) => { + let deltaX = x - mouseX; + let deltaY = y - mouseY; + let originWorld = camera.screenToWorld(new Vector3(0, 0), canvas.clientWidth, canvas.clientHeight); + let deltaWorld = camera.screenToWorld(new Vector3(deltaX, deltaY), canvas.clientWidth, canvas.clientHeight).sub(originWorld); + camera.position.set(cameraX - deltaWorld.x, cameraY - deltaWorld.y, 0); + camera.update(); + lastX = x; + lastY = y; + }, + wheel: (delta) => { + let zoomAmount = delta / 200 * camera.zoom; + let newZoom = camera.zoom + zoomAmount; + if (newZoom > 0) { + let x = 0, y = 0; + if (delta < 0) { + x = lastX; + y = lastY; + } else { + let viewCenter = new Vector3(canvas.clientWidth / 2 + 15, canvas.clientHeight / 2); + let mouseToCenterX = lastX - viewCenter.x; + let mouseToCenterY = canvas.clientHeight - 1 - lastY - viewCenter.y; + x = viewCenter.x - mouseToCenterX; + y = canvas.clientHeight - 1 - viewCenter.y + mouseToCenterY; + } + let oldDistance = camera.screenToWorld(new Vector3(x, y), canvas.clientWidth, canvas.clientHeight); + camera.zoom = newZoom; + camera.update(); + let newDistance = camera.screenToWorld(new Vector3(x, y), canvas.clientWidth, canvas.clientHeight); + camera.position.add(oldDistance.sub(newDistance)); + camera.update(); + } + }, + zoom: (initialDistance, distance) => { + let newZoom = initialDistance / distance; + camera.zoom = initialZoom * newZoom; + }, + up: (x, y) => { + lastX = x; + lastY = y; + }, + moved: (x, y) => { + lastX = x; + lastY = y; + } + }); + } + }; + + // spine-webgl/src/Shader.ts + var _Shader = class { + constructor(context, vertexShader, fragmentShader) { + this.vertexShader = vertexShader; + this.fragmentShader = fragmentShader; + this.vs = null; + this.fs = null; + this.program = null; + this.tmp2x2 = new Float32Array(2 * 2); + this.tmp3x3 = new Float32Array(3 * 3); + this.tmp4x4 = new Float32Array(4 * 4); + this.vsSource = vertexShader; + this.fsSource = fragmentShader; + this.context = context instanceof ManagedWebGLRenderingContext ? context : new ManagedWebGLRenderingContext(context); + this.context.addRestorable(this); + this.compile(); + } + getProgram() { + return this.program; + } + getVertexShader() { + return this.vertexShader; + } + getFragmentShader() { + return this.fragmentShader; + } + getVertexShaderSource() { + return this.vsSource; + } + getFragmentSource() { + return this.fsSource; + } + compile() { + let gl = this.context.gl; + try { + this.vs = this.compileShader(gl.VERTEX_SHADER, this.vertexShader); + this.fs = this.compileShader(gl.FRAGMENT_SHADER, this.fragmentShader); + this.program = this.compileProgram(this.vs, this.fs); + } catch (e) { + this.dispose(); + throw e; + } + } + compileShader(type, source) { + let gl = this.context.gl; + let shader = gl.createShader(type); + gl.shaderSource(shader, source); + gl.compileShader(shader); + if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { + let error = "Couldn't compile shader: " + gl.getShaderInfoLog(shader); + gl.deleteShader(shader); + if (!gl.isContextLost()) + throw new Error(error); + } + return shader; + } + compileProgram(vs, fs) { + let gl = this.context.gl; + let program = gl.createProgram(); + gl.attachShader(program, vs); + gl.attachShader(program, fs); + gl.linkProgram(program); + if (!gl.getProgramParameter(program, gl.LINK_STATUS)) { + let error = "Couldn't compile shader program: " + gl.getProgramInfoLog(program); + gl.deleteProgram(program); + if (!gl.isContextLost()) + throw new Error(error); + } + return program; + } + restore() { + this.compile(); + } + bind() { + this.context.gl.useProgram(this.program); + } + unbind() { + this.context.gl.useProgram(null); + } + setUniformi(uniform, value) { + this.context.gl.uniform1i(this.getUniformLocation(uniform), value); + } + setUniformf(uniform, value) { + this.context.gl.uniform1f(this.getUniformLocation(uniform), value); + } + setUniform2f(uniform, value, value2) { + this.context.gl.uniform2f(this.getUniformLocation(uniform), value, value2); + } + setUniform3f(uniform, value, value2, value3) { + this.context.gl.uniform3f(this.getUniformLocation(uniform), value, value2, value3); + } + setUniform4f(uniform, value, value2, value3, value4) { + this.context.gl.uniform4f(this.getUniformLocation(uniform), value, value2, value3, value4); + } + setUniform2x2f(uniform, value) { + let gl = this.context.gl; + this.tmp2x2.set(value); + gl.uniformMatrix2fv(this.getUniformLocation(uniform), false, this.tmp2x2); + } + setUniform3x3f(uniform, value) { + let gl = this.context.gl; + this.tmp3x3.set(value); + gl.uniformMatrix3fv(this.getUniformLocation(uniform), false, this.tmp3x3); + } + setUniform4x4f(uniform, value) { + let gl = this.context.gl; + this.tmp4x4.set(value); + gl.uniformMatrix4fv(this.getUniformLocation(uniform), false, this.tmp4x4); + } + getUniformLocation(uniform) { + let gl = this.context.gl; + let location = gl.getUniformLocation(this.program, uniform); + if (!location && !gl.isContextLost()) + throw new Error(`Couldn't find location for uniform ${uniform}`); + return location; + } + getAttributeLocation(attribute) { + let gl = this.context.gl; + let location = gl.getAttribLocation(this.program, attribute); + if (location == -1 && !gl.isContextLost()) + throw new Error(`Couldn't find location for attribute ${attribute}`); + return location; + } + dispose() { + this.context.removeRestorable(this); + let gl = this.context.gl; + if (this.vs) { + gl.deleteShader(this.vs); + this.vs = null; + } + if (this.fs) { + gl.deleteShader(this.fs); + this.fs = null; + } + if (this.program) { + gl.deleteProgram(this.program); + this.program = null; + } + } + static newColoredTextured(context) { + let vs = ` + attribute vec4 ${_Shader.POSITION}; + attribute vec4 ${_Shader.COLOR}; + attribute vec2 ${_Shader.TEXCOORDS}; + uniform mat4 ${_Shader.MVP_MATRIX}; + varying vec4 v_color; + varying vec2 v_texCoords; + + void main () { + v_color = ${_Shader.COLOR}; + v_texCoords = ${_Shader.TEXCOORDS}; + gl_Position = ${_Shader.MVP_MATRIX} * ${_Shader.POSITION}; + } + `; + let fs = ` + #ifdef GL_ES + #define LOWP lowp + precision mediump float; + #else + #define LOWP + #endif + varying LOWP vec4 v_color; + varying vec2 v_texCoords; + uniform sampler2D u_texture; + + void main () { + gl_FragColor = v_color * texture2D(u_texture, v_texCoords); + } + `; + return new _Shader(context, vs, fs); + } + static newTwoColoredTextured(context) { + let vs = ` + attribute vec4 ${_Shader.POSITION}; + attribute vec4 ${_Shader.COLOR}; + attribute vec4 ${_Shader.COLOR2}; + attribute vec2 ${_Shader.TEXCOORDS}; + uniform mat4 ${_Shader.MVP_MATRIX}; + varying vec4 v_light; + varying vec4 v_dark; + varying vec2 v_texCoords; + + void main () { + v_light = ${_Shader.COLOR}; + v_dark = ${_Shader.COLOR2}; + v_texCoords = ${_Shader.TEXCOORDS}; + gl_Position = ${_Shader.MVP_MATRIX} * ${_Shader.POSITION}; + } + `; + let fs = ` + #ifdef GL_ES + #define LOWP lowp + precision mediump float; + #else + #define LOWP + #endif + varying LOWP vec4 v_light; + varying LOWP vec4 v_dark; + varying vec2 v_texCoords; + uniform sampler2D u_texture; + + void main () { + vec4 texColor = texture2D(u_texture, v_texCoords); + gl_FragColor.a = texColor.a * v_light.a; + gl_FragColor.rgb = ((texColor.a - 1.0) * v_dark.a + 1.0 - texColor.rgb) * v_dark.rgb + texColor.rgb * v_light.rgb; + } + `; + return new _Shader(context, vs, fs); + } + static newColored(context) { + let vs = ` + attribute vec4 ${_Shader.POSITION}; + attribute vec4 ${_Shader.COLOR}; + uniform mat4 ${_Shader.MVP_MATRIX}; + varying vec4 v_color; + + void main () { + v_color = ${_Shader.COLOR}; + gl_Position = ${_Shader.MVP_MATRIX} * ${_Shader.POSITION}; + } + `; + let fs = ` + #ifdef GL_ES + #define LOWP lowp + precision mediump float; + #else + #define LOWP + #endif + varying LOWP vec4 v_color; + + void main () { + gl_FragColor = v_color; + } + `; + return new _Shader(context, vs, fs); + } + }; + var Shader = _Shader; + Shader.MVP_MATRIX = "u_projTrans"; + Shader.POSITION = "a_position"; + Shader.COLOR = "a_color"; + Shader.COLOR2 = "a_color2"; + Shader.TEXCOORDS = "a_texCoords"; + Shader.SAMPLER = "u_texture"; + + // spine-webgl/src/Mesh.ts + var Mesh = class { + constructor(context, attributes, maxVertices, maxIndices) { + this.attributes = attributes; + this.verticesLength = 0; + this.dirtyVertices = false; + this.indicesLength = 0; + this.dirtyIndices = false; + this.elementsPerVertex = 0; + this.context = context instanceof ManagedWebGLRenderingContext ? context : new ManagedWebGLRenderingContext(context); + this.elementsPerVertex = 0; + for (let i = 0; i < attributes.length; i++) { + this.elementsPerVertex += attributes[i].numElements; + } + this.vertices = new Float32Array(maxVertices * this.elementsPerVertex); + this.indices = new Uint16Array(maxIndices); + this.context.addRestorable(this); + } + getAttributes() { + return this.attributes; + } + maxVertices() { + return this.vertices.length / this.elementsPerVertex; + } + numVertices() { + return this.verticesLength / this.elementsPerVertex; + } + setVerticesLength(length) { + this.dirtyVertices = true; + this.verticesLength = length; + } + getVertices() { + return this.vertices; + } + maxIndices() { + return this.indices.length; + } + numIndices() { + return this.indicesLength; + } + setIndicesLength(length) { + this.dirtyIndices = true; + this.indicesLength = length; + } + getIndices() { + return this.indices; + } + getVertexSizeInFloats() { + let size = 0; + for (var i = 0; i < this.attributes.length; i++) { + let attribute = this.attributes[i]; + size += attribute.numElements; + } + return size; + } + setVertices(vertices) { + this.dirtyVertices = true; + if (vertices.length > this.vertices.length) + throw Error("Mesh can't store more than " + this.maxVertices() + " vertices"); + this.vertices.set(vertices, 0); + this.verticesLength = vertices.length; + } + setIndices(indices) { + this.dirtyIndices = true; + if (indices.length > this.indices.length) + throw Error("Mesh can't store more than " + this.maxIndices() + " indices"); + this.indices.set(indices, 0); + this.indicesLength = indices.length; + } + draw(shader, primitiveType) { + this.drawWithOffset(shader, primitiveType, 0, this.indicesLength > 0 ? this.indicesLength : this.verticesLength / this.elementsPerVertex); + } + drawWithOffset(shader, primitiveType, offset, count) { + let gl = this.context.gl; + if (this.dirtyVertices || this.dirtyIndices) + this.update(); + this.bind(shader); + if (this.indicesLength > 0) { + gl.drawElements(primitiveType, count, gl.UNSIGNED_SHORT, offset * 2); + } else { + gl.drawArrays(primitiveType, offset, count); + } + this.unbind(shader); + } + bind(shader) { + let gl = this.context.gl; + gl.bindBuffer(gl.ARRAY_BUFFER, this.verticesBuffer); + let offset = 0; + for (let i = 0; i < this.attributes.length; i++) { + let attrib = this.attributes[i]; + let location = shader.getAttributeLocation(attrib.name); + gl.enableVertexAttribArray(location); + gl.vertexAttribPointer(location, attrib.numElements, gl.FLOAT, false, this.elementsPerVertex * 4, offset * 4); + offset += attrib.numElements; + } + if (this.indicesLength > 0) + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indicesBuffer); + } + unbind(shader) { + let gl = this.context.gl; + for (let i = 0; i < this.attributes.length; i++) { + let attrib = this.attributes[i]; + let location = shader.getAttributeLocation(attrib.name); + gl.disableVertexAttribArray(location); + } + gl.bindBuffer(gl.ARRAY_BUFFER, null); + if (this.indicesLength > 0) + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null); + } + update() { + let gl = this.context.gl; + if (this.dirtyVertices) { + if (!this.verticesBuffer) { + this.verticesBuffer = gl.createBuffer(); + } + gl.bindBuffer(gl.ARRAY_BUFFER, this.verticesBuffer); + gl.bufferData(gl.ARRAY_BUFFER, this.vertices.subarray(0, this.verticesLength), gl.DYNAMIC_DRAW); + this.dirtyVertices = false; + } + if (this.dirtyIndices) { + if (!this.indicesBuffer) { + this.indicesBuffer = gl.createBuffer(); + } + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indicesBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.indices.subarray(0, this.indicesLength), gl.DYNAMIC_DRAW); + this.dirtyIndices = false; + } + } + restore() { + this.verticesBuffer = null; + this.indicesBuffer = null; + this.update(); + } + dispose() { + this.context.removeRestorable(this); + let gl = this.context.gl; + gl.deleteBuffer(this.verticesBuffer); + gl.deleteBuffer(this.indicesBuffer); + } + }; + var VertexAttribute = class { + constructor(name, type, numElements) { + this.name = name; + this.type = type; + this.numElements = numElements; + } + }; + var Position2Attribute = class extends VertexAttribute { + constructor() { + super(Shader.POSITION, VertexAttributeType.Float, 2); + } + }; + var Position3Attribute = class extends VertexAttribute { + constructor() { + super(Shader.POSITION, VertexAttributeType.Float, 3); + } + }; + var TexCoordAttribute = class extends VertexAttribute { + constructor(unit = 0) { + super(Shader.TEXCOORDS + (unit == 0 ? "" : unit), VertexAttributeType.Float, 2); + } + }; + var ColorAttribute = class extends VertexAttribute { + constructor() { + super(Shader.COLOR, VertexAttributeType.Float, 4); + } + }; + var Color2Attribute = class extends VertexAttribute { + constructor() { + super(Shader.COLOR2, VertexAttributeType.Float, 4); + } + }; + var VertexAttributeType; + (function(VertexAttributeType2) { + VertexAttributeType2[VertexAttributeType2["Float"] = 0] = "Float"; + })(VertexAttributeType || (VertexAttributeType = {})); + + // spine-webgl/src/PolygonBatcher.ts + var PolygonBatcher = class { + constructor(context, twoColorTint = true, maxVertices = 10920) { + this.isDrawing = false; + this.shader = null; + this.lastTexture = null; + this.verticesLength = 0; + this.indicesLength = 0; + if (maxVertices > 10920) + throw new Error("Can't have more than 10920 triangles per batch: " + maxVertices); + this.context = context instanceof ManagedWebGLRenderingContext ? context : new ManagedWebGLRenderingContext(context); + let attributes = twoColorTint ? [new Position2Attribute(), new ColorAttribute(), new TexCoordAttribute(), new Color2Attribute()] : [new Position2Attribute(), new ColorAttribute(), new TexCoordAttribute()]; + this.mesh = new Mesh(context, attributes, maxVertices, maxVertices * 3); + let gl = this.context.gl; + this.srcColorBlend = gl.SRC_ALPHA; + this.srcAlphaBlend = gl.ONE; + this.dstBlend = gl.ONE_MINUS_SRC_ALPHA; + } + begin(shader) { + if (this.isDrawing) + throw new Error("PolygonBatch is already drawing. Call PolygonBatch.end() before calling PolygonBatch.begin()"); + this.drawCalls = 0; + this.shader = shader; + this.lastTexture = null; + this.isDrawing = true; + let gl = this.context.gl; + gl.enable(gl.BLEND); + gl.blendFuncSeparate(this.srcColorBlend, this.dstBlend, this.srcAlphaBlend, this.dstBlend); + } + setBlendMode(srcColorBlend, srcAlphaBlend, dstBlend) { + if (this.srcColorBlend == srcColorBlend && this.srcAlphaBlend == srcAlphaBlend && this.dstBlend == dstBlend) + return; + this.srcColorBlend = srcColorBlend; + this.srcAlphaBlend = srcAlphaBlend; + this.dstBlend = dstBlend; + if (this.isDrawing) { + this.flush(); + let gl = this.context.gl; + gl.blendFuncSeparate(srcColorBlend, dstBlend, srcAlphaBlend, dstBlend); + } + } + draw(texture, vertices, indices) { + if (texture != this.lastTexture) { + this.flush(); + this.lastTexture = texture; + } else if (this.verticesLength + vertices.length > this.mesh.getVertices().length || this.indicesLength + indices.length > this.mesh.getIndices().length) { + this.flush(); + } + let indexStart = this.mesh.numVertices(); + this.mesh.getVertices().set(vertices, this.verticesLength); + this.verticesLength += vertices.length; + this.mesh.setVerticesLength(this.verticesLength); + let indicesArray = this.mesh.getIndices(); + for (let i = this.indicesLength, j = 0; j < indices.length; i++, j++) + indicesArray[i] = indices[j] + indexStart; + this.indicesLength += indices.length; + this.mesh.setIndicesLength(this.indicesLength); + } + flush() { + if (this.verticesLength == 0) + return; + this.lastTexture.bind(); + this.mesh.draw(this.shader, this.context.gl.TRIANGLES); + this.verticesLength = 0; + this.indicesLength = 0; + this.mesh.setVerticesLength(0); + this.mesh.setIndicesLength(0); + this.drawCalls++; + } + end() { + if (!this.isDrawing) + throw new Error("PolygonBatch is not drawing. Call PolygonBatch.begin() before calling PolygonBatch.end()"); + if (this.verticesLength > 0 || this.indicesLength > 0) + this.flush(); + this.shader = null; + this.lastTexture = null; + this.isDrawing = false; + let gl = this.context.gl; + gl.disable(gl.BLEND); + } + getDrawCalls() { + return this.drawCalls; + } + dispose() { + this.mesh.dispose(); + } + }; + + // spine-webgl/src/ShapeRenderer.ts + var ShapeRenderer = class { + constructor(context, maxVertices = 10920) { + this.isDrawing = false; + this.shapeType = ShapeType.Filled; + this.color = new Color(1, 1, 1, 1); + this.vertexIndex = 0; + this.tmp = new Vector2(); + if (maxVertices > 10920) + throw new Error("Can't have more than 10920 triangles per batch: " + maxVertices); + this.context = context instanceof ManagedWebGLRenderingContext ? context : new ManagedWebGLRenderingContext(context); + this.mesh = new Mesh(context, [new Position2Attribute(), new ColorAttribute()], maxVertices, 0); + let gl = this.context.gl; + this.srcColorBlend = gl.SRC_ALPHA; + this.srcAlphaBlend = gl.ONE; + this.dstBlend = gl.ONE_MINUS_SRC_ALPHA; + } + begin(shader) { + if (this.isDrawing) + throw new Error("ShapeRenderer.begin() has already been called"); + this.shader = shader; + this.vertexIndex = 0; + this.isDrawing = true; + let gl = this.context.gl; + gl.enable(gl.BLEND); + gl.blendFuncSeparate(this.srcColorBlend, this.dstBlend, this.srcAlphaBlend, this.dstBlend); + } + setBlendMode(srcColorBlend, srcAlphaBlend, dstBlend) { + this.srcColorBlend = srcColorBlend; + this.srcAlphaBlend = srcAlphaBlend; + this.dstBlend = dstBlend; + if (this.isDrawing) { + this.flush(); + let gl = this.context.gl; + gl.blendFuncSeparate(srcColorBlend, dstBlend, srcAlphaBlend, dstBlend); + } + } + setColor(color) { + this.color.setFromColor(color); + } + setColorWith(r, g, b, a) { + this.color.set(r, g, b, a); + } + point(x, y, color = null) { + this.check(ShapeType.Point, 1); + if (color === null) + color = this.color; + this.vertex(x, y, color); + } + line(x, y, x2, y2, color = null) { + this.check(ShapeType.Line, 2); + let vertices = this.mesh.getVertices(); + let idx = this.vertexIndex; + if (color === null) + color = this.color; + this.vertex(x, y, color); + this.vertex(x2, y2, color); + } + triangle(filled, x, y, x2, y2, x3, y3, color = null, color2 = null, color3 = null) { + this.check(filled ? ShapeType.Filled : ShapeType.Line, 3); + let vertices = this.mesh.getVertices(); + let idx = this.vertexIndex; + if (color === null) + color = this.color; + if (color2 === null) + color2 = this.color; + if (color3 === null) + color3 = this.color; + if (filled) { + this.vertex(x, y, color); + this.vertex(x2, y2, color2); + this.vertex(x3, y3, color3); + } else { + this.vertex(x, y, color); + this.vertex(x2, y2, color2); + this.vertex(x2, y2, color); + this.vertex(x3, y3, color2); + this.vertex(x3, y3, color); + this.vertex(x, y, color2); + } + } + quad(filled, x, y, x2, y2, x3, y3, x4, y4, color = null, color2 = null, color3 = null, color4 = null) { + this.check(filled ? ShapeType.Filled : ShapeType.Line, 3); + let vertices = this.mesh.getVertices(); + let idx = this.vertexIndex; + if (color === null) + color = this.color; + if (color2 === null) + color2 = this.color; + if (color3 === null) + color3 = this.color; + if (color4 === null) + color4 = this.color; + if (filled) { + this.vertex(x, y, color); + this.vertex(x2, y2, color2); + this.vertex(x3, y3, color3); + this.vertex(x3, y3, color3); + this.vertex(x4, y4, color4); + this.vertex(x, y, color); + } else { + this.vertex(x, y, color); + this.vertex(x2, y2, color2); + this.vertex(x2, y2, color2); + this.vertex(x3, y3, color3); + this.vertex(x3, y3, color3); + this.vertex(x4, y4, color4); + this.vertex(x4, y4, color4); + this.vertex(x, y, color); + } + } + rect(filled, x, y, width, height, color = null) { + this.quad(filled, x, y, x + width, y, x + width, y + height, x, y + height, color, color, color, color); + } + rectLine(filled, x1, y1, x2, y2, width, color = null) { + this.check(filled ? ShapeType.Filled : ShapeType.Line, 8); + if (color === null) + color = this.color; + let t = this.tmp.set(y2 - y1, x1 - x2); + t.normalize(); + width *= 0.5; + let tx = t.x * width; + let ty = t.y * width; + if (!filled) { + this.vertex(x1 + tx, y1 + ty, color); + this.vertex(x1 - tx, y1 - ty, color); + this.vertex(x2 + tx, y2 + ty, color); + this.vertex(x2 - tx, y2 - ty, color); + this.vertex(x2 + tx, y2 + ty, color); + this.vertex(x1 + tx, y1 + ty, color); + this.vertex(x2 - tx, y2 - ty, color); + this.vertex(x1 - tx, y1 - ty, color); + } else { + this.vertex(x1 + tx, y1 + ty, color); + this.vertex(x1 - tx, y1 - ty, color); + this.vertex(x2 + tx, y2 + ty, color); + this.vertex(x2 - tx, y2 - ty, color); + this.vertex(x2 + tx, y2 + ty, color); + this.vertex(x1 - tx, y1 - ty, color); + } + } + x(x, y, size) { + this.line(x - size, y - size, x + size, y + size); + this.line(x - size, y + size, x + size, y - size); + } + polygon(polygonVertices, offset, count, color = null) { + if (count < 3) + throw new Error("Polygon must contain at least 3 vertices"); + this.check(ShapeType.Line, count * 2); + if (color === null) + color = this.color; + let vertices = this.mesh.getVertices(); + let idx = this.vertexIndex; + offset <<= 1; + count <<= 1; + let firstX = polygonVertices[offset]; + let firstY = polygonVertices[offset + 1]; + let last = offset + count; + for (let i = offset, n = offset + count - 2; i < n; i += 2) { + let x1 = polygonVertices[i]; + let y1 = polygonVertices[i + 1]; + let x2 = 0; + let y2 = 0; + if (i + 2 >= last) { + x2 = firstX; + y2 = firstY; + } else { + x2 = polygonVertices[i + 2]; + y2 = polygonVertices[i + 3]; + } + this.vertex(x1, y1, color); + this.vertex(x2, y2, color); + } + } + circle(filled, x, y, radius, color = null, segments = 0) { + if (segments === 0) + segments = Math.max(1, 6 * MathUtils.cbrt(radius) | 0); + if (segments <= 0) + throw new Error("segments must be > 0."); + if (color === null) + color = this.color; + let angle = 2 * MathUtils.PI / segments; + let cos = Math.cos(angle); + let sin = Math.sin(angle); + let cx = radius, cy = 0; + if (!filled) { + this.check(ShapeType.Line, segments * 2 + 2); + for (let i = 0; i < segments; i++) { + this.vertex(x + cx, y + cy, color); + let temp2 = cx; + cx = cos * cx - sin * cy; + cy = sin * temp2 + cos * cy; + this.vertex(x + cx, y + cy, color); + } + this.vertex(x + cx, y + cy, color); + } else { + this.check(ShapeType.Filled, segments * 3 + 3); + segments--; + for (let i = 0; i < segments; i++) { + this.vertex(x, y, color); + this.vertex(x + cx, y + cy, color); + let temp2 = cx; + cx = cos * cx - sin * cy; + cy = sin * temp2 + cos * cy; + this.vertex(x + cx, y + cy, color); + } + this.vertex(x, y, color); + this.vertex(x + cx, y + cy, color); + } + let temp = cx; + cx = radius; + cy = 0; + this.vertex(x + cx, y + cy, color); + } + curve(x1, y1, cx1, cy1, cx2, cy2, x2, y2, segments, color = null) { + this.check(ShapeType.Line, segments * 2 + 2); + if (color === null) + color = this.color; + let subdiv_step = 1 / segments; + let subdiv_step2 = subdiv_step * subdiv_step; + let subdiv_step3 = subdiv_step * subdiv_step * subdiv_step; + let pre1 = 3 * subdiv_step; + let pre2 = 3 * subdiv_step2; + let pre4 = 6 * subdiv_step2; + let pre5 = 6 * subdiv_step3; + let tmp1x = x1 - cx1 * 2 + cx2; + let tmp1y = y1 - cy1 * 2 + cy2; + let tmp2x = (cx1 - cx2) * 3 - x1 + x2; + let tmp2y = (cy1 - cy2) * 3 - y1 + y2; + let fx = x1; + let fy = y1; + let dfx = (cx1 - x1) * pre1 + tmp1x * pre2 + tmp2x * subdiv_step3; + let dfy = (cy1 - y1) * pre1 + tmp1y * pre2 + tmp2y * subdiv_step3; + let ddfx = tmp1x * pre4 + tmp2x * pre5; + let ddfy = tmp1y * pre4 + tmp2y * pre5; + let dddfx = tmp2x * pre5; + let dddfy = tmp2y * pre5; + while (segments-- > 0) { + this.vertex(fx, fy, color); + fx += dfx; + fy += dfy; + dfx += ddfx; + dfy += ddfy; + ddfx += dddfx; + ddfy += dddfy; + this.vertex(fx, fy, color); + } + this.vertex(fx, fy, color); + this.vertex(x2, y2, color); + } + vertex(x, y, color) { + let idx = this.vertexIndex; + let vertices = this.mesh.getVertices(); + vertices[idx++] = x; + vertices[idx++] = y; + vertices[idx++] = color.r; + vertices[idx++] = color.g; + vertices[idx++] = color.b; + vertices[idx++] = color.a; + this.vertexIndex = idx; + } + end() { + if (!this.isDrawing) + throw new Error("ShapeRenderer.begin() has not been called"); + this.flush(); + let gl = this.context.gl; + gl.disable(gl.BLEND); + this.isDrawing = false; + } + flush() { + if (this.vertexIndex == 0) + return; + this.mesh.setVerticesLength(this.vertexIndex); + this.mesh.draw(this.shader, this.shapeType); + this.vertexIndex = 0; + } + check(shapeType, numVertices) { + if (!this.isDrawing) + throw new Error("ShapeRenderer.begin() has not been called"); + if (this.shapeType == shapeType) { + if (this.mesh.maxVertices() - this.mesh.numVertices() < numVertices) + this.flush(); + else + return; + } else { + this.flush(); + this.shapeType = shapeType; + } + } + dispose() { + this.mesh.dispose(); + } + }; + var ShapeType; + (function(ShapeType2) { + ShapeType2[ShapeType2["Point"] = 0] = "Point"; + ShapeType2[ShapeType2["Line"] = 1] = "Line"; + ShapeType2[ShapeType2["Filled"] = 4] = "Filled"; + })(ShapeType || (ShapeType = {})); + + // spine-webgl/src/SkeletonDebugRenderer.ts + var _SkeletonDebugRenderer = class { + constructor(context) { + this.boneLineColor = new Color(1, 0, 0, 1); + this.boneOriginColor = new Color(0, 1, 0, 1); + this.attachmentLineColor = new Color(0, 0, 1, 0.5); + this.triangleLineColor = new Color(1, 0.64, 0, 0.5); + this.pathColor = new Color().setFromString("FF7F00"); + this.clipColor = new Color(0.8, 0, 0, 2); + this.aabbColor = new Color(0, 1, 0, 0.5); + this.drawBones = true; + this.drawRegionAttachments = true; + this.drawBoundingBoxes = true; + this.drawMeshHull = true; + this.drawMeshTriangles = true; + this.drawPaths = true; + this.drawSkeletonXY = false; + this.drawClipping = true; + this.premultipliedAlpha = false; + this.scale = 1; + this.boneWidth = 2; + this.bounds = new SkeletonBounds(); + this.temp = new Array(); + this.vertices = Utils.newFloatArray(2 * 1024); + this.context = context instanceof ManagedWebGLRenderingContext ? context : new ManagedWebGLRenderingContext(context); + } + draw(shapes, skeleton, ignoredBones = null) { + let skeletonX = skeleton.x; + let skeletonY = skeleton.y; + let gl = this.context.gl; + let srcFunc = this.premultipliedAlpha ? gl.ONE : gl.SRC_ALPHA; + shapes.setBlendMode(srcFunc, gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + let bones = skeleton.bones; + if (this.drawBones) { + shapes.setColor(this.boneLineColor); + for (let i = 0, n = bones.length; i < n; i++) { + let bone = bones[i]; + if (ignoredBones && ignoredBones.indexOf(bone.data.name) > -1) + continue; + if (!bone.parent) + continue; + let x = skeletonX + bone.data.length * bone.a + bone.worldX; + let y = skeletonY + bone.data.length * bone.c + bone.worldY; + shapes.rectLine(true, skeletonX + bone.worldX, skeletonY + bone.worldY, x, y, this.boneWidth * this.scale); + } + if (this.drawSkeletonXY) + shapes.x(skeletonX, skeletonY, 4 * this.scale); + } + if (this.drawRegionAttachments) { + shapes.setColor(this.attachmentLineColor); + let slots = skeleton.slots; + for (let i = 0, n = slots.length; i < n; i++) { + let slot = slots[i]; + let attachment = slot.getAttachment(); + if (attachment instanceof RegionAttachment) { + let regionAttachment = attachment; + let vertices = this.vertices; + regionAttachment.computeWorldVertices(slot.bone, vertices, 0, 2); + shapes.line(vertices[0], vertices[1], vertices[2], vertices[3]); + shapes.line(vertices[2], vertices[3], vertices[4], vertices[5]); + shapes.line(vertices[4], vertices[5], vertices[6], vertices[7]); + shapes.line(vertices[6], vertices[7], vertices[0], vertices[1]); + } + } + } + if (this.drawMeshHull || this.drawMeshTriangles) { + let slots = skeleton.slots; + for (let i = 0, n = slots.length; i < n; i++) { + let slot = slots[i]; + if (!slot.bone.active) + continue; + let attachment = slot.getAttachment(); + if (!(attachment instanceof MeshAttachment)) + continue; + let mesh = attachment; + let vertices = this.vertices; + mesh.computeWorldVertices(slot, 0, mesh.worldVerticesLength, vertices, 0, 2); + let triangles = mesh.triangles; + let hullLength = mesh.hullLength; + if (this.drawMeshTriangles) { + shapes.setColor(this.triangleLineColor); + for (let ii = 0, nn = triangles.length; ii < nn; ii += 3) { + let v1 = triangles[ii] * 2, v2 = triangles[ii + 1] * 2, v3 = triangles[ii + 2] * 2; + shapes.triangle(false, vertices[v1], vertices[v1 + 1], vertices[v2], vertices[v2 + 1], vertices[v3], vertices[v3 + 1]); + } + } + if (this.drawMeshHull && hullLength > 0) { + shapes.setColor(this.attachmentLineColor); + hullLength = (hullLength >> 1) * 2; + let lastX = vertices[hullLength - 2], lastY = vertices[hullLength - 1]; + for (let ii = 0, nn = hullLength; ii < nn; ii += 2) { + let x = vertices[ii], y = vertices[ii + 1]; + shapes.line(x, y, lastX, lastY); + lastX = x; + lastY = y; + } + } + } + } + if (this.drawBoundingBoxes) { + let bounds = this.bounds; + bounds.update(skeleton, true); + shapes.setColor(this.aabbColor); + shapes.rect(false, bounds.minX, bounds.minY, bounds.getWidth(), bounds.getHeight()); + let polygons = bounds.polygons; + let boxes = bounds.boundingBoxes; + for (let i = 0, n = polygons.length; i < n; i++) { + let polygon = polygons[i]; + shapes.setColor(boxes[i].color); + shapes.polygon(polygon, 0, polygon.length); + } + } + if (this.drawPaths) { + let slots = skeleton.slots; + for (let i = 0, n = slots.length; i < n; i++) { + let slot = slots[i]; + if (!slot.bone.active) + continue; + let attachment = slot.getAttachment(); + if (!(attachment instanceof PathAttachment)) + continue; + let path = attachment; + let nn = path.worldVerticesLength; + let world = this.temp = Utils.setArraySize(this.temp, nn, 0); + path.computeWorldVertices(slot, 0, nn, world, 0, 2); + let color = this.pathColor; + let x1 = world[2], y1 = world[3], x2 = 0, y2 = 0; + if (path.closed) { + shapes.setColor(color); + let cx1 = world[0], cy1 = world[1], cx2 = world[nn - 2], cy2 = world[nn - 1]; + x2 = world[nn - 4]; + y2 = world[nn - 3]; + shapes.curve(x1, y1, cx1, cy1, cx2, cy2, x2, y2, 32); + shapes.setColor(_SkeletonDebugRenderer.LIGHT_GRAY); + shapes.line(x1, y1, cx1, cy1); + shapes.line(x2, y2, cx2, cy2); + } + nn -= 4; + for (let ii = 4; ii < nn; ii += 6) { + let cx1 = world[ii], cy1 = world[ii + 1], cx2 = world[ii + 2], cy2 = world[ii + 3]; + x2 = world[ii + 4]; + y2 = world[ii + 5]; + shapes.setColor(color); + shapes.curve(x1, y1, cx1, cy1, cx2, cy2, x2, y2, 32); + shapes.setColor(_SkeletonDebugRenderer.LIGHT_GRAY); + shapes.line(x1, y1, cx1, cy1); + shapes.line(x2, y2, cx2, cy2); + x1 = x2; + y1 = y2; + } + } + } + if (this.drawBones) { + shapes.setColor(this.boneOriginColor); + for (let i = 0, n = bones.length; i < n; i++) { + let bone = bones[i]; + if (ignoredBones && ignoredBones.indexOf(bone.data.name) > -1) + continue; + shapes.circle(true, skeletonX + bone.worldX, skeletonY + bone.worldY, 3 * this.scale, _SkeletonDebugRenderer.GREEN, 8); + } + } + if (this.drawClipping) { + let slots = skeleton.slots; + shapes.setColor(this.clipColor); + for (let i = 0, n = slots.length; i < n; i++) { + let slot = slots[i]; + if (!slot.bone.active) + continue; + let attachment = slot.getAttachment(); + if (!(attachment instanceof ClippingAttachment)) + continue; + let clip = attachment; + let nn = clip.worldVerticesLength; + let world = this.temp = Utils.setArraySize(this.temp, nn, 0); + clip.computeWorldVertices(slot, 0, nn, world, 0, 2); + for (let i2 = 0, n2 = world.length; i2 < n2; i2 += 2) { + let x = world[i2]; + let y = world[i2 + 1]; + let x2 = world[(i2 + 2) % world.length]; + let y2 = world[(i2 + 3) % world.length]; + shapes.line(x, y, x2, y2); + } + } + } + } + dispose() { + } + }; + var SkeletonDebugRenderer = _SkeletonDebugRenderer; + SkeletonDebugRenderer.LIGHT_GRAY = new Color(192 / 255, 192 / 255, 192 / 255, 1); + SkeletonDebugRenderer.GREEN = new Color(0, 1, 0, 1); + + // spine-webgl/src/SkeletonRenderer.ts + var Renderable = class { + constructor(vertices, numVertices, numFloats) { + this.vertices = vertices; + this.numVertices = numVertices; + this.numFloats = numFloats; + } + }; + var _SkeletonRenderer = class { + constructor(context, twoColorTint = true) { + this.premultipliedAlpha = false; + this.vertexEffect = null; + this.tempColor = new Color(); + this.tempColor2 = new Color(); + this.vertexSize = 2 + 2 + 4; + this.twoColorTint = false; + this.renderable = new Renderable(null, 0, 0); + this.clipper = new SkeletonClipping(); + this.temp = new Vector2(); + this.temp2 = new Vector2(); + this.temp3 = new Color(); + this.temp4 = new Color(); + this.twoColorTint = twoColorTint; + if (twoColorTint) + this.vertexSize += 4; + this.vertices = Utils.newFloatArray(this.vertexSize * 1024); + } + draw(batcher, skeleton, slotRangeStart = -1, slotRangeEnd = -1) { + let clipper = this.clipper; + let premultipliedAlpha = this.premultipliedAlpha; + let twoColorTint = this.twoColorTint; + let blendMode = null; + let tempPos = this.temp; + let tempUv = this.temp2; + let tempLight = this.temp3; + let tempDark = this.temp4; + let renderable = this.renderable; + let uvs = null; + let triangles = null; + let drawOrder = skeleton.drawOrder; + let attachmentColor = null; + let skeletonColor = skeleton.color; + let vertexSize = twoColorTint ? 12 : 8; + let inRange = false; + if (slotRangeStart == -1) + inRange = true; + for (let i = 0, n = drawOrder.length; i < n; i++) { + let clippedVertexSize = clipper.isClipping() ? 2 : vertexSize; + let slot = drawOrder[i]; + if (!slot.bone.active) { + clipper.clipEndWithSlot(slot); + continue; + } + if (slotRangeStart >= 0 && slotRangeStart == slot.data.index) { + inRange = true; + } + if (!inRange) { + clipper.clipEndWithSlot(slot); + continue; + } + if (slotRangeEnd >= 0 && slotRangeEnd == slot.data.index) { + inRange = false; + } + let attachment = slot.getAttachment(); + let texture = null; + if (attachment instanceof RegionAttachment) { + let region = attachment; + renderable.vertices = this.vertices; + renderable.numVertices = 4; + renderable.numFloats = clippedVertexSize << 2; + region.computeWorldVertices(slot.bone, renderable.vertices, 0, clippedVertexSize); + triangles = _SkeletonRenderer.QUAD_TRIANGLES; + uvs = region.uvs; + texture = region.region.renderObject.page.texture; + attachmentColor = region.color; + } else if (attachment instanceof MeshAttachment) { + let mesh = attachment; + renderable.vertices = this.vertices; + renderable.numVertices = mesh.worldVerticesLength >> 1; + renderable.numFloats = renderable.numVertices * clippedVertexSize; + if (renderable.numFloats > renderable.vertices.length) { + renderable.vertices = this.vertices = Utils.newFloatArray(renderable.numFloats); + } + mesh.computeWorldVertices(slot, 0, mesh.worldVerticesLength, renderable.vertices, 0, clippedVertexSize); + triangles = mesh.triangles; + texture = mesh.region.renderObject.page.texture; + uvs = mesh.uvs; + attachmentColor = mesh.color; + } else if (attachment instanceof ClippingAttachment) { + let clip = attachment; + clipper.clipStart(slot, clip); + continue; + } else { + clipper.clipEndWithSlot(slot); + continue; + } + if (texture) { + let slotColor = slot.color; + let finalColor = this.tempColor; + finalColor.r = skeletonColor.r * slotColor.r * attachmentColor.r; + finalColor.g = skeletonColor.g * slotColor.g * attachmentColor.g; + finalColor.b = skeletonColor.b * slotColor.b * attachmentColor.b; + finalColor.a = skeletonColor.a * slotColor.a * attachmentColor.a; + if (premultipliedAlpha) { + finalColor.r *= finalColor.a; + finalColor.g *= finalColor.a; + finalColor.b *= finalColor.a; + } + let darkColor = this.tempColor2; + if (!slot.darkColor) + darkColor.set(0, 0, 0, 1); + else { + if (premultipliedAlpha) { + darkColor.r = slot.darkColor.r * finalColor.a; + darkColor.g = slot.darkColor.g * finalColor.a; + darkColor.b = slot.darkColor.b * finalColor.a; + } else { + darkColor.setFromColor(slot.darkColor); + } + darkColor.a = premultipliedAlpha ? 1 : 0; + } + let slotBlendMode = slot.data.blendMode; + if (slotBlendMode != blendMode) { + blendMode = slotBlendMode; + batcher.setBlendMode(WebGLBlendModeConverter.getSourceColorGLBlendMode(blendMode, premultipliedAlpha), WebGLBlendModeConverter.getSourceAlphaGLBlendMode(blendMode), WebGLBlendModeConverter.getDestGLBlendMode(blendMode)); + } + if (clipper.isClipping()) { + clipper.clipTriangles(renderable.vertices, renderable.numFloats, triangles, triangles.length, uvs, finalColor, darkColor, twoColorTint); + let clippedVertices = new Float32Array(clipper.clippedVertices); + let clippedTriangles = clipper.clippedTriangles; + if (this.vertexEffect) { + let vertexEffect = this.vertexEffect; + let verts = clippedVertices; + if (!twoColorTint) { + for (let v = 0, n2 = clippedVertices.length; v < n2; v += vertexSize) { + tempPos.x = verts[v]; + tempPos.y = verts[v + 1]; + tempLight.set(verts[v + 2], verts[v + 3], verts[v + 4], verts[v + 5]); + tempUv.x = verts[v + 6]; + tempUv.y = verts[v + 7]; + tempDark.set(0, 0, 0, 0); + vertexEffect.transform(tempPos, tempUv, tempLight, tempDark); + verts[v] = tempPos.x; + verts[v + 1] = tempPos.y; + verts[v + 2] = tempLight.r; + verts[v + 3] = tempLight.g; + verts[v + 4] = tempLight.b; + verts[v + 5] = tempLight.a; + verts[v + 6] = tempUv.x; + verts[v + 7] = tempUv.y; + } + } else { + for (let v = 0, n2 = clippedVertices.length; v < n2; v += vertexSize) { + tempPos.x = verts[v]; + tempPos.y = verts[v + 1]; + tempLight.set(verts[v + 2], verts[v + 3], verts[v + 4], verts[v + 5]); + tempUv.x = verts[v + 6]; + tempUv.y = verts[v + 7]; + tempDark.set(verts[v + 8], verts[v + 9], verts[v + 10], verts[v + 11]); + vertexEffect.transform(tempPos, tempUv, tempLight, tempDark); + verts[v] = tempPos.x; + verts[v + 1] = tempPos.y; + verts[v + 2] = tempLight.r; + verts[v + 3] = tempLight.g; + verts[v + 4] = tempLight.b; + verts[v + 5] = tempLight.a; + verts[v + 6] = tempUv.x; + verts[v + 7] = tempUv.y; + verts[v + 8] = tempDark.r; + verts[v + 9] = tempDark.g; + verts[v + 10] = tempDark.b; + verts[v + 11] = tempDark.a; + } + } + } + batcher.draw(texture, clippedVertices, clippedTriangles); + } else { + let verts = renderable.vertices; + if (this.vertexEffect) { + let vertexEffect = this.vertexEffect; + if (!twoColorTint) { + for (let v = 0, u = 0, n2 = renderable.numFloats; v < n2; v += vertexSize, u += 2) { + tempPos.x = verts[v]; + tempPos.y = verts[v + 1]; + tempUv.x = uvs[u]; + tempUv.y = uvs[u + 1]; + tempLight.setFromColor(finalColor); + tempDark.set(0, 0, 0, 0); + vertexEffect.transform(tempPos, tempUv, tempLight, tempDark); + verts[v] = tempPos.x; + verts[v + 1] = tempPos.y; + verts[v + 2] = tempLight.r; + verts[v + 3] = tempLight.g; + verts[v + 4] = tempLight.b; + verts[v + 5] = tempLight.a; + verts[v + 6] = tempUv.x; + verts[v + 7] = tempUv.y; + } + } else { + for (let v = 0, u = 0, n2 = renderable.numFloats; v < n2; v += vertexSize, u += 2) { + tempPos.x = verts[v]; + tempPos.y = verts[v + 1]; + tempUv.x = uvs[u]; + tempUv.y = uvs[u + 1]; + tempLight.setFromColor(finalColor); + tempDark.setFromColor(darkColor); + vertexEffect.transform(tempPos, tempUv, tempLight, tempDark); + verts[v] = tempPos.x; + verts[v + 1] = tempPos.y; + verts[v + 2] = tempLight.r; + verts[v + 3] = tempLight.g; + verts[v + 4] = tempLight.b; + verts[v + 5] = tempLight.a; + verts[v + 6] = tempUv.x; + verts[v + 7] = tempUv.y; + verts[v + 8] = tempDark.r; + verts[v + 9] = tempDark.g; + verts[v + 10] = tempDark.b; + verts[v + 11] = tempDark.a; + } + } + } else { + if (!twoColorTint) { + for (let v = 2, u = 0, n2 = renderable.numFloats; v < n2; v += vertexSize, u += 2) { + verts[v] = finalColor.r; + verts[v + 1] = finalColor.g; + verts[v + 2] = finalColor.b; + verts[v + 3] = finalColor.a; + verts[v + 4] = uvs[u]; + verts[v + 5] = uvs[u + 1]; + } + } else { + for (let v = 2, u = 0, n2 = renderable.numFloats; v < n2; v += vertexSize, u += 2) { + verts[v] = finalColor.r; + verts[v + 1] = finalColor.g; + verts[v + 2] = finalColor.b; + verts[v + 3] = finalColor.a; + verts[v + 4] = uvs[u]; + verts[v + 5] = uvs[u + 1]; + verts[v + 6] = darkColor.r; + verts[v + 7] = darkColor.g; + verts[v + 8] = darkColor.b; + verts[v + 9] = darkColor.a; + } + } + } + let view = renderable.vertices.subarray(0, renderable.numFloats); + batcher.draw(texture, view, triangles); + } + } + clipper.clipEndWithSlot(slot); + } + clipper.clipEnd(); + } + }; + var SkeletonRenderer = _SkeletonRenderer; + SkeletonRenderer.QUAD_TRIANGLES = [0, 1, 2, 2, 3, 0]; + + // spine-webgl/src/SceneRenderer.ts + var quad = [ + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0 + ]; + var QUAD_TRIANGLES = [0, 1, 2, 2, 3, 0]; + var WHITE = new Color(1, 1, 1, 1); + var SceneRenderer = class { + constructor(canvas, context, twoColorTint = true) { + this.twoColorTint = false; + this.canvas = canvas; + this.context = context instanceof ManagedWebGLRenderingContext ? context : new ManagedWebGLRenderingContext(context); + this.twoColorTint = twoColorTint; + this.camera = new OrthoCamera(canvas.width, canvas.height); + this.batcherShader = twoColorTint ? Shader.newTwoColoredTextured(this.context) : Shader.newColoredTextured(this.context); + this.batcher = new PolygonBatcher(this.context, twoColorTint); + this.shapesShader = Shader.newColored(this.context); + this.shapes = new ShapeRenderer(this.context); + this.skeletonRenderer = new SkeletonRenderer(this.context, twoColorTint); + this.skeletonDebugRenderer = new SkeletonDebugRenderer(this.context); + } + begin() { + this.camera.update(); + this.enableRenderer(this.batcher); + } + drawSkeleton(skeleton, premultipliedAlpha = false, slotRangeStart = -1, slotRangeEnd = -1) { + this.enableRenderer(this.batcher); + this.skeletonRenderer.premultipliedAlpha = premultipliedAlpha; + this.skeletonRenderer.draw(this.batcher, skeleton, slotRangeStart, slotRangeEnd); + } + drawSkeletonDebug(skeleton, premultipliedAlpha = false, ignoredBones = null) { + this.enableRenderer(this.shapes); + this.skeletonDebugRenderer.premultipliedAlpha = premultipliedAlpha; + this.skeletonDebugRenderer.draw(this.shapes, skeleton, ignoredBones); + } + drawTexture(texture, x, y, width, height, color = null) { + this.enableRenderer(this.batcher); + if (color === null) + color = WHITE; + var i = 0; + quad[i++] = x; + quad[i++] = y; + quad[i++] = color.r; + quad[i++] = color.g; + quad[i++] = color.b; + quad[i++] = color.a; + quad[i++] = 0; + quad[i++] = 1; + if (this.twoColorTint) { + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + } + quad[i++] = x + width; + quad[i++] = y; + quad[i++] = color.r; + quad[i++] = color.g; + quad[i++] = color.b; + quad[i++] = color.a; + quad[i++] = 1; + quad[i++] = 1; + if (this.twoColorTint) { + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + } + quad[i++] = x + width; + quad[i++] = y + height; + quad[i++] = color.r; + quad[i++] = color.g; + quad[i++] = color.b; + quad[i++] = color.a; + quad[i++] = 1; + quad[i++] = 0; + if (this.twoColorTint) { + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + } + quad[i++] = x; + quad[i++] = y + height; + quad[i++] = color.r; + quad[i++] = color.g; + quad[i++] = color.b; + quad[i++] = color.a; + quad[i++] = 0; + quad[i++] = 0; + if (this.twoColorTint) { + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + quad[i] = 0; + } + this.batcher.draw(texture, quad, QUAD_TRIANGLES); + } + drawTextureUV(texture, x, y, width, height, u, v, u2, v2, color = null) { + this.enableRenderer(this.batcher); + if (color === null) + color = WHITE; + var i = 0; + quad[i++] = x; + quad[i++] = y; + quad[i++] = color.r; + quad[i++] = color.g; + quad[i++] = color.b; + quad[i++] = color.a; + quad[i++] = u; + quad[i++] = v; + if (this.twoColorTint) { + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + } + quad[i++] = x + width; + quad[i++] = y; + quad[i++] = color.r; + quad[i++] = color.g; + quad[i++] = color.b; + quad[i++] = color.a; + quad[i++] = u2; + quad[i++] = v; + if (this.twoColorTint) { + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + } + quad[i++] = x + width; + quad[i++] = y + height; + quad[i++] = color.r; + quad[i++] = color.g; + quad[i++] = color.b; + quad[i++] = color.a; + quad[i++] = u2; + quad[i++] = v2; + if (this.twoColorTint) { + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + } + quad[i++] = x; + quad[i++] = y + height; + quad[i++] = color.r; + quad[i++] = color.g; + quad[i++] = color.b; + quad[i++] = color.a; + quad[i++] = u; + quad[i++] = v2; + if (this.twoColorTint) { + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + quad[i] = 0; + } + this.batcher.draw(texture, quad, QUAD_TRIANGLES); + } + drawTextureRotated(texture, x, y, width, height, pivotX, pivotY, angle, color = null) { + this.enableRenderer(this.batcher); + if (color === null) + color = WHITE; + let worldOriginX = x + pivotX; + let worldOriginY = y + pivotY; + let fx = -pivotX; + let fy = -pivotY; + let fx2 = width - pivotX; + let fy2 = height - pivotY; + let p1x = fx; + let p1y = fy; + let p2x = fx; + let p2y = fy2; + let p3x = fx2; + let p3y = fy2; + let p4x = fx2; + let p4y = fy; + let x1 = 0; + let y1 = 0; + let x2 = 0; + let y2 = 0; + let x3 = 0; + let y3 = 0; + let x4 = 0; + let y4 = 0; + if (angle != 0) { + let cos = MathUtils.cosDeg(angle); + let sin = MathUtils.sinDeg(angle); + x1 = cos * p1x - sin * p1y; + y1 = sin * p1x + cos * p1y; + x4 = cos * p2x - sin * p2y; + y4 = sin * p2x + cos * p2y; + x3 = cos * p3x - sin * p3y; + y3 = sin * p3x + cos * p3y; + x2 = x3 + (x1 - x4); + y2 = y3 + (y1 - y4); + } else { + x1 = p1x; + y1 = p1y; + x4 = p2x; + y4 = p2y; + x3 = p3x; + y3 = p3y; + x2 = p4x; + y2 = p4y; + } + x1 += worldOriginX; + y1 += worldOriginY; + x2 += worldOriginX; + y2 += worldOriginY; + x3 += worldOriginX; + y3 += worldOriginY; + x4 += worldOriginX; + y4 += worldOriginY; + var i = 0; + quad[i++] = x1; + quad[i++] = y1; + quad[i++] = color.r; + quad[i++] = color.g; + quad[i++] = color.b; + quad[i++] = color.a; + quad[i++] = 0; + quad[i++] = 1; + if (this.twoColorTint) { + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + } + quad[i++] = x2; + quad[i++] = y2; + quad[i++] = color.r; + quad[i++] = color.g; + quad[i++] = color.b; + quad[i++] = color.a; + quad[i++] = 1; + quad[i++] = 1; + if (this.twoColorTint) { + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + } + quad[i++] = x3; + quad[i++] = y3; + quad[i++] = color.r; + quad[i++] = color.g; + quad[i++] = color.b; + quad[i++] = color.a; + quad[i++] = 1; + quad[i++] = 0; + if (this.twoColorTint) { + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + } + quad[i++] = x4; + quad[i++] = y4; + quad[i++] = color.r; + quad[i++] = color.g; + quad[i++] = color.b; + quad[i++] = color.a; + quad[i++] = 0; + quad[i++] = 0; + if (this.twoColorTint) { + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + quad[i] = 0; + } + this.batcher.draw(texture, quad, QUAD_TRIANGLES); + } + drawRegion(region, x, y, width, height, color = null) { + this.enableRenderer(this.batcher); + if (color === null) + color = WHITE; + var i = 0; + quad[i++] = x; + quad[i++] = y; + quad[i++] = color.r; + quad[i++] = color.g; + quad[i++] = color.b; + quad[i++] = color.a; + quad[i++] = region.u; + quad[i++] = region.v2; + if (this.twoColorTint) { + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + } + quad[i++] = x + width; + quad[i++] = y; + quad[i++] = color.r; + quad[i++] = color.g; + quad[i++] = color.b; + quad[i++] = color.a; + quad[i++] = region.u2; + quad[i++] = region.v2; + if (this.twoColorTint) { + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + } + quad[i++] = x + width; + quad[i++] = y + height; + quad[i++] = color.r; + quad[i++] = color.g; + quad[i++] = color.b; + quad[i++] = color.a; + quad[i++] = region.u2; + quad[i++] = region.v; + if (this.twoColorTint) { + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + } + quad[i++] = x; + quad[i++] = y + height; + quad[i++] = color.r; + quad[i++] = color.g; + quad[i++] = color.b; + quad[i++] = color.a; + quad[i++] = region.u; + quad[i++] = region.v; + if (this.twoColorTint) { + quad[i++] = 0; + quad[i++] = 0; + quad[i++] = 0; + quad[i] = 0; + } + this.batcher.draw(region.page.texture, quad, QUAD_TRIANGLES); + } + line(x, y, x2, y2, color = null, color2 = null) { + this.enableRenderer(this.shapes); + this.shapes.line(x, y, x2, y2, color); + } + triangle(filled, x, y, x2, y2, x3, y3, color = null, color2 = null, color3 = null) { + this.enableRenderer(this.shapes); + this.shapes.triangle(filled, x, y, x2, y2, x3, y3, color, color2, color3); + } + quad(filled, x, y, x2, y2, x3, y3, x4, y4, color = null, color2 = null, color3 = null, color4 = null) { + this.enableRenderer(this.shapes); + this.shapes.quad(filled, x, y, x2, y2, x3, y3, x4, y4, color, color2, color3, color4); + } + rect(filled, x, y, width, height, color = null) { + this.enableRenderer(this.shapes); + this.shapes.rect(filled, x, y, width, height, color); + } + rectLine(filled, x1, y1, x2, y2, width, color = null) { + this.enableRenderer(this.shapes); + this.shapes.rectLine(filled, x1, y1, x2, y2, width, color); + } + polygon(polygonVertices, offset, count, color = null) { + this.enableRenderer(this.shapes); + this.shapes.polygon(polygonVertices, offset, count, color); + } + circle(filled, x, y, radius, color = null, segments = 0) { + this.enableRenderer(this.shapes); + this.shapes.circle(filled, x, y, radius, color, segments); + } + curve(x1, y1, cx1, cy1, cx2, cy2, x2, y2, segments, color = null) { + this.enableRenderer(this.shapes); + this.shapes.curve(x1, y1, cx1, cy1, cx2, cy2, x2, y2, segments, color); + } + end() { + if (this.activeRenderer === this.batcher) + this.batcher.end(); + else if (this.activeRenderer === this.shapes) + this.shapes.end(); + this.activeRenderer = null; + } + resize(resizeMode) { + let canvas = this.canvas; + var dpr = window.devicePixelRatio || 1; + var w = Math.round(canvas.clientWidth * dpr); + var h = Math.round(canvas.clientHeight * dpr); + if (canvas.width != w || canvas.height != h) { + canvas.width = w; + canvas.height = h; + } + this.context.gl.viewport(0, 0, canvas.width, canvas.height); + if (resizeMode === ResizeMode.Expand) + this.camera.setViewport(w, h); + else if (resizeMode === ResizeMode.Fit) { + let sourceWidth = canvas.width, sourceHeight = canvas.height; + let targetWidth = this.camera.viewportWidth, targetHeight = this.camera.viewportHeight; + let targetRatio = targetHeight / targetWidth; + let sourceRatio = sourceHeight / sourceWidth; + let scale = targetRatio < sourceRatio ? targetWidth / sourceWidth : targetHeight / sourceHeight; + this.camera.setViewport(sourceWidth * scale, sourceHeight * scale); + } + this.camera.update(); + } + enableRenderer(renderer) { + if (this.activeRenderer === renderer) + return; + this.end(); + if (renderer instanceof PolygonBatcher) { + this.batcherShader.bind(); + this.batcherShader.setUniform4x4f(Shader.MVP_MATRIX, this.camera.projectionView.values); + this.batcherShader.setUniformi("u_texture", 0); + this.batcher.begin(this.batcherShader); + this.activeRenderer = this.batcher; + } else if (renderer instanceof ShapeRenderer) { + this.shapesShader.bind(); + this.shapesShader.setUniform4x4f(Shader.MVP_MATRIX, this.camera.projectionView.values); + this.shapes.begin(this.shapesShader); + this.activeRenderer = this.shapes; + } else + this.activeRenderer = this.skeletonDebugRenderer; + } + dispose() { + this.batcher.dispose(); + this.batcherShader.dispose(); + this.shapes.dispose(); + this.shapesShader.dispose(); + this.skeletonDebugRenderer.dispose(); + } + }; + var ResizeMode; + (function(ResizeMode2) { + ResizeMode2[ResizeMode2["Stretch"] = 0] = "Stretch"; + ResizeMode2[ResizeMode2["Expand"] = 1] = "Expand"; + ResizeMode2[ResizeMode2["Fit"] = 2] = "Fit"; + })(ResizeMode || (ResizeMode = {})); + + // spine-webgl/src/LoadingScreen.ts + var spinnerImage; + var logoImage; + var loaded = 0; + var FADE_IN = 1; + var FADE_OUT = 1; + var logoWidth = 165; + var logoHeight = 108; + var spinnerSize = 163; + var LoadingScreen = class { + constructor(renderer) { + this.logo = null; + this.spinner = null; + this.angle = 0; + this.fadeOut = 0; + this.fadeIn = 0; + this.timeKeeper = new TimeKeeper(); + this.backgroundColor = new Color(0.135, 0.135, 0.135, 1); + this.tempColor = new Color(); + this.renderer = renderer; + this.timeKeeper.maxDelta = 9; + if (!logoImage) { + let isSafari = navigator.userAgent.indexOf("Safari") > -1; + let onload = () => loaded++; + logoImage = new Image(); + logoImage.src = SPINE_LOGO_DATA; + if (!isSafari) + logoImage.crossOrigin = "anonymous"; + logoImage.onload = onload; + spinnerImage = new Image(); + spinnerImage.src = SPINNER_DATA; + if (!isSafari) + spinnerImage.crossOrigin = "anonymous"; + spinnerImage.onload = onload; + } + } + draw(complete = false) { + if (loaded < 2 || complete && this.fadeOut > FADE_OUT) + return; + this.timeKeeper.update(); + let a = Math.abs(Math.sin(this.timeKeeper.totalTime + 0.25)); + this.angle -= this.timeKeeper.delta * 200 * (1 + 1.5 * Math.pow(a, 5)); + let tempColor = this.tempColor; + let renderer = this.renderer; + let canvas = renderer.canvas; + let gl = renderer.context.gl; + renderer.resize(ResizeMode.Expand); + renderer.camera.position.set(canvas.width / 2, canvas.height / 2, 0); + renderer.batcher.setBlendMode(gl.ONE, gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + if (complete) { + this.fadeOut += this.timeKeeper.delta * (this.timeKeeper.totalTime < 1 ? 2 : 1); + if (this.fadeOut > FADE_OUT) + return; + tempColor.setFromColor(this.backgroundColor); + a = 1 - this.fadeOut / FADE_OUT; + a = 1 - (a - 1) * (a - 1); + tempColor.a *= a; + if (tempColor.a > 0) { + renderer.camera.zoom = 1; + renderer.begin(); + renderer.quad(true, 0, 0, canvas.width, 0, canvas.width, canvas.height, 0, canvas.height, tempColor, tempColor, tempColor, tempColor); + renderer.end(); + } + } else { + this.fadeIn += this.timeKeeper.delta; + if (this.backgroundColor.a > 0) { + gl.clearColor(this.backgroundColor.r, this.backgroundColor.g, this.backgroundColor.b, this.backgroundColor.a); + gl.clear(gl.COLOR_BUFFER_BIT); + } + a = 1; + } + a *= Math.min(this.fadeIn / FADE_IN, 1); + tempColor.set(a, a, a, a); + if (!this.logo) { + this.logo = new GLTexture(renderer.context, logoImage); + this.spinner = new GLTexture(renderer.context, spinnerImage); + } + renderer.camera.zoom = Math.max(1, spinnerSize / canvas.height); + renderer.begin(); + renderer.drawTexture(this.logo, (canvas.width - logoWidth) / 2, (canvas.height - logoHeight) / 2, logoWidth, logoHeight, tempColor); + renderer.drawTextureRotated(this.spinner, (canvas.width - spinnerSize) / 2, (canvas.height - spinnerSize) / 2, spinnerSize, spinnerSize, spinnerSize / 2, spinnerSize / 2, this.angle, tempColor); + renderer.end(); + } + }; + var SPINNER_DATA = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKMAAACjCAYAAADmbK6AAAALKElEQVR42u2de2iW5R/GPzuqcwfnnKfNmafl5tTNHWzqNi3DEMQykcAoJSsySkspjSIk0iD/07Kf4R+FnVBDUTshZGpWUEJaaiWFgZlUFmXmIe3HNXthyebeZ77P9H13ffBG8Y8H7ut7vff93N/7fu4vGGPiFZiez/Qtw9lytJajfzfw9z/j+efPOv7cV8W+lUNY2a8T/ayTCRsWFLJA5rtUO1LLkV5p9LJeJizQiHeqnlOtmVFtdTGrrZkJCxYXsTgaI6r9MY4/UpNItW4mFDaXsTlaM6qVZlBq3UwofFrJp0HMWJ9DvXUzobCznJ1BzFjWlTLrZkJh/TDWBzFjTgo51s2EgnKI0Rrx+FiOWzNzVaym91Syx5qZsGBWb2ZFa0ZN6dbMhAWTcpkUrRmXD2K5NTNhgVbH0Zpxbl/mWjMTFvRIo0e0ZpzcncnWzISKtvmiMWNRJ4qslwmVXRXsas2Ix8ZwzFqZsGFREYtaM+Oaa1ljrUzYkJ9G/ok6TlzKjJWZVFor0y7c1Zu7WjLiqiGsskamXdHopyT4vALmzS9k/t19uHtKHlOSIMn6xAtARjIZ1sFcUSZ0Y4La+G6M18hS2IlCn4a+WoC0JNL0d/dUupdnUj40g6EJ2VEdMnhrOG/p5f/jUXz8SgmvaGU6KpNRNsLVQV0OdXf24s63h/P2gWoOrBjMCr2GJFQnnxnIM3q5P1PPmaYv+4ev4/C6UtbpV2gzXCkgL5W8Bwt48OIc6ul6Tp+s4+SyASxLiI4+PYCn1bHzDZxvaQW6vZzto7MYnQIpNkf7kp5EuozYUroqEjcNKHHd0Tl9mBPN1pk+hFeieGBnBtog7UXjsj9pWg+m6duecw2cay1OC/uxMC47KmP9OIYfoz1YoC20J/rzRG4quTZK2EAyJGs20qwUbYw0aNRmUxtvfUW/uEtNzc1NB1/X8LVyd15hh82F43AvD+VlXcsSJEZa1CQ3ejleAO7oxR3RDP0XN91X4+NXYb8nkv7UNTwV7e0YTdu7I3g33t7tuaEbNwSZpps2fSyvs4M2Tjhot+jb0Xzbltj8r5j/xVt/6Z1Ob93U1ZYO691EhhzchcHeXosVjcNZysyezLw4xRZt05R+fTeuj8vOj+zKyG0j2aZcVVs6v+QalnjrMFZASQYl2nBoSyz06e3j/Xk8rgWYmMvEICu2pm1HOTuc7okV8FgRj0XukwzanhvCc/F+72TjoQjdObN1OFuDLmh0xP+WHtxiI10ukJlCprb4guiv1fP+avZrS1C7NAkliHZjDtZwMMgqbukAltpMlwuMy2FcEBPqvfLLar5Uqi0hBdEwryy+Mv5n6zkbjTBa+dlMlwvUZFETZKGiFM7tvbhdJ3gSVRO0wzIjnxmvl/J6a6JsGMYGrahtpssFeqbR841S3mhN80OjOaSDEdqd6SjaMKgzgzRK7q1ib3PT9sYyNo7JZoyNFNvRcVMZmy7WOvIuryv/Zvdmdt90+nY0bRp3AvROohFwdwW7dTG7RFlbwlqdrbOBYg005NAQmZU0HWt1rXMBH1Xw0dQ8pmqzoaPmdhun7bHZjNVe9qP9eFQfO1VkUmHjhAVUZ1GtnKFSbjrkrPfy4i4UW5t/6ZxM54J0CqxFe81KpGsQyE4h23oYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjLna+bdOy+IiFquIpGq16Pb79cNYv3IIK/X/ugx+Ui6TVKvYVU9Nc8gX8od8Ir/IN/KPfCQ/yVfyl/6/pfJvLChkQdD6wyqntquCXYuKWJSfRr6D0dEAxV3xlw/khyD+kd/ku/88cHo+09tS3LBpO1HHCVUqcIA6CqB4K+6X6x35L/JM2loXurlWmUmlA5XogOIcK8/If5HncrSWo7F6cKIWPjT/RXGOlWfkv8hzaWsN4uaaysE6WIkOKM6x8oz8F3kusXqo2vxC5jtYiQ4ozrH0TeS5qIZcrB7qkrwdA8U5Vp6R/yLPZV8V+2L14Cl5THGwEh1QnGPlGfkv8lyUlIzFQ1cNYVVHrcjZ0VCcFe9Y+Eb+izy3ceclUl43aFN52DXXssYpnY6a4qFS8ZcP2uIf+e7inRh6pdFrdTGrm8uiHx/L8T2V7NGWzvJBLJ/bl7mTuzO5qBNFDoiJID/IF/KHfCK/yDfyT3O7d/KbfNfS80hNIrU0g9L6HOq1x5iTQo6FNpeLfCQ/yVfyl3xmXYwxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHNk9z4JwJ0SqKTdQkbyEwhU393T6V7zzR6pieR3tE1ITeVXImhe6BXDGZFdRbVeank2TBhcaEMr0rwbixj49IBLL2/L/ffmMuNHfqO9tFZjJYBd1ewO3Lx+IcVfKhqna5nHZYR6XFPH+5R3eeI5t9fx/fvjeC9Jdew5OKZKqFR/RDVKL6vL/f9PJafmyvHsL+a/ff24V6NmjZQbGchVbY6UM2BluqHv1rCqzVZ1KQlkZboepCdQvacPsz5bjTfXao+yMEaDt7Wk9tSIMVGig3TejCtJSM2bSpkPjWPqd1S6Zao+lORSYWmgkOjORRNwZqd5ezMSiHLRooNr5XwWjS6/1XHX9vL2T67N7M1iyXa9JCrYjVrS1gbpJyw6hBfsmiNCYT0P9/A+Wj1/6qGr5YNYFlJBiWJogEzezLz/ZG8/9s4fgtSyuvNYbyp1IONFBtu7sHNv4/j9yAxUHWrdaWsG9+N8XHd+YxkMpSy+aySz841cC5oXbmHCnnI74yxAgZ3YbDeB4PEQCOpBpFNZWwa2ZWRcdnxLsl00crtRB0n2lLg8JNRfDKoM4NsolgBSmw/UMADba1+qpmqfyf6x1u/0a/og3I+aEunP6/i86osqmygcGarF4p54dex/Bo0LqfqOfVwIQ/HW5/RSkwV1oN2WLlHTc82TljAwM4M1O5LWwYKZTjibYXNS0N5KcjKTe10PadfLObFuJwK4ozp+UzXDBTUjL+M5ZcBnRkQV53dMIwNQTu6bSTbVEzbi5awuVByd2E/FgaN0Tc1fKOzBHHV2aAdVSdv6s5NNkp7cSH/++xAng2yyHx+CM/H21YhfdPp+0U1X0TbSZnXx8faG9Aop0MS0cToh1p+iLcpOkLj9t/JOk5eqoPHxnDsyf486an5yqCDK7XZ1O4oZ4dWyy3FSXHUAYq47uyYbMZoGmhpG3DlEFb6uNiVBhpyaHhnBO8oJmfqOROJjzIiP43hJ8UxITqqX56S2Hur2KsOnq3nrE6PPNKPRwrSKbAZrjTQNZmuE7oxYXMZmxWbw9dxWFu4W4ezVedOE6qzI7oyYkY+M7TPeWsPbk2UX1qioSN+E3OZqOR2cReKE+qQRFN0Pi7y73g/UawU1KzezJpXwLz5hczX1ueUPKYkNb6GJQZ+j7/aAfRZREsv+quGsMoamXZBW2Gt5eU0alorEzYsKmJRa/m4NdeyxlqZsCGa84DKnVorEzboC7podis69DfIJmwufHMc7famvvmxZiYsKOtKWbRm1OcW1syEBboSJFozLh/EcmtmwgIluaM14/phrLdmJixYXMTiaM24p5I91syEBTphFOR7Y2tmwgJNvUFOr+tov3UzoaAv44KYUatv62ZCoemdhtG0+hzqrZsJBR08DWLG0gxKrZu50qvpxos3U5NItW4mFPp1ot+lPlpq2lYXs9qamVBZUMiC1ox4pJYjvlfStAu6GmTLcLboMtPIV4/6im5fFfuUi9QIap2MiWP+D96R1vPmsD/fAAAAAElFTkSuQmCC"; + var SPINE_LOGO_DATA = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKUAAABsCAYAAAALzHKmAAAQ7klEQVR42u3da4xdVRUA4D0zd2Y6nZY59DVtZ1puS9+lzC0YAi2UQ8AAQczFpPgA9VIeIQbirRqJ0cBUBVGjDr/QCKSNRSMmpuODxAdxqhgwxkhFjf6Sxh/+UUNVNGJCzR7uTvas7LXX2q9zzp3em6y0gTN3Zu75utZe5+yztxC9V+/Ve5X9En1Vjd7J6SFbLNF7naPw+l2jh7YHMBWssqMHtlsRdim4qsLtIawaPiHEQOLoNrA9iIkQDnRrVA1qD2LZ8ISoxYqKo13sQAtBWBayQWZUAXGRQM9JjCngDVY0UqJNDbQrMcaGmArdUKpIjbYiQLsCZCyIMQBy8QwnilR4Q5AuCpxFYvRFmBLbEiwKwpsSaWycVQGZBKMrwBjA9BhxDe57u2L2hOoKNCbOrgAZitEVYUxoKSMErQvSxYIzCkguRg5EF4AUhqUlhy/YUKSxcRaKsioYOQhD4I0yYxkR3PcJBcuFysmgsXAWBTMJyBCMIQh9kGGxXIXvexCQXbHGAMrBWTbM2CCpMSMLIxehC77lSJwXGth7M0FzoVJIXXDWQnGmhOkL0ic7YhhtWdGGkAuPAjUWGoF4faCmwBkbZmyUqUCyMqMLRA4+E6IsdTjidUHKBYrh9CnpRcH0ypKxsyOGEYNIIeTCOz91OIJ1QYoB5eAMyZo+MFNnyVTZ0YiRC9EGEMOyAgshxErHsL2XK1gOUgwohtM1a5YNM7Rsu4K0ZkcbRm4mpPBRwFZ5hg9eCqkrUB+csWGGogzNkqEgrdnRhpGLkINudaLgwvVB6oqzCjCTZElb2Y4B0gUjBtEG0ARnDRLjjoG9DwcshtQGlIPTljVjwUySLWNkyRCQVHa0ZUUTRAwgF91a33BEy0VKAcVwwqwZC2bqbOlUurllOxQkJzNyINoAYqjWhYYjWg5SCiiG05Q1U8FMjTIoS8YE6YORi1BHtJ4KIcQEEtTXUWAxpK44YVlPBdO1jCdFWTZIE8bVGEYMIRPcZGBw4HKQcoBiOE1ZMzbMgVQwU6JMAdKEEcuIJogUvg1YCCE2gsCO42DlIIVAKZwpYJaSLVNnSU6XjYHUmxhTmXaFaMO3EYkLqMC+FsLlIoVAKZzMrEnBhJeLfLNlKMrYWRIDCbOkFSSVHbHM6AKRC6/ODUewNqQ+OLlZkxpjUmV8MBbMUJSxyzY3Q1IgTRgxiBRCHdem0KDAUkBh9sRwwjEnAXMMgTnKhFlUtiwkS5rGka4g9SaGgxFmRC7AzTCEEBcyA36dDSsXqAtOLkysjGMwY5XxVChjZ0kuSCo7YlkRQsQQYtDEFsegsLoCxUp7Kpgps2UslFGzJGccSYHUmxhOZqwzEZqAbfUMCisHKIZzgsCpl3MTzMwTpi1bYp2477gyFKUxS7qWbdjY2EBS2dGE0QQRA7gNCyHEdhjE8RhUDlBT9tzgmjWZMFNlSy+Urk1OzCyJlW0XkK4YOQh1cDtcgwBrQmoDWkdgboBZE8mYsJSHlnFbJ+5bwmOPJ7lZkirbC8aRsMvmgtTHjBhGE0QbwJ2egUE1ITVlUC5OmDVdYNrKuN70xM6WoShjlW4464dbtiFIWK6x7GjESEHUUe0iYncnbMdQSE0Z1ITTNOb0hRmjjLtmS9dmJ2rp1jtuKktyyrb6YLEMCUHq2dGG0QQRQ7f72kzc+cJecerne8Wvv7JNPHPvenEkz8Sh3UtFc92QyGt9Yko/HgOLAIUZlItTz5ouMF3KuE+2jFLCQ1D6lm6fLMkBacuOJowYRBUXyfjuHjF3NhdnsfjvAfH6E9vFt9XxKgikEKgJZyyYalzOLeMu2bLbULI6bh+QGwmQ+rgRlumdGEQAao+K56bEL2woVUwOiev0r8OAUjiJrMmFCbvykGxZRAmPitK1dHM7bohyMsuyi/I8f0+e57fJYIKEZXpXo9E4mOf5XTKyLLvCBLETF8uY2SKepkC+dpX4T02Ivepr4HvZcOZ5fmee54fyPL+DmTUhzAs6n4n8bN5dr9f3YdkSg8nsxG0lPBVKVpNjG0/aGhzfLDmRZdnumZmZp8+c+cdZPV555fSr7Xb7s0jJ3i5Pcue4MxKkPPkvvXTqz/B92u32l0wYOzG1fkhcd/py8Rcbyq/vFM/KY1WA95h/3zzP71bfU6JsNpsfgj+P/FlbrdaDGExYyuXvLz8H+DudODH700ajcSM3W6Yu4alQ1spCOTd38jcKocTZbh9+9NixY99XJ8AEUkcpo9W64yH197m5k7+bnZ19QT+J09NHntQhwji/Jg58qi6++ofLxJ8gSFneVw2Ka4QQDfh1Ok4dZavVmtZ/nrm5k7/Vf55O1tRhboUw5+ZOvqyOl5+R/FyOHj32PYVU/tloNG5IXcKrhJIzngwp3fNjomazea/64BuNxts646f50lWv169utw9/DmtqdJQyZFaSJVuV6nq9fqMEof5/vV6/CYBqgJDlee+yAbF/+4i4ZWqZeNfaIfHWzn+Hx0KcEuU9+s8jv3ej0bhVlXOZydX/k0iRMeb8P0D5e6tj8zy/Xb9UJIc56h/yqVOnXul8lmuZ2bJslKmbHG7XrbpCmCXFRLvdfqQD6jTS3Jiy5I4OykM6ADV+1Eu1DmV6evopBORexzDi1L+X/HnGxsb2w3Hm9PSRJ9QxWPOTZdmlKht2hi+w6dkox5bqffI8fye3hDteGqKaHVsHXihKl0tB+h0cY+lute54AGRKDCW89LNTRynHb7ChUWVVjetOnJh9EYBUyPZeNCoOtsbFQwdXi4/esELcd+tq8cCHJ8UXp+viy9efLz7AgamjlKXc1AA1m83DoIRDlFubzeb96hhZLVTlgJ24gttutx+ONa50bHZKRenaeTs1OfpAfnr6yOOdE7EZdNwmlKocntXLNkA5JTGq47Ds+Lf94lWsyfnXleLfnIwJUN4DOnNYwuUxh2A3Ln9XULrfK8t3J27Tu3BVwiOjXJqoAy8UZej1yclGo3GTLN+gu3w+z/P3YaWbQqk3Ne12e4ZC+c8rxWsYytcPiP9RpZxCqWDKnxOiBNlyAUpOnGsoh4tA2Rm8X9xqtT6md5wyZmYe+0YRKL+1S/wYQ3n8zctBl5SBUv5djivfjMOPduIzcizeiYfr9foVvUwZG+XCuzibZKnSceZ5/v4QlKp8y7ElhnJlTeTP7BI/kllRYfzrfvHqFy4UX1vaL/aVlSmROzwbwdS29T2UcEwZF+V8ozM2lu1VY812u/15akypGh3TmFJesJbHHD167IdUxz3YJy5bNySuX1mbvy55CbMLtzU6tjGlsdFptVqfUMc0Go23F4wy1l2dSnbfvpMwVPe9WWVLDsrOJaF9MFu2Wq1PqmNkGce67xiXhTjdNwdlvV6/BgxfbPfBfVCetxi6b9/rlCup65QzM48dl2OjLMv26CibzeZ96sTIzEFdpwQXz9U1yrtVlpR/Zll2Fec65Y6l4pbbx8XHH9kknvzJlPjlHy8Tp29eKT5ou0aJoIT3w3dBlLDzVpfAJEZ1XOdaJZxnOSlvPMjPzxFljIvng914RwebsjYO7uhMyHu46sOfnf3Oz2TXDW6vvYxdFoIXz3Wc8J5zs9n8iOn2IrxTc2BM3Glqdp7dI553uaOjxrhwcob+MyuUpjs6WZZdon8OcigjPx8V+u+GTWFTSWEx3WYcdJ225jNDSE4q0GHCzlueHOyujn6bUWYgeb9ZZUaQPe+GzQ+Gc8+oOGhC+c1d4gfI16n3XDAhQ7+9qE9l01E2Go132GYKyXE1NiFDTcpoNpv3LOYJGWXNErJNW9sEp63p2RKiVPMn1bS1DgxsyhoGdGpmizj+xtXiDYnx7/vFmce3iWdW1cTVGEY4hQ2ZW0nNq8Qm/M6XbXm3S100lwGedFybuvNOibLI+ZS2ceU4eAxiEuvCkfmU8ycToDxETe6FgCBQHeqyAbFvfEhcO7BwDuXFCEbTZF840XeHK0jYcbs2OIGle0mVJ/mmnClEPQqxyTY5I8/zFhif7fSZee4bnrPOU4AssnRXHaVTCTd14dRDY3UbTIiSeFhsN/aMjgnqthFx880rxX3yATL5p3y4LPXzOaBkUyBjZMlYpbtQlIOBD475ZEusjMNSvkXe6VEoJVDkeZ2dzIfIFsRzU+JF2OyM9M9fTC/6SUYOyFQPjQ2nWiUjxnPfw5EeHqMWIqAeIFsAU847lJM2JM6xsewt1OIDLs99P7ZFHNdB/upS8XtPiD7PfLuCXJNolYyyFiNI/Zit65ItrOVafFbHcFohY7hPTN21Tjz4uc3iqfsnxKdX1MTl1OoYRFaMsToGB6Trw2JFP/OdZC2hJZ7ZkrMoAbbSGmelDJ91hFKuJeS7jlBMkJnrAqqJlgMUZS/dArPlGHNdSg5M3xXXtvquuEatvIYtDRhpxbUJuIgqsU5lGWtUploK0KuEU9mSW8YpmFQ556xNuYW7NiW13B+FkMiKHIy+C6eGgBxJvMR0oSv5hi6+z4HJyZoU0M2RVvDlrOQbcxVfX5AhZbuqy0v7ZstYMLHlAVlLTF9ALLbvu9Y5Zylpn/XOsd0ibIvxr2KCLHpp6SCUIdnSZSF+WzfOhem6GD+1KwR3Z4jNjrtDpNoZwmWd8yrupZN6Hx3fbMmFSe0Swdq2ZIPjxk1112Duo8OBGLrBkw/IoncdK2XHsdC9dHz204m50xh3tzFq1zFqtzHXrfCw7OgDsqyNnZLszVijsmXgrmNcmGtS78lIoMX2aJz03fKO2sDJddPQSCDPiQ1DfWBycY6XtXstc2PQKuxgG2McmXTPb9/9vmuJYXKyJrWjbeg+3xPM4O73nWqvbyw7xgZZSJbEUBa157cNJjdr2vb+5iA1YV3HxYscj30PDCEHIgcjtfm8K8hSsmRotkwFk5s1TTghUAopB6xrjHMBBkI0YYTZ0dZlxwLpkiWDULpmy5gwqayZgZNkA7oKQQCxctByYg0XIIEQQuRitGVHblMTA2ShKGPDpC6wu+DEgJqg2rDGDBtAF4Q6RAojp1xXGmSMbImVcR+YWNY04eQCtUG1ofUJ2/uvcETIgUhhdAE5GAlkKShjwHTNmhhODKgJqQ2sC14uOgyfD0IbRF+MlQaZAiZWyn2yJsTJATqGnHQO2Jhh+xlsACFCG0QbRtdyzQFZCZSxYPpmTS7Q5cjJHYNBYIkZpu99HoUQ/o4QIYSIZUZfjJ4ZMjZI32wZBDMU5yhy8pZTULl4XYP5fagMyEVoy4oupTpGduwnkloSlKEwY+AcQU4MhRTD6ovXBRwFzwWgCSEF0QVjJUGmgEllTS5OLlCIlIN1mS9mx/cZ5eLDALpCTI2RAhkTZQqYoTgpoCPECbaBHQ2ETL3PUl98ECAXYijG0OyYAmQoTG7W5ODkAF1CnVgm2JQx4okPA+gCMTbGskBGgRmaOblAh5GTORIrfKFx4VH4EIAxIXIxlg2SBbMvECY3e7oApbDaIgQu5/2HmeEKEINYiwSRi7EQkLFgumZOCuggctKGI4ULZN/vMeSLj0AYMytWEqMLzFg4fYDaoKaC6wvOFR4FkIPQFaILxrJAOsHsc/zlfYDWXE8qF22s8Pz5KHxcgEVALBtjJXBSSEOwFhk1Zgy4hitCT4hVw+gFs8/zwxqIBbUgyK7fcyA0PD9XX4iVxhiC0xdof6STWCsoBmKF7+cVCWFXQYyBMxRpf+STX1b0x45AhN0OMSrOGEirhrY/dfQAdjvS7oy+WCF6r1RIFxXWvlTRg1YVqFWBmxZbD99ig9pt0YPQw9rD1nstVri9V+/Ve3XrS/wfim4P5fIFxLoAAAAASUVORK5CYII="; + + // spine-webgl/src/SpineCanvas.ts + var SpineCanvas = class { + constructor(canvas, config) { + this.time = new TimeKeeper(); + if (config.pathPrefix === void 0) + config.pathPrefix = ""; + if (config.app === void 0) + config.app = { + loadAssets: () => { + }, + initialize: () => { + }, + update: () => { + }, + render: () => { + }, + error: () => { + } + }; + if (config.webglConfig === void 0) + config.webglConfig = { alpha: true }; + this.htmlCanvas = canvas; + this.context = new ManagedWebGLRenderingContext(canvas, config.webglConfig); + this.renderer = new SceneRenderer(canvas, this.context); + this.gl = this.context.gl; + this.assetManager = new AssetManager(this.context, config.pathPrefix); + this.input = new Input(canvas); + config.app.loadAssets(this); + let loop = () => { + requestAnimationFrame(loop); + this.time.update(); + config.app.update(this, this.time.delta); + config.app.render(this); + }; + let waitForAssets = () => { + if (this.assetManager.isLoadingComplete()) { + if (this.assetManager.hasErrors()) { + config.app.error(this, this.assetManager.getErrors()); + } else { + config.app.initialize(this); + loop(); + } + return; + } + requestAnimationFrame(waitForAssets); + }; + requestAnimationFrame(waitForAssets); + } + clear(r, g, b, a) { + this.gl.clearColor(r, g, b, a); + this.gl.clear(this.gl.COLOR_BUFFER_BIT); + } + }; + return src_exports; +})(); + +if (!globalThis.spine) globalThis.spine = spine diff --git a/src/plugin.js b/src/plugin.js index 580726f..b74b977 100755 --- a/src/plugin.js +++ b/src/plugin.js @@ -3,7 +3,7 @@ const C3 = self.C3; const PLUGIN_ID = "Gritsenko_Spine"; - const PLUGIN_VERSION = "1.55.1"; + const PLUGIN_VERSION = "2.0.0"; const PLUGIN_CATEGORY = "general"; const PLUGIN_CLASS = SDK.Plugins.Gritsenko_Spine = class SpinePlugin extends SDK.IPluginBase { From 1c8e53f5b7f6e2bede261d5c48faf277cf6a4f97 Mon Sep 17 00:00:00 2001 From: MikalDev Date: Mon, 17 Jan 2022 21:24:10 -0800 Subject: [PATCH 2/2] fix (bbox) fix bboxXCenter expression --- README.md | 8 +++++--- dist/Spine-v2.0.1.c3addon | Bin 0 -> 224136 bytes src/addon.json | 2 +- src/c3runtime/expressions.js | 4 ++-- src/c3runtime/instance.js | 3 ++- src/c3runtime/spine-draw.js | 2 +- src/plugin.js | 2 +- 7 files changed, 12 insertions(+), 9 deletions(-) create mode 100644 dist/Spine-v2.0.1.c3addon diff --git a/README.md b/README.md index f95c5de..756fb0c 100644 --- a/README.md +++ b/README.md @@ -81,14 +81,14 @@ Add-on based on **Mikal's** sample from this [thread](https://www.construct.net/ [Previous Add-on Releases](https://github.com/gritsenko/c3_spine_plugin/releases) ### Spine 4.0.x compatible Addon (alpha version) -#### New beta version plug-in with Spine 4.0 - there may be bugs, only suggested for experienced plug-in / Spine users. No 4.0 example projects yet. +#### New beta version plug-in with Spine 4.0 - there may be bugs, only suggested for experienced plug-in / Spine users. Example project in release 2.0.0. 2.x versions of the addon will support Spine 4.x -[Beta Add-on, Release 2.0.0](https://github.com/gritsenko/c3_spine_plugin/releases/download/2.0.0/Spine-v2.0.0.c3addon) +[Beta Add-on, Release 2.0.1](https://github.com/gritsenko/c3_spine_plugin/releases/download/2.0.1/Spine-v2.0.1.c3addon) #### Please support development of the C3 Spine plugin for Spine 4.x [![paypal](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=T8VV6CJVP3X3S) #### Please report beta issues to: [Issues](https://github.com/gritsenko/c3_spine_plugin/issues) -### Note sample projects are still Spine 3.8.x +### Note sample projects are still Spine 3.8.x, they are not plug-in 2.x.x / Spine 4.0.x compatiable [Sample project](https://github.com/gritsenko/c3_spine_plugin/releases/download/1.5.0/SpinePluginTest.c3p) [MixAndMatch project](https://github.com/gritsenko/c3_spine_plugin/releases/download/1.13.0/SpineMixandMatch.c3p) @@ -143,6 +143,8 @@ Useful for Dragon Bones Spine JSON export and earlier Spine versions. - Preview Spine render in editor (dependent on C3 editor SDK updates) ## Release notes +- 2.0.1 Fix SpineBBoxCenterX to accept slot and name (previously was ignoring slot) +- 2.0.0 4.0 spine-ts runtime, compatible with Spine 4.0.x export files - 1.55.1 Fix addCustomSkinOutfit update slot colors for dependent colors - 1.55.0 Add addCustomSkinOutfit skin tone - 1.54.0 Add addCustomSkinOutfit skin, color diff --git a/dist/Spine-v2.0.1.c3addon b/dist/Spine-v2.0.1.c3addon new file mode 100644 index 0000000000000000000000000000000000000000..1356c77c27a6e89eabb194684e1622cb904b4e40 GIT binary patch literal 224136 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%0AVH%1PD}f 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× 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%0DXJYqg zs02F9w44cCzE=!Pf%zgMIvd?ftO~kqN0>46bv!9h9vG`Bu(R%Zjkc~#NKB-0229P3 zv9d)`hY0QYa3iC4Pp3$M`A1oW_e^l=UxH!SC%`Ar<~{>rmVJk~G^8-~cUWFGZ_35ZxXa1ILcC)43FGcmlIo=g^A|>7OECyr z%an#w#8Je#Csozvap&Ym;1WDq^xAHsXU@H9n=pti=GZ>WpRFBp7!V^%3g*AQ8>Ao1 zVFYe$U(zZE2t#OogCsre?D)i@o2^!D_Fj6WGfg1aH5s;nknk$J7Cmjr(z)hf$BT{O zc=~JTg~9bHf>@O^;`~bx1VR0GaB2_TgS2DOA#GF4dThZS=I`H4(ARa_cI)@i@;TS^ zcwSNDFFC@W_E0rkH0z2C{7s@$PYsKn0!22LSXvNt4n(tvUH(K?@;@>D`DZmDpss`% zmWx=@OSjn&`0FA=d%$8$9yG4@oCSJ=IVkI3WM;me+=&(Xc;GvB@@-qLucj4Mbnq%A zEIgTxA)%)bwff>LdyZra_U|Ym2#pl6EvI2_2kF*SE7JMNQ#xYe68^+!wT~ZG^vRr2 zFQHR;^-$(?WSd|oIw^CoqiFJE0NQbzW&{-@y5^UWSeL(Jcmgfx(k@i- z{hc-%GN8K03ca>^H}ky$Ud@3HAdp$Xf5o;sq{_CnU%#`bF`CJMuyM=JF}Yo}=7@8+ z#86;me56__Q3drj*iuL;A∓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�@WUFQj z=wf|jTwIpTgg#7Sa0R-F`}`d>vO<+;XeuC4OhPoBn4z7Kf{kg9eZ>(dN@sXCfp*+t z$Xvs7GX>T~f|sCnrmN?h4M!Jh*K9UzYZ}C#jZCDeBw>{>bz<7=XY&yYJy2Id5gMfm zJR=eA2*LQ&v6QgPbVYsT`}Anj@2{C9-69_C@vl}#1IPdng9iW@h?%7)_HI@-j(<+S zPN}RzW)R!oCa1b}2OZ~yh!!^3(BBfN<}s)}#J-mj0<|)N9&wjex2Zn7RSjdT%2!Ov z+o}(`{BES|J0E8fX$#Ss6b?O?dTi_!0x~PLtT-)GzY?YO?AE-ilBT<=ZsuPAIo@i_ zF!7ve`98TPCgx!fb~u-&k8H-AMc;kPb9%dNw63M__+n{nza#R%<#zt8XQP9}*_CrP z_AToHf?ANrbQs+&xwr2+Ik|Z6sn(kziN6r$f1c=ZC#)?JB`zg?x@g^z`KgI8*ifFN z;^mx#af(MW3z4s2~eqmpSBLr2Ag}rRu+tw^o!8bjWz53`uw4|W3^EFJT z4>tuPD^=0rZoso_;R_14XIw-=XB1Zso>;1-sg;n8$KTDA(JZIs zsBt6P^LpE(U@Ia#oR7rcSE!+EYv(vYWM((@DA=}Dez}#qwj?Jc?oew$ZTRU62Act~ z$@d9r|lX}kx`bF?0__B7W#-)`!zB{VxKbT+z(j5*58yyV&SL< z_hGcV7@R%w?1b-7S)wgnmGYe}7Z|-)rs=_n4jKga=_!7OkjmmnMem^{mVmlbxAQBvlE+#x=+xiX_f;E!t$MVB~1H zMbz(CrsMgzbzR=W1t5GelMDBb<3ya<1Gf3-#sSwPGs+dt-c31Y5+qknP_%Le@)IK&Kt-J`1un8wQ&8<+&T(?y!1Kz?=|oyP8(536^v0nK0q8Fgeaz% zH*mWF^N21*eA8TPnS5=ZCd^{gC0HFSjzC~~|TGuBwjusqdPKX`U$r0w_WdCO)%tO!q zO=A3@0ZoyC!KX6_iPca5fZ(@Aj1ZChCCUF!TZA&)SsnkhR{lza)Le5dcY2N@cZ3Fm zA^<@28`h8bCKdvP-Bg9(b@0Ch%!$za=+a1qjvfG(Iso9#Z)6$To8;eIPejn6|6TC5 z(;?XcL}KYt0sz@>=xW)U=syI10yT3`sW1=nOAdAL!`1T7NQ*d#xGa< zC*R7R0}6p!|6d!Z%Vg8`wOLYsEd>H(9ncY#=4L)VeE81>JS@x*ZQSP&`ZHbnH9q~D z`cQ=WcKN2ZrHJcF&jA34Z(;xHONi`2ba3Sa(2aEYLn3n*h{vDst$)}5XZMsWb>rZt z0Rh^%s0j2;xI*SX;lINFlm1^i>!VO}&GUfGzBdT<9dQ31`baC%jnEN&$lT_)tdt3q z`nP-^OIOw02%B^1M(9w65aaf5p?7uMgx?qnB64P0f$87CQ_qdGHZ^uUt3v=_0{+w9 zzp2SoClX+T2$s{;-Rf6KkrDF#x6Aj>r2#i-LrTcMFBCw8_j94Z-$to7E9yTz*gt@O zRMcu!GU(nqEH525U19JrK u=fM15a6k3?{bv3bE-%0Uiu~8D{eROA1#z$VS+(u}9Eh4OXO755;Qs-7#d(MT literal 0 HcmV?d00001 diff --git a/src/addon.json b/src/addon.json index dd0d064..47100c0 100755 --- a/src/addon.json +++ b/src/addon.json @@ -3,7 +3,7 @@ "type": "plugin", "name": "Spine", "id": "Gritsenko_Spine", - "version": "2.0.0", + "version": "2.0.1", "author": "Mikal and Igor Gritsenko", "website": "https://gritsenko.github.io/c3_spine_plugin", "documentation": "https://gritsenko.github.io/c3_spine_plugin", diff --git a/src/c3runtime/expressions.js b/src/c3runtime/expressions.js index 3939e94..e701074 100644 --- a/src/c3runtime/expressions.js +++ b/src/c3runtime/expressions.js @@ -116,11 +116,11 @@ return track.alpha; }, - SpineBBoxCenterX(name){ + SpineBBoxCenterX(slot, name){ if (!this.isLoaded) return 0; - let bBox = this.skeletonInfo.skeleton.getAttachmentByName(name,name); + let bBox = this.skeletonInfo.skeleton.getAttachmentByName(slot,name); if (!bBox) return 0; let points = this.skeletonInfo.skeletonBounds.getPolygon(bBox); diff --git a/src/c3runtime/instance.js b/src/c3runtime/instance.js index 1e9963f..6ebc1a4 100644 --- a/src/c3runtime/instance.js +++ b/src/c3runtime/instance.js @@ -4,6 +4,7 @@ // @ts-ignore const C3 = self.C3; const spineBatcher = globalThis.spineBatcher; + const spine = globalThis.spine C3.Plugins.Gritsenko_Spine.Instance = class SpineInstance extends C3.SDKWorldInstanceBase { @@ -511,7 +512,7 @@ } async IsSpineReady() { - spine = globalThis.spine + // spine = globalThis.spine if (this.sdkType._initFailed) return false; // Guard for case where sdkType does not exist (deleted on release) diff --git a/src/c3runtime/spine-draw.js b/src/c3runtime/spine-draw.js index 81a85c6..f236cc9 100644 --- a/src/c3runtime/spine-draw.js +++ b/src/c3runtime/spine-draw.js @@ -347,7 +347,7 @@ class SpineBatch { // @ts-ignore if (!globalThis.spineBatcher) { - console.log('[Spine] SpineBatcher init, 2.0.0, Spine 4.0.x compatible'); + console.log('[Spine] SpineBatcher init, 2.0.1, Spine 4.0.x compatible'); // @ts-ignore globalThis.spineBatcher = new SpineBatch(); } \ No newline at end of file diff --git a/src/plugin.js b/src/plugin.js index b74b977..aedf6a6 100755 --- a/src/plugin.js +++ b/src/plugin.js @@ -3,7 +3,7 @@ const C3 = self.C3; const PLUGIN_ID = "Gritsenko_Spine"; - const PLUGIN_VERSION = "2.0.0"; + const PLUGIN_VERSION = "2.0.1"; const PLUGIN_CATEGORY = "general"; const PLUGIN_CLASS = SDK.Plugins.Gritsenko_Spine = class SpinePlugin extends SDK.IPluginBase {